Two demo-guide.spec.ts tests navigated straight to /scenarios right after clicking a login button without waiting for the /dashboard redirect to settle first. This raced harmlessly on localhost but flaked against the higher-latency Unraid deployment, hitting RequireAuth before the session was confirmed.
88 lines
4.1 KiB
TypeScript
88 lines
4.1 KiB
TypeScript
import { expect, test, type APIRequestContext } from "@playwright/test";
|
|
|
|
async function resetDemoData(request: APIRequestContext) {
|
|
const login = await request.post("/api/v1/demo/login", { data: { role: "operations_manager" } });
|
|
expect(login.ok()).toBeTruthy();
|
|
const reset = await request.post("/api/v1/demo/reset");
|
|
expect(reset.ok()).toBeTruthy();
|
|
}
|
|
|
|
test.describe.configure({ mode: "serial" });
|
|
|
|
test("scenario overview lists all 5 scenarios, ready right after a reset", async ({ page, request }) => {
|
|
await resetDemoData(request);
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Verken als Operations Manager" }).click();
|
|
await expect(page).toHaveURL(/\/dashboard$/);
|
|
await page.goto("/scenarios");
|
|
|
|
await expect(page.getByRole("heading", { name: "Probeer een demonstratiescenario" })).toBeVisible();
|
|
const cards = page.locator(".scenario-card");
|
|
await expect(cards).toHaveCount(5);
|
|
for (const label of ["Klaar voor demo"]) {
|
|
await expect(page.getByText(label).first()).toBeVisible();
|
|
}
|
|
await expect(page.getByText("Niet beschikbaar")).toHaveCount(0);
|
|
});
|
|
|
|
test("starting a scenario navigates to its fixed record", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Verken als Operations Manager" }).click();
|
|
await expect(page).toHaveURL(/\/dashboard$/);
|
|
await page.goto("/scenarios");
|
|
|
|
const duplicateCard = page.locator(".scenario-card", { hasText: "dubbele klant" });
|
|
await duplicateCard.getByRole("link", { name: "Start scenario" }).click();
|
|
await expect(page).toHaveURL(/\/data-quality\/DQ-DEMO-DUPLICATE$/);
|
|
});
|
|
|
|
test("demo guide: navigating steps, jumping to a step, and closing works", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Start begeleide demo" }).click();
|
|
await expect(page.getByRole("dialog", { name: "Gegidste demo" })).toBeVisible();
|
|
await expect(page.getByRole("heading", { name: "1. Begrijp de operationele status" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: "Volgende" }).click();
|
|
await expect(page.getByRole("heading", { name: "2. Open een boeking die aandacht nodig heeft" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: /6\. Stel een vraag/ }).click();
|
|
await expect(page.getByRole("heading", { name: "6. Stel een vraag aan de procedureassistent" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: "Ga naar deze stap" }).click();
|
|
await expect(page).toHaveURL(/\/knowledge$/);
|
|
await expect(page.getByRole("dialog", { name: "Gegidste demo" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: "Sluiten" }).click();
|
|
await expect(page.getByRole("dialog", { name: "Gegidste demo" })).toBeHidden();
|
|
});
|
|
|
|
test("demo guide progress persists across navigation and the trigger shows it", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Start begeleide demo" }).click();
|
|
await page.getByRole("button", { name: "Volgende" }).click();
|
|
await page.getByRole("button", { name: "Volgende" }).click();
|
|
await page.getByRole("button", { name: "Sluiten" }).click();
|
|
|
|
await expect(page.getByRole("button", { name: /Demo-gids/ })).toContainText("2/8");
|
|
|
|
await page.goto("/vehicles");
|
|
await page.getByRole("button", { name: /Demo-gids/ }).click();
|
|
await expect(page.getByRole("heading", { name: "3. Verwerk een retour" })).toBeVisible();
|
|
});
|
|
|
|
test("demo guide is not shown to a rental employee", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Verken als Rental Employee" }).click();
|
|
await expect(page).toHaveURL(/\/dashboard$/);
|
|
await expect(page.getByRole("button", { name: /Demo-gids/ })).toHaveCount(0);
|
|
});
|
|
|
|
test("restarting the demo from the guide resets data and returns to login", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByRole("button", { name: "Start begeleide demo" }).click();
|
|
await expect(page.getByRole("dialog", { name: "Gegidste demo" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: "Demo opnieuw voorbereiden" }).click();
|
|
await expect(page).toHaveURL(/\/login$/, { timeout: 10000 });
|
|
});
|