Files
kandev/apps/web/components/task/dockview-session-tabs.hook.test.tsx
T
2026-08-26 21:05:08 +00:00

64 lines
1.9 KiB
TypeScript

import { afterEach, describe, expect, it } from "vitest";
import { act, cleanup, render } from "@testing-library/react";
import type { DockviewApi } from "dockview-react";
import { StateProvider } from "@/components/state-provider";
import { defaultState } from "@/lib/state/default-state";
import { useDockviewStore } from "@/lib/state/dockview-store";
import type { TaskSession, TaskId } from "@/lib/types/http";
import { makeReorderingAutoSessionApi } from "./dockview-session-tabs.test-utils";
import { useAutoSessionTab } from "./dockview-session-tabs";
const TASK_ID = "task-1" as TaskId;
const ACTIVE_SESSION_ID = "session-a";
const SIBLING_SESSION_ID = "session-b";
function Harness() {
useAutoSessionTab(ACTIVE_SESSION_ID);
return null;
}
function renderHookWithHydratedSessions() {
const sessions = [ACTIVE_SESSION_ID, SIBLING_SESSION_ID].map((id) => ({ id }) as TaskSession);
return render(
<StateProvider
initialState={{
...defaultState,
tasks: {
...defaultState.tasks,
activeTaskId: TASK_ID,
activeSessionId: ACTIVE_SESSION_ID,
},
taskSessionsByTask: {
...defaultState.taskSessionsByTask,
itemsByTaskId: { [TASK_ID]: sessions },
},
}}
>
<Harness />
</StateProvider>,
);
}
afterEach(() => {
cleanup();
useDockviewStore.setState({ api: null });
});
describe("useAutoSessionTab", () => {
it("reconciles every hydrated session when Dockview becomes ready later", () => {
// @covers AC-UI-TASK-AGENT-TAB-RECONCILIATION-001.1
useDockviewStore.setState({ api: null });
renderHookWithHydratedSessions();
const { api } = makeReorderingAutoSessionApi();
act(() => {
useDockviewStore.setState({ api: api as DockviewApi });
});
expect(api.panels.map((panel) => panel.id)).toEqual(
expect.arrayContaining([`session:${ACTIVE_SESSION_ID}`, `session:${SIBLING_SESSION_ID}`]),
);
});
});