Files
pikasTech-HWLAB/web/hwlab-cloud-web/tests/workbench-e2e/specs/message-timing.spec.ts
T

68 lines
4.2 KiB
TypeScript

import { expect, gotoWorkbench, saveScreenshot, test } from "../fixtures/test";
import { selectors, sessionTab } from "../fixtures/selectors";
test("Code Agent message headers render canonical timing metadata", async ({ page }, testInfo) => {
const baseTime = new Date("2026-06-17T09:39:45.000Z");
await page.clock.install({ time: baseTime });
await page.clock.pauseAt(baseTime);
await gotoWorkbench(page, "/workbench/sessions/ses_running");
const running = page.locator(`${selectors.messageCard}[data-role="agent"][data-status="running"]`).first();
await expect(running.locator(`.message-meta-footer ${selectors.messageDurationMeta}`)).toContainText("耗时 4 秒");
await expect(running.locator(`.message-meta-footer ${selectors.messageActivityMeta}`)).toContainText("最近更新:0 秒前");
await expect(running.locator(selectors.messageDurationMeta)).toHaveAttribute("aria-label", "总耗时:4 秒");
await expect(running.locator(selectors.messageActivityMeta)).toHaveAttribute("aria-label", "最近更新:0 秒前");
await expect(running.locator(selectors.messageDurationMeta)).not.toContainText("最近");
await page.clock.fastForward(5000);
await expect(running.locator(selectors.messageDurationMeta)).toContainText("耗时 9 秒");
await expect(running.locator(selectors.messageActivityMeta)).toContainText("最近 5 秒前");
await page.clock.fastForward(60000);
await expect(running.locator(selectors.messageDurationMeta)).toContainText("耗时 1 分 9 秒");
await expect(running.locator(selectors.messageActivityMeta)).toContainText("最近 1 分 5 秒前");
await page.locator(sessionTab("ses_completed")).click();
const completed = page.locator(`${selectors.messageCard}[data-role="agent"][data-status="completed"]`).first();
await expect(completed.locator(selectors.messageDurationMeta)).toContainText("耗时 6 秒");
await expect(completed.locator(selectors.messageActivityMeta)).toHaveCount(0);
await page.clock.fastForward(60000);
await expect(completed.locator(selectors.messageDurationMeta)).toContainText("耗时 6 秒");
await page.locator(sessionTab("ses_failed")).click();
const failed = page.locator(`${selectors.messageCard}[data-role="agent"][data-status="failed"]`).first();
await expect(failed.locator(selectors.messageDurationMeta)).toContainText("耗时 2 秒");
await expect(failed.locator(selectors.messageActivityMeta)).toHaveCount(0);
await page.locator(sessionTab("ses_canceled")).click();
const canceled = page.locator(`${selectors.messageCard}[data-role="agent"][data-status="canceled"]`).first();
await expect(canceled.locator(selectors.messageDurationMeta)).toContainText("耗时 0 秒");
await expect(canceled.locator(selectors.messageActivityMeta)).toHaveCount(0);
await page.clock.fastForward(60000);
await expect(canceled.locator(selectors.messageDurationMeta)).toContainText("耗时 0 秒");
await expect(page.locator(`${selectors.messageCard}[data-role="user"] ${selectors.messageDurationMeta}`)).toHaveCount(0);
await expect(page.locator(`${selectors.messageCard}[data-role="user"] ${selectors.messageActivityMeta}`)).toHaveCount(0);
await saveScreenshot(page, testInfo, "message-timing-headers");
});
test.describe("terminal timing seal", () => {
test.use({ scenarioId: "terminal-canceled-late-timing" });
test("canceled message duration stays sealed after late timing snapshots", async ({ page }, testInfo) => {
const baseTime = new Date("2026-06-17T09:39:04.000Z");
await page.clock.install({ time: baseTime });
await page.clock.pauseAt(baseTime);
await gotoWorkbench(page, "/workbench/sessions/ses_running");
const canceled = page.locator(`${selectors.messageCard}[data-role="agent"][data-status="canceled"]`).first();
await expect(canceled.locator(selectors.messageDurationMeta)).toContainText("耗时 12 秒");
await expect(canceled.locator(selectors.messageActivityMeta)).toHaveCount(0);
await page.waitForTimeout(1200);
await expect(canceled.locator(selectors.messageDurationMeta)).toContainText("耗时 12 秒");
await expect(canceled.locator(selectors.messageDurationMeta)).not.toContainText("14 秒");
await saveScreenshot(page, testInfo, "message-timing-canceled-sealed");
});
});