fix(ui): сохранять каталог устройств диагностики при отказе

This commit is contained in:
Denozordec committed 2026-10-01 04:11:43 +07:00
1 parent 6fa8e5bfd1
commit cba3db1508
7 files changed
+78 -46

No files matched your search

+19 -1
View File
@@ -1,5 +1,5 @@
import { test, expect, type Page } from "@playwright/test"
const devices=[{id:1,name:"Первый",host:"192.0.2.1",site:"Тест",country:"RU",asn:"AS64500",type:"vps",enabled:true,status:"online",latency:null}]
const devices=[{id:1,name:"Первый",host:"192.0.2.1",site:"Тест",country:"RU",asn:"AS64500",type:"exit-node",enabled:true,status:"online",latency:null}]
async function routes(page:Page){
await page.route("**/health",r=>r.fulfill({json:{ok:true}}))
await page.route("**/api/**",r=>{const p=new URL(r.request().url()).pathname;return r.fulfill({json:p==="/api/servers"?devices:p==="/api/auth/config"?{required:false}:p.endsWith("/ros-src-address")?{ipv4:"192.0.2.1"}:{tunnels:[]}})})
@@ -33,3 +33,21 @@ test("Диагностика: уход со страницы не перенос
await page.route("**/api/servers/1/probes/run",async r=>{if(first){first=false;await gate;await r.fulfill({json:{output:"СТАРЫЙ ВЫВОД"}}).catch(()=>{})}else await r.fulfill({json:{output:"НОВЫЙ ВЫВОД"}})})
await page.goto("/probes");await run(page).click();await expect(run(page)).toBeDisabled();await page.goto("/terminal");release();await page.goto("/probes");await run(page).click();await expect(page.getByText("НОВЫЙ ВЫВОД",{exact:true})).toBeVisible();await expect(page.getByText("СТАРЫЙ ВЫВОД",{exact:true})).toHaveCount(0)
})
for(const malformed of [false,true])test("Диагностика: первоначальный отказ каталога и повтор "+malformed,async({page})=>{
let fail=true;await page.route("**/api/servers",r=>r.fulfill(fail?(malformed?{json:[{...devices[0],enabled:"yes"}]}:{status:403,json:{error:"Каталог запрещён"}}):{json:devices}))
await page.goto("/probes");await expect(page.getByRole("alert",{name:"Каталог диагностики"})).toContainText("Устройства пока неизвестны");await expect(run(page)).toBeDisabled()
fail=false;await page.getByRole("button",{name:"Обновить устройства диагностики"}).click();await expect(run(page)).toBeEnabled()
})
test("Диагностика: фоновая ошибка сохраняет список и цель до повтора",async({page})=>{
let fail=false;await page.route("**/api/servers",r=>r.fulfill(fail?{status:503,json:{error:"Каталог недоступен"}}:{json:devices}))
await page.goto("/probes");await expect(run(page)).toBeEnabled();await page.getByRole("textbox",{name:"Цель диагностики"}).fill("198.51.100.5");fail=true;await page.getByRole("button",{name:"Обновить устройства диагностики"}).click()
await expect(page.getByRole("alert",{name:"Каталог диагностики"})).toContainText("Последний список сохранён");await expect(page.getByRole("option",{name:/Первый/})).toBeVisible();await expect(run(page)).toBeDisabled();await expect(page.getByRole("textbox",{name:"Цель диагностики"})).toHaveValue("198.51.100.5")
fail=false;await page.getByRole("button",{name:"Обновить устройства диагностики"}).click();await expect(run(page)).toBeEnabled();await expect(page.getByRole("textbox",{name:"Цель диагностики"})).toHaveValue("198.51.100.5")
})
test("Диагностика: пустой каталог отличается от отказа",async({page})=>{
await page.route("**/api/servers",r=>r.fulfill({json:[]}));await page.goto("/probes");await expect(page.getByRole("status").filter({hasText:"В каталоге нет устройств"})).toBeVisible();await expect(page.getByRole("alert",{name:"Каталог диагностики"})).toHaveCount(0);await expect(run(page)).toBeDisabled()
})
test("Диагностика: неизвестный статус не становится offline",async({page})=>{
await page.route("**/api/servers",r=>r.fulfill({json:[{...devices[0],status:null}]}));await page.goto("/probes");await expect(run(page)).toBeEnabled();await expect(page.getByRole("option",{name:/Первый/})).not.toHaveAccessibleName(/Не в сети|offline/i)
})