29 lines
7.0 KiB
TypeScript
29 lines
7.0 KiB
TypeScript
import {test,expect,type Page} from "@playwright/test"
|
|
import {evoSettings,evoCatalog} from "./fixtures/evobgp"
|
|
async function setup(page:Page,settings:unknown=evoSettings,catalog:unknown=evoCatalog){await page.route("**/health",r=>r.fulfill({json:{ok:true}}));await page.route("**/api/**",r=>{const path=new URL(r.request().url()).pathname;return r.fulfill(path==="/api/auth/config"?{json:{required:false}}:path==="/api/evobgp/settings"?{json:settings}:path==="/api/evobgp/catalog"?{json:catalog}:{status:503,json:{error:"outside fixture"}})})}
|
|
const cases=[{path:"domains",mock:"youtube.com"},{path:"ip-ranges",mock:"8.8.8.0/24"},{path:"asns",mock:"AS15169"},{path:"communities",mock:"youtube-bypass"}]
|
|
for(const {path,mock} of cases)for(const state of ["unknown","disabled"] as const)test("Evolution catalog: "+path+"/"+state+" never shows mock rows or confirmed zero",async({page})=>{
|
|
await setup(page,state==="unknown"?{}:{...evoSettings,enabled:false});await page.goto("/"+path)
|
|
await expect(page.getByText(state==="unknown"?"Настройки EvoBGP неизвестны":"Интеграция EvoBGP выключена",{exact:true})).toBeVisible()
|
|
await expect(page.getByText("Данные каталога не получены",{exact:true})).toBeVisible()
|
|
await expect(page.getByText(mock,{exact:true})).toHaveCount(0)
|
|
await expect(page.getByRole("row")).toHaveCount(0)
|
|
if(path!=="communities")await expect(page.getByText("Количество: —",{exact:true})).toBeVisible()
|
|
await expect(page.getByRole("button",{name:/^Добавить/})).toHaveCount(0)
|
|
})
|
|
test("Evolution catalog: known empty differs from unread and permits refresh",async({page})=>{await setup(page,evoSettings,{...evoCatalog,domains:[]});await page.goto("/domains");await expect(page.getByText("Нет доменов",{exact:true})).toBeVisible();await expect(page.getByText("0 доменов",{exact:true})).toBeVisible();await expect(page.getByText("В подтверждённом каталоге нет записей этого типа",{exact:true})).toBeVisible();await expect(page.getByText("Данные каталога не получены",{exact:true})).toHaveCount(0)})
|
|
test("Evolution catalog: malformed initial response stays unread",async({page})=>{await setup(page,evoSettings,{});await page.goto("/domains");await expect(page.getByText("Каталог EvoBGP недоступен",{exact:true})).toBeVisible();await expect(page.getByText("Данные каталога не получены",{exact:true})).toBeVisible();await expect(page.getByText("0 доменов",{exact:true})).toHaveCount(0)})
|
|
test("Evolution catalog: refresh error preserves search, rows and freshness",async({page})=>{await setup(page);let fail=false;await page.route("**/api/evobgp/catalog",r=>r.fulfill(fail?{status:503,json:{error:"catalog down"}}:{json:evoCatalog}));await page.goto("/domains");await expect(page.getByText("kept.example.test",{exact:true})).toBeVisible();const stamp=page.getByRole("status").filter({hasText:/^Каталог EvoBGP получен:/});const before=await stamp.textContent();await page.getByRole("textbox",{name:"Поиск по домену…"}).fill("kept");fail=true;await page.getByRole("button",{name:"Обновить каталог EvoBGP",exact:true}).click();await expect(page.getByText("Каталог не обновлён; показаны последние данные",{exact:true})).toBeVisible();await expect(page.getByText("kept.example.test",{exact:true})).toBeVisible();await expect(stamp).toHaveText(before!);await expect(page.getByRole("textbox",{name:"Поиск по домену…"})).toHaveValue("kept")})
|
|
test("Evolution catalog: disabled can reload settings to discover enabled integration",async({page})=>{let enabled=false;await setup(page);await page.route("**/api/evobgp/settings",r=>r.fulfill({json:{...evoSettings,enabled}}));await page.goto("/domains");await expect(page.getByText("Интеграция EvoBGP выключена",{exact:true})).toBeVisible();enabled=true;await page.getByRole("button",{name:"Обновить каталог EvoBGP",exact:true}).click();await expect(page.getByText("kept.example.test",{exact:true})).toBeVisible()})
|
|
test("Evolution catalog: mock mode is explicit and does not read integration",async({page})=>{await page.addInitScript(()=>localStorage.setItem("routerlists:data-source","mock"));await setup(page);let requests=0;page.on("request",r=>{if(new URL(r.url()).pathname.startsWith("/api/evobgp/"))requests++});await page.goto("/asns");await expect(page.getByText("Демонстрационный каталог",{exact:true})).toBeVisible();await expect(page.getByText("AS15169",{exact:true})).toBeVisible();expect(requests).toBe(0)})
|
|
test("Evolution catalog: reader without admin cannot load integration or see demo data",async({page})=>{
|
|
const token="header."+Buffer.from(JSON.stringify({sub:"reader",apps:["mm"],permissions:["mm:dashboard:read","mm:filters:read"],exp:Math.floor(Date.now()/1000)+3600})).toString("base64url")+".fixture"
|
|
await page.addInitScript(value=>localStorage.setItem("mmapp_token",value),token);await setup(page);await page.route("**/api/auth/config",r=>r.fulfill({json:{required:true}}));let reads=0;page.on("request",r=>{if(new URL(r.url()).pathname.startsWith("/api/evobgp/"))reads++});await page.goto("/domains");await expect(page.getByText("Нет доступа к каталогу EvoBGP",{exact:true})).toBeVisible();await expect(page.getByRole("row")).toHaveCount(0);await expect(page.getByRole("button",{name:"Обновить каталог EvoBGP",exact:true})).toHaveCount(0);expect(reads).toBe(0)
|
|
})
|
|
test("Evolution catalog: selected community details follow refreshed snapshot",async({page})=>{
|
|
const community={id:"c",value:"64512:1",name:"Selected community",description:"",type:"custom",filterIds:[],serverCount:0,prefixCount:4,action:"permit",enabled:true};let prefixes=4;await setup(page);await page.route("**/api/evobgp/catalog",r=>r.fulfill({json:{...evoCatalog,communities:[{...community,prefixCount:prefixes}]}}));await page.goto("/communities");await page.getByRole("row").filter({hasText:"Selected community"}).click();const detail=page.getByText("Маршрутов",{exact:true}).locator("..");await expect(detail.getByText("4",{exact:true})).toBeVisible();prefixes=9;await page.getByRole("button",{name:"Обновить каталог EvoBGP",exact:true}).click();await expect(detail.getByText("9",{exact:true})).toBeVisible();await expect(detail.getByText("4",{exact:true})).toHaveCount(0)
|
|
})
|
|
for(const width of [1440,390,320])test("Evolution catalog: communities adaptive/"+width,async({page})=>{
|
|
await page.setViewportSize({width,height:1000});await setup(page,evoSettings,{});await page.goto("/communities");await expect(page.getByText("Данные каталога не получены",{exact:true})).toBeVisible();expect(await page.evaluate(()=>document.documentElement.scrollWidth<=window.innerWidth)).toBe(true);await page.screenshot({path:"docs/ux-ui/screens/evolution-communities-"+width+".png",fullPage:true,animations:"disabled"})
|
|
})
|