61 lines
3.1 KiB
JavaScript
61 lines
3.1 KiB
JavaScript
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);
|
||
}
|