
























@@ -12,7 +12,7 @@ const mocks = vi.hoisted(() => ({
1212loadAgentIdentityMock: vi.fn(async () => {}),
1313loadAgentSkillsMock: vi.fn(async () => {}),
1414loadAgentsMock: vi.fn(async () => {}),
15-loadChannelsMock: vi.fn(async () => {}),
15+loadChannelsMock: vi.fn<(_host: unknown, _probe: boolean) => Promise<void>>(async () => {}),
1616loadConfigMock: vi.fn(async () => {}),
1717loadConfigSchemaMock: vi.fn(async () => {}),
1818loadCronStatusMock: vi.fn(async () => {}),
@@ -241,6 +241,71 @@ describe("refreshActiveTab", () => {
241241expect(mocks.loadUsageMock).toHaveBeenCalled();
242242});
243243244+it("does not wait for config schema before resolving config tab refresh", async () => {
245+const host = createHost();
246+host.tab = "config";
247+let resolveSchema!: () => void;
248+mocks.loadConfigSchemaMock.mockReturnValueOnce(
249+new Promise<void>((resolve) => {
250+resolveSchema = resolve;
251+}),
252+);
253+254+const refresh = refreshActiveTab(host as never);
255+const outcome = await Promise.race([
256+refresh.then(() => "resolved" as const),
257+new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 0)),
258+]);
259+260+expect(outcome).toBe("resolved");
261+expect(mocks.loadConfigSchemaMock).toHaveBeenCalledOnce();
262+expect(mocks.loadConfigMock).toHaveBeenCalledOnce();
263+expect(host.requestUpdate).not.toHaveBeenCalled();
264+265+resolveSchema();
266+267+await vi.waitFor(() => {
268+expect(host.requestUpdate).toHaveBeenCalledOnce();
269+});
270+});
271+272+it("renders channels from the cheap snapshot before starting slow probes", async () => {
273+const host = createHost();
274+host.tab = "channels";
275+let resolveSchema!: () => void;
276+let resolveProbe!: () => void;
277+mocks.loadConfigSchemaMock.mockReturnValueOnce(
278+new Promise<void>((resolve) => {
279+resolveSchema = resolve;
280+}),
281+);
282+mocks.loadChannelsMock.mockImplementation(async (_host, probe) => {
283+if (probe) {
284+await new Promise<void>((resolve) => {
285+resolveProbe = resolve;
286+});
287+}
288+});
289+290+const refresh = refreshActiveTab(host as never);
291+const outcome = await Promise.race([
292+refresh.then(() => "resolved" as const),
293+new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 0)),
294+]);
295+296+expect(outcome).toBe("resolved");
297+expect(mocks.loadChannelsMock.mock.calls.map(([, probe]) => probe)).toEqual([false, true]);
298+expect(mocks.loadConfigMock).toHaveBeenCalledOnce();
299+expect(host.requestUpdate).not.toHaveBeenCalled();
300+301+resolveSchema();
302+resolveProbe();
303+304+await vi.waitFor(() => {
305+expect(host.requestUpdate).toHaveBeenCalledTimes(2);
306+});
307+});
308+244309it("records overview secondary refresh duration and aggregate status", async () => {
245310const host = createHost();
246311host.tab = "overview";
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。