125 lines
4.5 KiB
JavaScript
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();
|
|
});
|
|
});
|