Files
pleno-vue/tests/e2e/self-serve-sessions.spec.js

125 lines
4.5 KiB
JavaScript

import { expect, test } from "@playwright/test";
import { mockApi, seedAuthenticatedState } from "./support/network.js";
function waitForForceStopRequest(page, bill) {
return page.waitForRequest((request) => {
if (!request.url().includes("/modules/self-serve/lane/force/stop")) {
return false;
}
if (request.method() !== "POST") {
return false;
}
const body = request.postDataJSON?.() || {};
return body.bill === bill;
});
}
async function warmSelfServeSessionsRoute(page) {
const routeModules = [
"/src/views/dashboards/superUserDashboard/SelfServeSessions.vue",
"/src/views/dashboards/superUserDashboard/selfserve/SelfServeSuperUserTabs.vue",
"/src/views/dashboards/superUserDashboard/selfserve/components/SelfServeMachineConnectivity.vue",
"/src/views/dashboards/superUserDashboard/selfserve/components/SelfServeConnectivityRelay.vue",
];
for (const routeModule of routeModules) {
await expect
.poll(
async () => {
const response = await page.request.get(routeModule);
return response.status();
},
{ timeout: 120_000 }
)
.toBe(200);
}
}
async function gotoSessionsPage(page) {
const heading = page.getByRole("heading", { name: "Selvvask Sessions" });
for (let attempt = 0; attempt < 2; attempt += 1) {
await page.goto("/superuser/selfserve/sessions", { waitUntil: "domcontentloaded", timeout: 120_000 });
await expect(page).toHaveURL(/\/superuser\/selfserve\/sessions$/);
try {
await expect(heading).toBeVisible({ timeout: 45_000 });
return;
} catch (error) {
if (attempt === 1) {
throw error;
}
}
}
}
test.describe("Self-serve sessions management", () => {
test("lists, filters, opens detail, and force-stops sessions with and without billing", async ({ page }) => {
test.setTimeout(240_000);
await mockApi(page, {
authenticated: true,
permissions: [
"user",
"superuser",
"modules_selfserve_sessions_view",
"modules_selfserve_sessions_force_stop",
"modules_selfserve_sessions_force_stop_bill",
],
selfServe: true,
});
await seedAuthenticatedState(page, "self-serve-sessions-token");
await warmSelfServeSessionsRoute(page);
await gotoSessionsPage(page);
const row701 = page.locator("tr", { hasText: "#701" });
const row702 = page.locator("tr", { hasText: "#702" });
await expect(row701).toContainText("AB12345");
await expect(row702).toContainText("CD67890");
await page.getByRole("searchbox", { name: "Search" }).fill("CD67890");
await page.getByRole("button", { name: "Apply" }).click();
await expect(row702).toBeVisible();
await expect(row701).toBeHidden();
await page.getByRole("button", { name: "Reset" }).click();
await expect(row701).toBeVisible();
await row701.click();
const detail = page.getByRole("complementary");
await expect(detail).toContainText("Session #701");
await expect(detail).toContainText("Is the tarp removed?");
await expect(detail).toContainText("SESSION_SYNCED");
await row701.getByRole("button", { name: "Force stop" }).click();
const dialog = page.getByRole("dialog");
await expect(dialog).toContainText("does not signal relays or gates");
await dialog.getByLabel("Bill elapsed minutes").check();
await expect(dialog).toContainText("elapsed-minute only");
await dialog.getByLabel("Reason").fill("Operator emergency clear");
const billRequestPromise = waitForForceStopRequest(page, true);
await dialog.getByRole("button", { name: "Force stop" }).click();
const billRequest = await billRequestPromise;
expect(billRequest.postDataJSON?.()).toMatchObject({
lane_id: 7,
session_id: 701,
bill: true,
reason: "Operator emergency clear",
});
await expect(dialog).toBeHidden();
await expect(detail).toContainText("SESSION_FORCE_STOPPED");
await row702.getByRole("button", { name: "Force stop" }).click();
const noBillDialog = page.getByRole("dialog");
await expect(noBillDialog.getByLabel("Bill elapsed minutes")).not.toBeChecked();
const noBillRequestPromise = waitForForceStopRequest(page, false);
await noBillDialog.getByRole("button", { name: "Force stop" }).click();
const noBillRequest = await noBillRequestPromise;
expect(noBillRequest.postDataJSON?.()).toMatchObject({
lane_id: 9,
session_id: 702,
bill: false,
});
await expect(page.getByText("No sessions found.")).toBeVisible();
});
});