import { expect, gotoWorkbench, saveScreenshot, test } from "../fixtures/test"; import { selectors, sessionTab } from "../fixtures/selectors"; test("TraceTimeline renders readable rows and hides backend noise", async ({ page }, testInfo) => { await gotoWorkbench(page, "/workbench/sessions/cnv_completed"); await expect(page.locator(sessionTab("cnv_completed"))).toHaveAttribute("data-active", "true"); const trace = page.locator(`${selectors.traceTimeline}[data-status="completed"]`); await expect(trace).toBeVisible(); await trace.locator("summary.trace-disclosure-summary").click(); await expect(page.locator(`${selectors.traceRow}[data-row-kind="tool"]`)).toContainText("commandExecution"); await expect(page.locator(`${selectors.traceRow}[data-terminal="true"]`)).toContainText("构建和 Trace 渲染检查完成"); await expect(page.locator(selectors.conversationList)).not.toContainText("token_count"); await page.locator(".message-detail-button").first().click(); await expect(page.locator(selectors.messageDetailDialog)).toContainText("trc_completed"); await expect(page.locator(selectors.messageDetailDialog)).toContainText("ses_completed"); await saveScreenshot(page, testInfo, "trace-rendering-detail"); }); test("failed trace exposes readable failure row", async ({ page }, testInfo) => { await gotoWorkbench(page, "/workbench/sessions/cnv_failed"); const trace = page.locator(`${selectors.traceTimeline}[data-status="failed"]`); await expect(trace).toBeVisible(); await trace.locator("summary.trace-disclosure-summary").click(); await expect(page.locator(`${selectors.traceRow}[data-event-status="blocked"][data-row-kind="tool"]`)).toContainText("missing controlled dependency"); await expect(page.locator(`${selectors.messageCard}[data-status="failed"]`)).toContainText("缺少受控依赖"); await saveScreenshot(page, testInfo, "trace-rendering-failed"); });