murashit_codex-panel/tests/features/chat/view-render-controller.test.ts
2026-05-29 07:14:04 +09:00

64 lines
2.2 KiB
TypeScript

// @vitest-environment jsdom
import { beforeEach, describe, expect, it, vi } from "vitest";
import { createChatState, createChatStateStore } from "../../../src/features/chat/chat-state";
import { ChatViewRenderController } from "../../../src/features/chat/view-render-controller";
import { renderChatPanelShell } from "../../../src/features/chat/ui/shell";
vi.mock("../../../src/features/chat/ui/shell", () => ({
renderChatPanelShell: vi.fn(),
}));
describe("ChatViewRenderController", () => {
beforeEach(() => {
vi.mocked(renderChatPanelShell).mockClear();
});
it("renders the shell with stable slot delegates", () => {
const root = document.createElement("div");
const controller = new ChatViewRenderController({
stateStore: createChatStateStore(createChatState()),
panelRoot: () => root,
connected: () => true,
pendingRequestsSignature: () => "",
activeComposerThreadName: () => null,
renderToolbar: vi.fn(),
renderMessages: vi.fn(),
renderComposer: vi.fn(),
clearScheduledRender: vi.fn(),
});
controller.render();
expect(renderChatPanelShell).toHaveBeenCalledWith(
root,
expect.objectContaining({
renderVersion: 0,
toolbar: expect.objectContaining({ render: expect.any(Function), snapshot: expect.any(Function) }),
messages: expect.objectContaining({ render: expect.any(Function), snapshot: expect.any(Function) }),
composer: expect.objectContaining({ render: expect.any(Function), snapshot: expect.any(Function) }),
}),
);
});
it("increments the render version when forcing slot rerender", () => {
const root = document.createElement("div");
const controller = new ChatViewRenderController({
stateStore: createChatStateStore(createChatState()),
panelRoot: () => root,
connected: () => true,
pendingRequestsSignature: () => "",
activeComposerThreadName: () => null,
renderToolbar: vi.fn(),
renderMessages: vi.fn(),
renderComposer: vi.fn(),
clearScheduledRender: vi.fn(),
});
controller.render();
controller.renderShellSlots();
expect(vi.mocked(renderChatPanelShell).mock.calls.map(([, model]) => model.renderVersion)).toEqual([0, 1]);
});
});