import { useEffect } from "react";
import { describe, expect, it, vi } from "vitest";
import { render, screen, waitFor } from "@testing-library/react";
import type { Gateways } from "@/ports";
import { MockLayoutGateway, MockTerminalGateway } from "@/adapters/mock";
import { DIProvider } from "@/app/di";
const terminalViewSpy = vi.hoisted(() => vi.fn());
const terminalMountSpy = vi.hoisted(() => vi.fn());
const terminalUnmountSpy = vi.hoisted(() => vi.fn());
vi.mock("@/features/terminals", () => ({
TerminalView: (props: { refitSignal?: number }) => {
terminalViewSpy(props);
useEffect(() => {
terminalMountSpy();
return () => terminalUnmountSpy();
}, []);
return (
);
},
ResumeConversationPopup: () => null,
useWritePortal: () => ({
portal: {
onHumanData: () => {},
isSuspended: () => false,
bindHandle: () => {},
unbindHandle: () => {},
},
overlay: false,
}),
}));
import { LayoutGrid } from "./LayoutGrid";
function renderGrid(
layout: MockLayoutGateway,
props: { projectId: string; cwd: string; layoutId?: string },
) {
const gateways = {
layout,
terminal: new MockTerminalGateway(),
} as unknown as Gateways;
return render(
,
);
}
function latestRefitSignal(): number {
const lastCall = terminalViewSpy.mock.calls.at(-1);
return Number(lastCall?.[0]?.refitSignal ?? -1);
}
describe("LayoutGrid refit epoch (#4)", () => {
it("bumps TerminalView refitSignal after cwd/layout/project transitions", async () => {
const layout = new MockLayoutGateway();
const { activeId: firstLayoutId } = await layout.listLayouts("p1");
const { layoutId: secondLayoutId } = await layout.createLayout("p1", "Second");
terminalViewSpy.mockClear();
terminalMountSpy.mockClear();
terminalUnmountSpy.mockClear();
const view = renderGrid(layout, {
projectId: "p1",
cwd: "/same/cwd",
layoutId: firstLayoutId,
});
await screen.findByTestId("mock-terminal-view");
await waitFor(() => expect(latestRefitSignal()).toBeGreaterThan(0));
const initialSignal = latestRefitSignal();
expect(terminalMountSpy).toHaveBeenCalledTimes(1);
view.rerender(
,
);
await waitFor(() => expect(latestRefitSignal()).toBeGreaterThan(initialSignal));
const afterCwdSignal = latestRefitSignal();
expect(terminalMountSpy).toHaveBeenCalledTimes(1);
expect(terminalUnmountSpy).not.toHaveBeenCalled();
view.rerender(
,
);
await waitFor(() => expect(latestRefitSignal()).toBeGreaterThan(afterCwdSignal));
const afterLayoutSwitchSignal = latestRefitSignal();
view.rerender(
,
);
await waitFor(() =>
expect(latestRefitSignal()).toBeGreaterThan(afterLayoutSwitchSignal),
);
expect(terminalMountSpy).toHaveBeenCalled();
});
});