From 621235bf9983e69efa70a4bdedeffba55b21a32d Mon Sep 17 00:00:00 2001 From: murashit Date: Wed, 27 May 2026 23:24:51 +0900 Subject: [PATCH] Tighten shell rendering regressions --- tests/features/chat/ui/shell.test.tsx | 25 ++++++++++++++++++++- tests/features/chat/view-connection.test.ts | 12 ++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/features/chat/ui/shell.test.tsx b/tests/features/chat/ui/shell.test.tsx index eccd8cb6..2f0622a9 100644 --- a/tests/features/chat/ui/shell.test.tsx +++ b/tests/features/chat/ui/shell.test.tsx @@ -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) { diff --git a/tests/features/chat/view-connection.test.ts b/tests/features/chat/view-connection.test.ts index 58ce2eaa..ed8d4f1e 100644 --- a/tests/features/chat/view-connection.test.ts +++ b/tests/features/chat/view-connection.test.ts @@ -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({