One-off Playwright script (excluded from the regular suite) capturing the demo entry (desktop+mobile), dashboard with scenarios, Demo Guide, return preview/result, data-quality resolution, duplicate-customer merge, knowledge assistant, integration status, automation retry, audit trail + related-events, About page, demo badge popover, and reset confirmation -- captured live against the Unraid deployment.
95 lines
5.1 KiB
TypeScript
95 lines
5.1 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
// One-off tooling to capture demo-productization evidence screenshots for
|
|
// artifacts/demo-release/final-summary.md. Not part of the regular test suite
|
|
// (prefixed with `_` and excluded from the configured test run via testIgnore).
|
|
|
|
const OUT = "../artifacts/demo-release/screenshots";
|
|
|
|
test("capture demo-release evidence screenshots", async ({ page, request }) => {
|
|
await request.post("/api/v1/demo/login", { data: { role: "operations_manager" } });
|
|
await request.post("/api/v1/demo/reset");
|
|
|
|
await page.goto("/login");
|
|
await expect(page.getByText(/Northstar Mobility/)).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/01-demo-entry-desktop.png`, fullPage: true });
|
|
|
|
await page.setViewportSize({ width: 390, height: 844 });
|
|
await page.screenshot({ path: `${OUT}/02-demo-entry-mobile.png` });
|
|
await page.setViewportSize({ width: 1280, height: 900 });
|
|
|
|
await page.getByRole("button", { name: "Verken als Operations Manager" }).click();
|
|
await expect(page).toHaveURL(/\/dashboard$/);
|
|
await expect(page.getByText("Probeer een demonstratiescenario")).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/03-dashboard-with-scenarios.png`, fullPage: true });
|
|
|
|
await page.getByRole("button", { name: /Demo-gids/ }).click();
|
|
await expect(page.getByRole("dialog", { name: "Gegidste demo" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/04-demo-guide.png` });
|
|
await page.getByRole("button", { name: "Sluiten" }).click();
|
|
|
|
await page.goto("/bookings/BK-DEMO-RETURN");
|
|
await expect(page.getByText("Demonstratiescenario: afwijkende kilometerstand")).toBeVisible();
|
|
await page.getByRole("button", { name: "Review return" }).click();
|
|
await expect(page.getByText(/Expected fleet state/)).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/05-return-preview.png`, fullPage: true });
|
|
await page.getByRole("button", { name: "Confirm return" }).click();
|
|
await expect(page.getByRole("heading", { name: "Return registered" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/06-return-result.png`, fullPage: true });
|
|
|
|
await page.goto("/data-quality");
|
|
await expect(page.locator(".data-table tbody tr").first()).toBeVisible();
|
|
await page.locator(".data-table tbody tr").first().locator("a").click();
|
|
await expect(page.getByText("What's wrong")).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/07-data-quality-resolution.png`, fullPage: true });
|
|
await page.getByRole("radio", { name: /Retain canonical/ }).check();
|
|
await page.getByRole("button", { name: "Resolve issue" }).click();
|
|
await expect(page.getByText(/Issue .* resolved/)).toBeVisible();
|
|
|
|
await page.goto("/data-quality/DQ-DEMO-DUPLICATE");
|
|
await expect(page.getByRole("heading", { name: "Compare and merge" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/08-duplicate-customer-merge.png`, fullPage: true });
|
|
|
|
await page.goto("/knowledge");
|
|
await page.getByRole("button", { name: "What must I do when a vehicle returns with damage?" }).click();
|
|
await expect(page.getByText("Grounded in cited procedures")).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/09-knowledge-assistant.png`, fullPage: true });
|
|
|
|
await page.goto("/automation");
|
|
await expect(page.locator(".integration-cards")).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/10-integration-status.png`, fullPage: true });
|
|
const failedRetry = page.locator(".data-table tbody tr", { hasText: "failed" }).first();
|
|
if (await failedRetry.count()) {
|
|
await page.screenshot({ path: `${OUT}/11-automation-retry-before.png`, fullPage: true });
|
|
await failedRetry.getByRole("button", { name: "Retry" }).click();
|
|
await page.waitForTimeout(500);
|
|
await page.screenshot({ path: `${OUT}/11-automation-retry-after.png`, fullPage: true });
|
|
}
|
|
|
|
await page.goto("/audit");
|
|
await expect(page.locator(".data-table tbody tr").first()).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/12-audit-trail.png`, fullPage: true });
|
|
await page.locator(".data-table tbody tr").first().getByRole("button", { name: "View related events" }).click();
|
|
await page.screenshot({ path: `${OUT}/13-audit-related-events.png`, fullPage: true });
|
|
|
|
await page.goto("/about");
|
|
await expect(page.getByRole("heading", { name: "Wat MobilityOps wel en niet is" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/14-about-demo.png`, fullPage: true });
|
|
|
|
await page.goto("/dashboard");
|
|
await page.getByRole("button", { name: /Synthetische demo/ }).click();
|
|
await expect(page.getByRole("dialog", { name: "Over deze demo-omgeving" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/15-demo-badge-popover.png` });
|
|
|
|
// Final reset, captured, to leave the environment fully restored.
|
|
await page.keyboard.press("Escape");
|
|
const resetButton = page.getByRole("button", { name: "Reset demo data" });
|
|
if (await resetButton.count()) {
|
|
await resetButton.click();
|
|
await expect(page.getByRole("button", { name: "Yes, reset" })).toBeVisible();
|
|
await page.screenshot({ path: `${OUT}/16-reset-confirm.png` });
|
|
await page.getByRole("button", { name: "Yes, reset" }).click();
|
|
await expect(page).toHaveURL(/\/login$/);
|
|
}
|
|
});
|