// Проверка 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 присутствуют сразу несколько
await tab("Планы").click(); await p.waitForTimeout(200); const mains = await p.locator(".tgu-app-shell main").count(); mains >= 3 ? pass("keep-alive:tabs-mounted", `
в 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); }