import { afterEach, describe, expect, it, vi } from "vitest"; import { createStartAccountContext } from "../../../test/helpers/extensions/start-account-context.js"; import { expectStopPendingUntilAbort, startAccountAndTrackLifecycle, waitForStartedMocks, } from "../../../test/helpers/extensions/start-account-lifecycle.js"; import type { ResolvedNextcloudTalkAccount } from "./accounts.js"; const hoisted = vi.hoisted(() => ({ monitorNextcloudTalkProvider: vi.fn(), })); vi.mock("./monitor.js", async () => { const actual = await vi.importActual("./monitor.js"); return { ...actual, monitorNextcloudTalkProvider: hoisted.monitorNextcloudTalkProvider, }; }); import { nextcloudTalkPlugin } from "./channel.js"; function buildAccount(): ResolvedNextcloudTalkAccount { return { accountId: "default", enabled: true, baseUrl: "https://nextcloud.example.com", secret: "secret", // pragma: allowlist secret secretSource: "config", // pragma: allowlist secret config: { baseUrl: "https://nextcloud.example.com", botSecret: "secret", // pragma: allowlist secret webhookPath: "/nextcloud-talk-webhook", webhookPort: 8788, }, }; } function mockStartedMonitor() { const stop = vi.fn(); hoisted.monitorNextcloudTalkProvider.mockResolvedValue({ stop }); return stop; } function startNextcloudAccount(abortSignal?: AbortSignal) { return nextcloudTalkPlugin.gateway!.startAccount!( createStartAccountContext({ account: buildAccount(), abortSignal, }), ); } describe("nextcloudTalkPlugin gateway.startAccount", () => { afterEach(() => { vi.clearAllMocks(); }); it("keeps startAccount pending until abort, then stops the monitor", async () => { const stop = mockStartedMonitor(); const { abort, task, isSettled } = startAccountAndTrackLifecycle({ startAccount: nextcloudTalkPlugin.gateway!.startAccount!, account: buildAccount(), }); await expectStopPendingUntilAbort({ waitForStarted: waitForStartedMocks(hoisted.monitorNextcloudTalkProvider), isSettled, abort, task, stop, }); }); it("stops immediately when startAccount receives an already-aborted signal", async () => { const stop = mockStartedMonitor(); const abort = new AbortController(); abort.abort(); await startNextcloudAccount(abort.signal); expect(hoisted.monitorNextcloudTalkProvider).toHaveBeenCalledOnce(); expect(stop).toHaveBeenCalledOnce(); }); });