73 lines
3.8 KiB
TypeScript
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");
|
|
});
|
|
});
|