Skip to content

Commit 231c667

Browse files
committed
👷 增加单元测试流程
1 parent f998e8a commit 231c667

14 files changed

Lines changed: 89 additions & 96 deletions

File tree

.github/workflows/build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
mkdir dist
3535
echo "$CHROME_PEM" > ./dist/scriptcat.pem
3636
chmod 600 ./dist/scriptcat.pem
37-
pnpm i
37+
pnpm i --frozen-lockfile
3838
pnpm run pack
3939
4040
- name: Archive production artifacts

.github/workflows/packageRelease.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ jobs:
2727
mkdir dist
2828
echo "$CHROME_PEM" > ./dist/scriptcat.pem
2929
chmod 600 ./dist/scriptcat.pem
30-
pnpm i
30+
pnpm i --frozen-lockfile
31+
pnpm test
3132
pnpm run pack
3233
3334
- uses: ncipollo/release-action@v1

.github/workflows/test.yaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ name: test
33
on:
44
push:
55
branches:
6-
- disable # 暂时禁用
7-
# pull_request:
6+
- main
7+
- release/*
8+
- dev
9+
- develop/*
10+
pull_request:
811

912
jobs:
1013
tests:
@@ -22,7 +25,8 @@ jobs:
2225

2326
- name: Unit Test
2427
run: |
25-
pnpm i
28+
pnpm i --frozen-lockfile
29+
pnpm test
2630
pnpm run coverage
2731
2832
- name: Upload coverage reports to Codecov with GitHub Action

packages/chrome-extension-mock/cookies.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
export default class Cookies {
2-
getAllCookieStores(
3-
callback: (cookieStores: chrome.cookies.CookieStore[]) => void
4-
) {
2+
getAllCookieStores(callback: (cookieStores: chrome.cookies.CookieStore[]) => void) {
53
callback([
64
{
75
id: "0",
@@ -18,15 +16,16 @@ export default class Cookies {
1816
getAll(
1917
details: chrome.cookies.GetAllDetails,
2018
callback: (cookies: chrome.cookies.Cookie[]) => void
21-
): void {
19+
): Promise<chrome.cookies.Cookie[]> {
2220
this.mockGetAll?.(details, callback);
21+
return Promise.resolve([]);
2322
}
2423

2524
set(details: chrome.cookies.SetDetails, callback?: () => void): void {
2625
callback?.();
2726
}
2827

29-
remove(details: chrome.cookies.Details, callback?: () => void): void {
28+
remove(details: chrome.cookies.CookieDetails, callback?: () => void): void {
3029
callback?.();
3130
}
3231
}

packages/chrome-extension-mock/i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ export default class I18n {
44
}
55

66
getAcceptLanguages(callback: (lngs: string[]) => void) {
7-
callback(["zh-CN"]);
7+
// callback(["zh-CN"]);
88
}
99
}

src/app/logger/core.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,17 @@ export default class LoggerCore {
3737

3838
labels: LogLabel;
3939

40-
constructor(config: { level?: LogLevel; writer: Writer; labels: LogLabel }) {
40+
constructor(config: { level?: LogLevel; consoleLevel?: LogLevel; writer: Writer; labels: LogLabel }) {
4141
this.writer = config.writer;
4242
this.level = config.level || this.level;
4343
this.labels = config.labels || {};
4444
// 获取日志debug等级, 如果是开发环境, 则默认为debug
45-
if (process.env.NODE_ENV === "development") {
46-
this.consoleLevel = "debug";
45+
if (config.consoleLevel !== undefined) {
46+
this.consoleLevel = config.consoleLevel;
47+
} else {
48+
if (process.env.NODE_ENV === "development") {
49+
this.consoleLevel = "debug";
50+
}
4751
}
4852
if (!LoggerCore.instance) {
4953
LoggerCore.instance = this;

src/app/repo/repo.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function loadCache(): Promise<any> {
1212
return loadCachePromise;
1313
}
1414
loadCachePromise = new Promise((resolve) => {
15-
chrome.storage.local.get((result) => {
15+
chrome.storage.local.get((result: { [key: string]: any; } | undefined) => {
1616
cache = result;
1717
resolve(cache);
1818
});
@@ -110,7 +110,7 @@ export abstract class Repo<T> {
110110
}
111111
const loadData = () => {
112112
return new Promise<T[]>((resolve) => {
113-
chrome.storage.local.get((result) => {
113+
chrome.storage.local.get((result: { [key: string]: T; }) => {
114114
resolve(this.filter(result, filters));
115115
});
116116
});

src/app/service/service_worker/gm_api.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { connect, sendMessage } from "@Packages/message/client";
88
import Cache, { incr } from "@App/app/cache";
99
import EventEmitter from "eventemitter3";
1010
import { MessageQueue } from "@Packages/message/message_queue";
11-
import { RuntimeService } from "./runtime";
11+
import { EmitEventRequest, RuntimeService } from "./runtime";
1212
import { getIcon, isFirefox } from "@App/pkg/utils/utils";
1313
import { MockMessageConnect } from "@Packages/message/mock_message";
1414
import i18next, { i18nName } from "@App/locales/locales";
@@ -116,6 +116,27 @@ type NotificationData = {
116116

117117
export type Api = (request: Request, con: GetSender) => Promise<any>;
118118

119+
// GMExternalDependencies接口定义
120+
// 为了支持外部依赖注入,方便测试和扩展
121+
export interface IGMExternalDependencies {
122+
emitEventToTab(to: ExtMessageSender, req: EmitEventRequest): void;
123+
}
124+
125+
export class GMExternalDependencies implements IGMExternalDependencies {
126+
constructor(private runtimeService: RuntimeService) {}
127+
128+
emitEventToTab(to: ExtMessageSender, req: EmitEventRequest): void {
129+
this.runtimeService.emitEventToTab(to, req);
130+
}
131+
}
132+
133+
export class MockGMExternalDependencies implements IGMExternalDependencies {
134+
emitEventToTab(to: ExtMessageSender, req: EmitEventRequest): void {
135+
// Mock implementation for testing
136+
console.log("Mock emitEventToTab called", { to, req });
137+
}
138+
}
139+
119140
export default class GMApi {
120141
logger: Logger;
121142

@@ -128,7 +149,7 @@ export default class GMApi {
128149
private send: MessageSend,
129150
private mq: MessageQueue,
130151
private value: ValueService,
131-
private runtime: RuntimeService
152+
private gmExternalDependencies: IGMExternalDependencies
132153
) {
133154
this.logger = LoggerCore.logger().with({ service: "runtime/gm_api" });
134155
}
@@ -889,7 +910,7 @@ export default class GMApi {
889910
| NotificationData
890911
| undefined;
891912
if (sender) {
892-
this.runtime.emitEventToTab(sender.sender, {
913+
this.gmExternalDependencies.emitEventToTab(sender.sender, {
893914
event: "GM_notification",
894915
eventId: notificationId,
895916
uuid: sender.uuid,
@@ -1055,7 +1076,7 @@ export default class GMApi {
10551076
| NotificationData
10561077
| undefined;
10571078
if (sender) {
1058-
this.runtime.emitEventToTab(sender.sender, {
1079+
this.gmExternalDependencies.emitEventToTab(sender.sender, {
10591080
event: "GM_notification",
10601081
eventId: notificationId,
10611082
uuid: sender.uuid,
@@ -1143,7 +1164,7 @@ export default class GMApi {
11431164
sender: ExtMessageSender;
11441165
};
11451166
if (sender) {
1146-
this.runtime.emitEventToTab(sender.sender, {
1167+
this.gmExternalDependencies.emitEventToTab(sender.sender, {
11471168
event: "GM_openInTab",
11481169
eventId: tabId.toString(),
11491170
uuid: sender.uuid,

src/app/service/service_worker/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default class ServiceWorkerManager {
3939

4040
const resource = new ResourceService(this.api.group("resource"), this.mq);
4141
resource.init();
42-
const value = new ValueService(this.api.group("value"), this.sender, this.mq);
42+
const value = new ValueService(this.api.group("value"), this.mq);
4343
const script = new ScriptService(systemConfig, this.api.group("script"), this.mq, value, resource, scriptDAO);
4444
script.init();
4545
const runtime = new RuntimeService(

src/app/service/service_worker/runtime.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
ScriptRunResouce,
1111
} from "@App/app/repo/scripts";
1212
import { ValueService } from "./value";
13-
import GMApi from "./gm_api";
13+
import GMApi, { GMExternalDependencies } from "./gm_api";
1414
import { subscribeScriptDelete, subscribeScriptEnable, subscribeScriptInstall } from "../queue";
1515
import { ScriptService } from "./script";
1616
import { runScript, stopScript } from "../offscreen/client";
@@ -75,7 +75,15 @@ export class RuntimeService {
7575
async init() {
7676
// 启动gm api
7777
const permission = new PermissionVerify(this.group.group("permission"), this.mq);
78-
const gmApi = new GMApi(this.systemConfig, permission, this.group, this.sender, this.mq, this.value, this);
78+
const gmApi = new GMApi(
79+
this.systemConfig,
80+
permission,
81+
this.group,
82+
this.sender,
83+
this.mq,
84+
this.value,
85+
new GMExternalDependencies(this)
86+
);
7987
permission.init();
8088
gmApi.start();
8189

0 commit comments

Comments
 (0)