

























@@ -3,6 +3,17 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
3344type CronRunsLoadStatus = "ok" | "error" | "skipped";
556+function createDeferred<T = void>() {
7+let resolve: ((value: T | PromiseLike<T>) => void) | undefined;
8+const promise = new Promise<T>((res) => {
9+resolve = res;
10+});
11+if (!resolve) {
12+throw new Error("Expected deferred resolver to be initialized");
13+}
14+return { promise, resolve };
15+}
16+617const mocks = vi.hoisted(() => ({
718refreshChatMock: vi.fn(async () => {}),
819scheduleChatScrollMock: vi.fn(),
@@ -196,12 +207,8 @@ describe("refreshActiveTab", () => {
196207it("records tab visible timing without waiting for the tab refresh RPC", async () => {
197208const host = createHost();
198209host.tab = "chat";
199-let resolveSessions!: () => void;
200-mocks.loadSessionsMock.mockReturnValueOnce(
201-new Promise<void>((resolve) => {
202-resolveSessions = resolve;
203-}),
204-);
210+const sessions = createDeferred();
211+mocks.loadSessionsMock.mockReturnValueOnce(sessions.promise);
205212206213setTab(host as never, "sessions");
207214@@ -221,7 +228,7 @@ describe("refreshActiveTab", () => {
221228);
222229});
223230224-resolveSessions();
231+sessions.resolve();
225232});
226233227234it("does not wait for secondary overview refreshes before resolving", async () => {
@@ -244,12 +251,8 @@ describe("refreshActiveTab", () => {
244251it("does not wait for config schema before resolving config tab refresh", async () => {
245252const host = createHost();
246253host.tab = "config";
247-let resolveSchema!: () => void;
248-mocks.loadConfigSchemaMock.mockReturnValueOnce(
249-new Promise<void>((resolve) => {
250-resolveSchema = resolve;
251-}),
252-);
254+const schema = createDeferred();
255+mocks.loadConfigSchemaMock.mockReturnValueOnce(schema.promise);
253256254257const refresh = refreshActiveTab(host as never);
255258const outcome = await Promise.race([
@@ -262,7 +265,7 @@ describe("refreshActiveTab", () => {
262265expect(mocks.loadConfigMock).toHaveBeenCalledOnce();
263266expect(host.requestUpdate).not.toHaveBeenCalled();
264267265-resolveSchema();
268+schema.resolve();
266269267270await vi.waitFor(() => {
268271expect(host.requestUpdate).toHaveBeenCalledOnce();
@@ -272,18 +275,12 @@ describe("refreshActiveTab", () => {
272275it("renders channels from the cheap snapshot before starting slow probes", async () => {
273276const host = createHost();
274277host.tab = "channels";
275-let resolveSchema!: () => void;
276-let resolveProbe!: () => void;
277-mocks.loadConfigSchemaMock.mockReturnValueOnce(
278-new Promise<void>((resolve) => {
279-resolveSchema = resolve;
280-}),
281-);
278+const schema = createDeferred();
279+const channelProbe = createDeferred();
280+mocks.loadConfigSchemaMock.mockReturnValueOnce(schema.promise);
282281mocks.loadChannelsMock.mockImplementation(async (_host, probe) => {
283282if (probe) {
284-await new Promise<void>((resolve) => {
285-resolveProbe = resolve;
286-});
283+await channelProbe.promise;
287284}
288285});
289286@@ -298,8 +295,8 @@ describe("refreshActiveTab", () => {
298295expect(mocks.loadConfigMock).toHaveBeenCalledOnce();
299296expect(host.requestUpdate).not.toHaveBeenCalled();
300297301-resolveSchema();
302-resolveProbe();
298+schema.resolve();
299+channelProbe.resolve();
303300304301await vi.waitFor(() => {
305302expect(host.requestUpdate).toHaveBeenCalledTimes(2);
@@ -309,16 +306,12 @@ describe("refreshActiveTab", () => {
309306it("records overview secondary refresh duration and aggregate status", async () => {
310307const host = createHost();
311308host.tab = "overview";
312-let resolveUsage!: () => void;
313-mocks.loadUsageMock.mockReturnValueOnce(
314-new Promise<void>((resolve) => {
315-resolveUsage = resolve;
316-}),
317-);
309+const usage = createDeferred();
310+mocks.loadUsageMock.mockReturnValueOnce(usage.promise);
318311mocks.loadSkillsMock.mockRejectedValueOnce(new Error("skills failed"));
319312320313await refreshActiveTab(host as never);
321-resolveUsage();
314+usage.resolve();
322315323316await vi.waitFor(() => {
324317expect(host.eventLogBuffer).toEqual(
@@ -401,16 +394,12 @@ describe("refreshActiveTab", () => {
401394it("does not record stale cron run timing after leaving the cron tab", async () => {
402395const host = createHost();
403396host.tab = "cron";
404-let resolveRuns!: () => void;
405-mocks.loadCronRunsMock.mockReturnValueOnce(
406-new Promise<"ok">((resolve) => {
407-resolveRuns = () => resolve("ok");
408-}),
409-);
397+const runs = createDeferred<"ok">();
398+mocks.loadCronRunsMock.mockReturnValueOnce(runs.promise);
410399411400await refreshActiveTab(host as never);
412401host.tab = "chat";
413-resolveRuns();
402+runs.resolve("ok");
414403await Promise.resolve();
415404416405expect(host.eventLogBuffer).not.toEqual(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。