Tighten shell rendering regressions

This commit is contained in:
murashit 2026-05-27 23:24:51 +09:00
parent 8b3657d2b6
commit 621235bf99
2 changed files with 36 additions and 1 deletions

View file

@ -42,17 +42,40 @@ describe("ChatPanelShell", () => {
await settleShellEffects();
});
vi.mocked(renderers.renderToolbar).mockClear();
vi.mocked(renderers.renderMessages).mockClear();
vi.mocked(renderers.renderComposer).mockClear();
await act(async () => {
store.dispatch({ type: "status/set", status: "Working" });
await settleShellEffects();
});
expect(renderers.renderToolbar).toHaveBeenCalled();
expect(renderers.renderToolbar).toHaveBeenCalledTimes(1);
expect(renderers.renderMessages).toHaveBeenCalledTimes(1);
expect(renderers.renderComposer).toHaveBeenCalledTimes(1);
expect(container.querySelector(".codex-panel__toolbar")?.textContent).toBe("Working");
unmountChatPanelShell(container);
});
it("stops subscribed slot rendering after unmount", async () => {
const store = createChatStateStore();
const container = document.createElement("div");
document.body.appendChild(container);
const renderers = shellRenderers(store);
await act(async () => {
renderChatPanelShell(container, renderers);
await settleShellEffects();
});
vi.mocked(renderers.renderToolbar).mockClear();
unmountChatPanelShell(container);
store.dispatch({ type: "status/set", status: "Closed" });
await settleShellEffects();
expect(renderers.renderToolbar).not.toHaveBeenCalled();
});
});
function shellRenderers(store: ReturnType<typeof createChatStateStore>) {

View file

@ -119,6 +119,18 @@ describe("CodexChatView connection lifecycle", () => {
);
});
it("renders the React shell on the view content root", async () => {
const view = await chatView();
await view.onOpen();
const root = view.containerEl.children[1] as HTMLElement;
expect(root.classList.contains("codex-panel")).toBe(true);
expect(root.querySelector(":scope > .codex-panel__toolbar")).not.toBeNull();
expect(root.querySelector(":scope > .codex-panel__body .codex-panel__slot--messages")).not.toBeNull();
expect(root.querySelector(":scope > .codex-panel__body .codex-panel__slot--composer")).not.toBeNull();
});
it("ignores stale connection work after the view closes", async () => {
let resolveConfig!: (value: unknown) => void;
const client = connectedClient({