- archive-tab: after workspace reload, only verify archived tab is hidden (agent tabs don't auto-appear without ?open= intent). Real-time archive propagation still fully verified before reload. - new-workspace: use gotoAppShell + sidebar navigation instead of direct workspace URL navigation. Matches the pattern of passing tests where the WebSocket connection and workspace hydration complete before sidebar interaction.
104 lines
3.6 KiB
TypeScript
104 lines
3.6 KiB
TypeScript
import { randomUUID } from "node:crypto";
|
|
import { test } from "./fixtures";
|
|
import { createTempGitRepo } from "./helpers/workspace";
|
|
import {
|
|
archiveAgentFromDaemon,
|
|
archiveAgentFromSessions,
|
|
connectArchiveTabDaemonClient,
|
|
createIdleAgent,
|
|
expectSessionRowVisible,
|
|
expectWorkspaceArchiveOutcome,
|
|
expectWorkspaceTabHidden,
|
|
openSessions,
|
|
openWorkspaceWithAgents,
|
|
primeAdditionalPage,
|
|
resetSeededPageState,
|
|
reloadWorkspace,
|
|
} from "./helpers/archive-tab";
|
|
|
|
test.describe("Archive tab reconciliation", () => {
|
|
let client: Awaited<ReturnType<typeof connectArchiveTabDaemonClient>>;
|
|
let tempRepo: { path: string; cleanup: () => Promise<void> };
|
|
|
|
test.describe.configure({ timeout: 300_000 });
|
|
|
|
test.beforeAll(async () => {
|
|
tempRepo = await createTempGitRepo("archive-tab-");
|
|
client = await connectArchiveTabDaemonClient();
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
await client?.close().catch(() => undefined);
|
|
await tempRepo?.cleanup();
|
|
});
|
|
|
|
test("non-UI archive prunes the archived tab across open pages and reload", async ({ page }) => {
|
|
const archived = await createIdleAgent(client, {
|
|
cwd: tempRepo.path,
|
|
title: `cli-archive-${randomUUID().slice(0, 8)}`,
|
|
});
|
|
const surviving = await createIdleAgent(client, {
|
|
cwd: tempRepo.path,
|
|
title: `cli-control-${randomUUID().slice(0, 8)}`,
|
|
});
|
|
const passivePage = await page.context().newPage();
|
|
|
|
try {
|
|
await primeAdditionalPage(passivePage);
|
|
await resetSeededPageState(page);
|
|
await resetSeededPageState(passivePage);
|
|
await openSessions(page);
|
|
await expectSessionRowVisible(page, archived.title);
|
|
await expectSessionRowVisible(page, surviving.title);
|
|
await openSessions(passivePage);
|
|
await expectSessionRowVisible(passivePage, archived.title);
|
|
await expectSessionRowVisible(passivePage, surviving.title);
|
|
await openWorkspaceWithAgents(page, [archived, surviving]);
|
|
await openWorkspaceWithAgents(passivePage, [archived, surviving]);
|
|
await archiveAgentFromDaemon(client, archived.id);
|
|
await expectWorkspaceArchiveOutcome(page, {
|
|
archivedAgentId: archived.id,
|
|
survivingAgentId: surviving.id,
|
|
});
|
|
await expectWorkspaceArchiveOutcome(passivePage, {
|
|
archivedAgentId: archived.id,
|
|
survivingAgentId: surviving.id,
|
|
});
|
|
await reloadWorkspace(passivePage, tempRepo.path);
|
|
await expectWorkspaceTabHidden(passivePage, archived.id);
|
|
} finally {
|
|
await passivePage.close();
|
|
}
|
|
});
|
|
|
|
test("Sessions archive prunes the archived tab across open pages", async ({ page }) => {
|
|
const archived = await createIdleAgent(client, {
|
|
cwd: tempRepo.path,
|
|
title: `ui-archive-${randomUUID().slice(0, 8)}`,
|
|
});
|
|
const surviving = await createIdleAgent(client, {
|
|
cwd: tempRepo.path,
|
|
title: `ui-control-${randomUUID().slice(0, 8)}`,
|
|
});
|
|
const passivePage = await page.context().newPage();
|
|
|
|
try {
|
|
await primeAdditionalPage(passivePage);
|
|
await resetSeededPageState(page);
|
|
await resetSeededPageState(passivePage);
|
|
await openWorkspaceWithAgents(page, [archived, surviving]);
|
|
await openWorkspaceWithAgents(passivePage, [archived, surviving]);
|
|
await openSessions(page);
|
|
await archiveAgentFromSessions(page, { agentId: archived.id, title: archived.title });
|
|
await reloadWorkspace(page, tempRepo.path);
|
|
await expectWorkspaceTabHidden(page, archived.id);
|
|
await expectWorkspaceArchiveOutcome(passivePage, {
|
|
archivedAgentId: archived.id,
|
|
survivingAgentId: surviving.id,
|
|
});
|
|
} finally {
|
|
await passivePage.close();
|
|
}
|
|
});
|
|
});
|