test: playwright end-to-end qa (17 tests, real models)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ahmed mohammed
2026-09-22 09:02:53 +03:00
co-authored by Claude Opus 4.7
parent 0db7b8140b
commit 07dd3d6bf8
12 changed files with 233 additions and 4 deletions
+50
View File
@@ -0,0 +1,50 @@
import { test, expect } from "@playwright/test";
import { readFileSync } from "node:fs";
const xml = readFileSync("fixtures/sample.sqlplan", "utf8");
test.use({ storageState: ".auth/user.json", permissions: ["clipboard-read", "clipboard-write"] });
test("full run: paste → stages → streamed report → copy → print", async ({ page }) => {
await page.goto("/app");
await page.fill("#xml", xml);
await page.fill("#note", "slow since the migration");
await page.getByRole("button", { name: "Analyse" }).click();
// Stages are named one at a time; the whole run takes tens of seconds with a real model.
await expect(page.getByText(/1 of 4 · Reading the plan/)).toBeVisible({ timeout: 20_000 });
await expect(page.getByText(/4 of 4 · Writing the report/)).toBeVisible({ timeout: 180_000 });
// The report paints while oul is still arriving, so the headline shows up first.
await expect(page.locator("#report h2").first()).toBeVisible({ timeout: 180_000 });
// The Analyse button only unlocks on the done frame: by then the whole report has arrived and parsed.
await expect(page.getByRole("button", { name: "Analyse" })).toBeEnabled({ timeout: 180_000 });
expect(await page.locator("#report .card").count()).toBeGreaterThan(2);
// No raw OpenUI Lang leaked into the page as text.
expect(await page.locator("main").innerText()).not.toContain("root = Report(");
await page.getByRole("button", { name: "Copy", exact: true }).click();
const clip = await page.evaluate(() => navigator.clipboard.readText());
expect(clip).toContain("slow since the migration");
await page.getByRole("button", { name: "Export to PDF" }).click(); // window.print()
await page.emulateMedia({ media: "print" });
await expect(page.locator(".rail")).toBeHidden();
await expect(page.locator(".toolbar")).toBeHidden();
});
test("a dropped .sqlplan file decodes and is accepted", async ({ page }) => {
await page.goto("/app");
await page.setInputFiles('input[type="file"]', "fixtures/sample.sqlplan");
const value = await page.locator("#xml").inputValue();
expect(value).toContain("ShowPlanXML");
expect(value).not.toContain("\u0000");
expect(value).not.toContain("\ufeff");
});
test("a pasted SQL script is refused with a named reason", async ({ page }) => {
await page.goto("/app");
await page.fill("#xml", "SELECT * FROM dbo.Orders WHERE CustomerId = 42;");
await page.getByRole("button", { name: "Analyse" }).click();
await expect(page.getByRole("alert").filter({ hasText: "digesting" })).toBeVisible({ timeout: 30_000 });
await expect(page.locator("#report")).toHaveCount(0);
});