diff --git a/src/app/service/service_worker/client.ts b/src/app/service/service_worker/client.ts index b58a27912..d872a01f8 100644 --- a/src/app/service/service_worker/client.ts +++ b/src/app/service/service_worker/client.ts @@ -26,6 +26,7 @@ import { type ResourceBackup } from "@App/pkg/backup/struct"; import { type ConfigBundle } from "@App/pkg/backup/config_bundle"; import { type VSCodeConnectParam } from "../offscreen/vscode-connect"; import { type ScriptInfo } from "@App/pkg/utils/scriptInstall"; +import { type SubscribeCheckUpdateResult } from "./subscribe"; import type { AgentModelConfig, AgentTaskApiRequest, @@ -483,7 +484,7 @@ export class SubscribeClient extends Client { } checkUpdate(url: string) { - return this.do("checkUpdate", { url }); + return this.do("checkUpdate", { url }); } enable(url: string, enable: boolean) { diff --git a/src/app/service/service_worker/subscribe.test.ts b/src/app/service/service_worker/subscribe.test.ts index c85301fc5..26e0d384d 100644 --- a/src/app/service/service_worker/subscribe.test.ts +++ b/src/app/service/service_worker/subscribe.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach, vi } from "vitest"; +import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; import { initTestEnv } from "@Tests/utils"; import { SubscribeService } from "./subscribe"; import type { ScriptService } from "./script"; @@ -6,9 +6,12 @@ import { ScriptDAO, SCRIPT_TYPE_NORMAL, SCRIPT_STATUS_ENABLE, SCRIPT_RUN_STATUS_ import type { Script } from "@App/app/repo/scripts"; import { SubscribeDAO, SubscribeStatusType } from "@App/app/repo/subscribe"; import type { Subscribe } from "@App/app/repo/subscribe"; +import type { TInstallSubscribe } from "../queue"; import { MessageQueue } from "@Packages/message/message_queue"; import { MockMessage } from "@Packages/message/mock_message"; import { Server } from "@Packages/message/server"; +import { SubscribeClient } from "./client"; +import { createMockOPFS } from "@App/app/repo/test-helpers"; import EventEmitter from "eventemitter3"; initTestEnv(); @@ -54,7 +57,7 @@ const buildService = () => { installByUrl: vi.fn(async () => makeScript()), } as unknown as ScriptService; const service = new SubscribeService(group, mq, scriptService); - return { service, scriptService }; + return { service, scriptService, mq }; }; // 回收站按 deleteBy 提供「订阅」来源筛选;订阅链路删除脚本时若不标记来源, @@ -85,3 +88,235 @@ describe("SubscribeService —— 删除脚本的来源标记", () => { expect(scriptService.deleteScript).toHaveBeenCalledWith("sub-script-1", "subscribe"); }); }); + +// 订阅列表页只在挂载时拉取一次数据,列表要跟上后台变化,只能靠脚本同步完成后的广播 +describe("SubscribeService —— 订阅列表同步广播", () => { + beforeEach(async () => { + await chrome.storage.local.clear(); + }); + + it("订阅脚本同步完成后应广播含最新脚本关联的订阅", async () => { + await new SubscribeDAO().save(makeSubscribe({ scripts: {} })); + const { service, mq } = buildService(); + const published = new Promise((resolve) => mq.subscribe("upsertSubscribe", resolve)); + + await service.upsertScript(SUB_URL); + + const { subscribe } = await published; + expect(subscribe.url).toBe(SUB_URL); + expect(subscribe.scripts[SCRIPT_URL]).toEqual({ url: SCRIPT_URL, uuid: "sub-script-1" }); + }); + + it("较旧的脚本同步完成较晚时保留较新的订阅", async () => { + await new SubscribeDAO().save( + makeSubscribe({ + scripts: {}, + metadata: { usersubscribe: [], scripturl: [SCRIPT_URL], version: ["0.3.4"] }, + }) + ); + const { service, scriptService, mq } = buildService(); + let finishScriptInstall!: (script: Script) => void; + const scriptInstallPending = new Promise