murashit_codex-panel/tests/features/chat/controllers/connection/app-server-warmup-controller.test.ts
2026-05-29 07:26:35 +09:00

59 lines
1.9 KiB
TypeScript

// @vitest-environment jsdom
import { beforeEach, describe, expect, it, vi } from "vitest";
import { AppServerWarmupController } from "../../../../../src/features/chat/controllers/connection/app-server-warmup-controller";
import { ChatViewDeferredTasks } from "../../../../../src/features/chat/view-lifecycle";
function createController({
opened = true,
closing = false,
connected = false,
}: { opened?: boolean; closing?: boolean; connected?: boolean } = {}) {
const ensureConnected = vi.fn().mockResolvedValue(undefined);
const controller = new AppServerWarmupController({
deferredTasks: new ChatViewDeferredTasks(() => window),
opened: () => opened,
closing: () => closing,
connected: () => connected,
ensureConnected,
});
return { controller, ensureConnected };
}
describe("AppServerWarmupController", () => {
beforeEach(() => {
vi.useFakeTimers();
});
it("connects on the next tick when the opened view is disconnected", async () => {
const { controller, ensureConnected } = createController();
controller.schedule();
await vi.advanceTimersByTimeAsync(0);
expect(ensureConnected).toHaveBeenCalledOnce();
});
it("does not schedule warmup when the view is closed or already connected", async () => {
const closed = createController({ opened: false });
const connected = createController({ connected: true });
closed.controller.schedule();
connected.controller.schedule();
await vi.advanceTimersByTimeAsync(0);
expect(closed.ensureConnected).not.toHaveBeenCalled();
expect(connected.ensureConnected).not.toHaveBeenCalled();
});
it("skips a scheduled warmup if the view is closing", async () => {
const { controller, ensureConnected } = createController({ closing: true });
controller.schedule();
await vi.advanceTimersByTimeAsync(0);
expect(ensureConnected).not.toHaveBeenCalled();
});
});