Files
dc-observatio/services/pcp-tgu-ops-ui/e2e-verify/keep-alive.mjs
T
Дмитрий Соловьев bd59204fcf Незакоммиченная работа: UI заявок/планирования и правки сервисов
- pcp-tgu-ops-ui: вкладка «Заявки», редактор планирования, утилиты uuid
  и e2e-verify скрипты, обновление зависимостей
- pcp-ballistics-service, pcp-mission-planing-service: текущие правки
2026-06-02 11:04:45 +03:00

80 lines
4.0 KiB
JavaScript

// Проверка keep-alive: состояние вкладок не сбрасывается при переключении.
import { chromium } from "playwright";
const BASE = "http://localhost:5174/";
const results = [];
const pass = (n, d = "") => { results.push(["PASS", n, d]); console.log("PASS ::", n, d); };
const fail = (n, d = "") => { results.push(["FAIL", n, d]); console.log("FAIL ::", n, d); };
const b = await chromium.launch({ headless: true });
const ctx = await b.newContext({ viewport: { width: 1600, height: 900 } });
const p = await ctx.newPage();
const consoleErrors = [];
p.on("console", (m) => { if (m.type() === "error") consoleErrors.push(m.text()); });
p.on("pageerror", (e) => consoleErrors.push("PAGEERROR: " + e.message));
const tab = (name) => p.getByRole("tab", { name, exact: true });
// только видимая (активная) вкладка — карта присутствует и в Заявках (рисование полигона)
const mapToggle = (label) => p.locator(".tgu-map-toolbar__toggles button:visible", { hasText: label });
const isActive = async (loc) => ((await loc.getAttribute("class")) || "").includes("is-active");
try {
await p.goto(BASE, { waitUntil: "networkidle", timeout: 30000 });
await p.waitForTimeout(600);
// --- Карта: меняем UI-состояние (выключаем слой «Станции») ---
await tab("Карта").click();
await p.waitForTimeout(500);
const stationsToggle = mapToggle("Станции");
(await isActive(stationsToggle)) ? pass("map:stations-on-initially") : fail("map:stations-on-initially");
await stationsToggle.click();
await p.waitForTimeout(150);
(await isActive(stationsToggle)) === false
? pass("map:stations-toggled-off")
: fail("map:stations-toggled-off");
// --- Заявки: открываем форму создания (внутреннее состояние panelMode) ---
await tab("Заявки").click();
await p.waitForTimeout(400);
await p.getByRole("button", { name: "+ Создать заявку", exact: true }).click();
await p.waitForTimeout(250);
(await p.locator(".tgu-requests-form").count()) > 0
? pass("requests:create-form-open")
: fail("requests:create-form-open");
// --- уходим на Планы и возвращаемся ---
await tab("Планы").click();
await p.waitForTimeout(300);
// Карта: слой «Станции» по-прежнему выключен?
await tab("Карта").click();
await p.waitForTimeout(400);
(await isActive(mapToggle("Станции"))) === false
? pass("map:state-preserved", "слой «Станции» остался выключен")
: fail("map:state-preserved", "состояние слоёв сбросилось");
// Заявки: форма создания всё ещё открыта?
await tab("Заявки").click();
await p.waitForTimeout(400);
(await p.locator(".tgu-requests-form").count()) > 0
? pass("requests:state-preserved", "форма создания осталась открытой")
: fail("requests:state-preserved", "форма закрылась (состояние сброшено)");
// Скрытые вкладки не должны размонтироваться: в DOM присутствуют сразу несколько <main>
await tab("Планы").click();
await p.waitForTimeout(200);
const mains = await p.locator(".tgu-app-shell main").count();
mains >= 3
? pass("keep-alive:tabs-mounted", `<main> в DOM: ${mains}`)
: fail("keep-alive:tabs-mounted", `ожидалось >=3, найдено ${mains}`);
} catch (e) {
fail("EXCEPTION", e.message);
} finally {
if (consoleErrors.length) console.log("CONSOLE_ERRORS", JSON.stringify(consoleErrors, null, 2));
const failed = results.filter((r) => r[0] === "FAIL").length;
console.log(`\n=== ${results.length - failed}/${results.length} PASS, ${failed} FAIL ===`);
await b.close();
process.exit(failed ? 1 : 0);
}