Files
dc-observatio/services/pcp-tgu-ui-service/e2e-verify/editor.mjs
T

61 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 p = await (await b.newContext({ viewport: { width: 1600, height: 900 } })).newPage();
const consoleErrors = [];
p.on("console", (m) => { if (m.type() === "error") consoleErrors.push(m.text()); });
p.on("pageerror", (e) => consoleErrors.push("PAGEERROR: " + e.message));
try {
await p.goto(BASE, { waitUntil: "networkidle", timeout: 30000 });
await p.waitForTimeout(800);
// выбрать КА 56756 и открыть редактор
await p.getByText("NORAD 56756", { exact: false }).first().click();
await p.waitForTimeout(500);
await p.getByRole("tab", { name: "Редактор", exact: true }).click();
await p.waitForTimeout(700);
// контролы редактора
const shoot = p.getByRole("button", { name: "+ Съёмка", exact: true });
const drop = p.getByRole("button", { name: "+ Сброс", exact: true });
(await shoot.count()) > 0 && (await drop.count()) > 0
? pass("editor:controls", "+ Съёмка / + Сброс присутствуют")
: fail("editor:controls");
// режим «Сброс» -> ЗРВ реальных станций
await drop.click();
const rva = await p.waitForResponse((r) => /\/api\/satellites\/\d+\/rva/.test(r.url()), { timeout: 15000 }).catch(() => null);
await p.waitForTimeout(1000);
rva && rva.status() === 200
? pass("editor:drop-fetches-rva", `GET rva ${rva.status()}`)
: fail("editor:drop-fetches-rva", rva ? `status ${rva.status()}` : "не вызван");
const panelText = (await p.locator("aside, [class*='panel']").allInnerTexts().catch(() => [])).join(" ").replace(/\n+/g, " ");
const stationNames = ["Шпицберген", "Отрадное", "Байконур", "Ханты-Мансийск"];
const found = stationNames.filter((s) => panelText.includes(s));
found.length >= 2
? pass("editor:drop-real-stations", `зоны по станциям: ${found.join(", ")}`)
: fail("editor:drop-real-stations", `найдено станций: ${JSON.stringify(found)}`);
// зоны содержат виток + время (UTC-окно)
/виток\s*\d+/i.test(panelText) && /\d{2}:\d{2}[-]\d{2}:\d{2}/.test(panelText)
? pass("editor:drop-zone-format", "виток + временное окно показаны")
: fail("editor:drop-zone-format", panelText.slice(0, 200));
consoleErrors.length === 0 ? pass("no-console-errors") : fail("no-console-errors", JSON.stringify(consoleErrors.slice(0, 8)));
} catch (e) {
fail("SCRIPT", e.message);
console.log(e.stack);
} finally {
const npass = results.filter((r) => r[0] === "PASS").length;
const nfail = results.filter((r) => r[0] === "FAIL").length;
console.log(`\n=== EDITOR SUMMARY: ${npass} PASS / ${nfail} FAIL ===`);
await b.close();
process.exit(nfail > 0 ? 1 : 0);
}