Files
pikasTech-HWLAB/web/hwlab-cloud-web/tests/workbench-e2e/specs/new-session-thread.spec.ts
T

73 lines
3.8 KiB
TypeScript

import { expect, fakeServerState, gotoWorkbench, test } from "../fixtures/test";
import { selectors } from "../fixtures/selectors";
test("new optimistic session first turn does not submit local thr_* as upstream thread", async ({ page }) => {
await gotoWorkbench(page);
await page.locator(selectors.sessionCreate).click();
const activeTab = page.locator('.session-tab[data-active="true"]');
await expect(activeTab).toHaveAttribute("data-session-id", /^ses_/u);
const sessionId = await activeTab.getAttribute("data-session-id");
expect(sessionId).toBeTruthy();
await page.locator(selectors.commandInput).fill("web-probe D601 v0.3 smoke: reply with exactly OK.");
await expect(page.locator(selectors.commandSend)).toBeEnabled();
await page.locator(selectors.commandSend).click();
await expect.poll(async () => ((await fakeServerState(page)).chatRequests as unknown[]).length).toBe(1);
const state = await fakeServerState(page);
const request = (state.chatRequests as Record<string, unknown>[])[0];
if (!request) throw new Error("expected one chat request");
expect(request.conversationId).toBeUndefined();
expect(request.projectId).toBeUndefined();
expect(request.workspaceId).toBeUndefined();
expect(request.sessionId).toBe(sessionId);
expect(request.threadId ?? null).toBeNull();
expect((state.legacyRequestLedger as unknown[]).length).toBe(0);
});
test.describe("server authoritative session create", () => {
test.use({ scenarioId: "server-authoritative-create" });
test("new session adopts backend selected conversation before submit", async ({ page }) => {
await gotoWorkbench(page);
await page.locator(selectors.sessionCreate).click();
await expect(page).toHaveURL(/\/workbench\/sessions\/ses_server_created/u);
await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-active", "true");
await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-running", "false");
await page.locator(selectors.commandInput).fill("server authoritative create smoke");
await expect(page.locator(selectors.commandSend)).toBeEnabled();
await page.locator(selectors.commandSend).click();
await expect.poll(async () => ((await fakeServerState(page)).chatRequests as unknown[]).length).toBe(1);
const state = await fakeServerState(page);
const request = (state.chatRequests as Record<string, unknown>[])[0];
expect(request?.conversationId).toBeUndefined();
expect(request?.projectId).toBeUndefined();
expect(request?.workspaceId).toBeUndefined();
expect(request?.sessionId).toBe("ses_server_created");
expect((state.legacyRequestLedger as unknown[]).length).toBe(0);
});
});
test.describe("session create and delete authority", () => {
test.use({ scenarioId: "server-authoritative-create" });
test("created session becomes active and deleted session stays archived after reload", async ({ page }) => {
await gotoWorkbench(page);
await page.locator(selectors.sessionCreate).click();
await expect(page).toHaveURL(/\/workbench\/sessions\/ses_server_created/u);
await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-active", "true");
await expect(page.locator(selectors.commandSend)).toBeDisabled();
await page.locator(selectors.sessionDelete).click();
await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveCount(0);
await page.reload();
await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveCount(0);
const state = await fakeServerState(page);
const deleted = (state.sessions as Array<{ sessionId?: string; status?: string }>).find((item) => item.sessionId === "ses_server_created");
expect(deleted?.status).toBe("archived");
});
});