const { test, expect } = require("@playwright/test"); const registrationTimeoutMs = Number(process.env.CARD_REGISTRATION_TIMEOUT_MS || "90000"); const loginTimeoutMs = Number(process.env.CARD_LOGIN_TIMEOUT_MS || "90000"); function uniqueUsername() { return `pw_${Date.now().toString(36)}`; } async function waitForActionResult(page, action, expectedText, timeoutMs) { const flowResult = page.locator("#flowResult"); await action(); await expect(flowResult).toContainText(expectedText, { timeout: timeoutMs }); } test.describe("k_client portal regression", () => { test("registers, logs in, reads counter, logs out, and unregisters", async ({ page }) => { const username = uniqueUsername(); const usersList = page.locator("#usersList"); const flowResult = page.locator("#flowResult"); const sessionLine = page.locator("#stateSession"); test.setTimeout(registrationTimeoutMs + loginTimeoutMs + 90_000); await page.goto("/"); await expect(page.getByRole("heading", { name: "ChromeCard Client Flow" })).toBeVisible(); await page.getByLabel("Username").fill(username); await test.step("Register user", async () => { // Card step: press yes on the registration prompt. await waitForActionResult( page, () => page.getByRole("button", { name: "Register User" }).click(), "User registration succeeded.", registrationTimeoutMs ); await expect(usersList).toContainText(username); }); await test.step("Login", async () => { // Card step: press yes on the authentication prompt. await waitForActionResult( page, () => page.getByRole("button", { name: "Login" }).click(), "Login succeeded. You can now call k_server.", loginTimeoutMs ); await expect(sessionLine).toContainText("Session active: yes"); }); await test.step("Call k_server counter", async () => { await page.getByRole("button", { name: "Call k_server" }).click(); await expect(flowResult).toContainText("k_server was reached. Counter value:"); }); await test.step("Logout", async () => { await page.getByRole("button", { name: "Logout" }).click(); await expect(flowResult).toContainText("Session cleared."); await expect(sessionLine).toContainText("Session active: no"); }); await test.step("Unregister user", async () => { const row = usersList.locator(".user-row", { hasText: username }); await expect(row).toBeVisible(); await row.getByRole("button", { name: "Unregister" }).click(); await expect(flowResult).toContainText(`User ${username} was unregistered.`); await expect(usersList).not.toContainText(username); }); }); });