38 lines
4.0 KiB
TypeScript
38 lines
4.0 KiB
TypeScript
import {test,expect} from "@playwright/test"
|
|
const empty={"hops":[],"live":false,"rangeMinutes":5,"windowSec":300,"totalBytes":0,"namedBytes":0,"unclassifiedBytes":0,"asnLoaded":false,"countryLoaded":false,"services":[],"serviceEdges":[],"servicePaths":[],"countries":[],"countryEdges":[],"countryPaths":[],"countryServiceGroups":[],"mapServiceMinSharePct":5,"dedupApplied":false,"excludeMeshApplied":false,"excludeOverlayApplied":false}
|
|
const headers={"access-control-allow-origin":"*","access-control-allow-methods":"GET,POST,OPTIONS","access-control-allow-headers":"Content-Type,Authorization"}
|
|
const wan={id:"w",name:"WAN",iface:"ether1",isp:"ISP",ip:"router.example",maxDl:100,maxUl:100}
|
|
const row=(name:string)=>({id:1,name,host:"192.0.2.1",type:"home-router",country:"RU",enabled:true,status:"online",wanUplinks:[wan]})
|
|
for(const change of ["backend","mode"])for(const part of ["snapshot","flow","dns"])for(const fails of [false,true])test("Карта: поздний "+part+"/"+change+"/"+fails,async({page})=>{
|
|
let newReads=0,started=false,completed=false,release!:()=>void;const gate=new Promise<void>(resolve=>{release=resolve})
|
|
await page.route("**/health",r=>r.fulfill({headers,json:{ok:true}}))
|
|
await page.route("**/api/**",r=>{
|
|
const u=new URL(r.request().url()),p=u.pathname;if(u.port==="8101")newReads++
|
|
return r.fulfill({headers,json:p==="/api/auth/config"?{required:false}:p==="/api/servers"?[row(u.port==="8101"?"Новая карта":"Прежняя карта")]:p==="/api/filters/gre-tunnels"?{tunnels:[],failures:[]}:p==="/api/uptime/speed-probes"?{probes:[]}:p==="/api/traffic/flow/map-hops"?empty:p==="/api/network/resolve-hosts"?{results:{"router.example":"192.0.2.2"}}:{}})
|
|
})
|
|
await page.goto("/settings");await page.getByRole("link",{name:/^Карта сети/}).click()
|
|
await expect(page.getByText("Прежняя карта",{exact:true}).first()).toBeVisible()
|
|
await expect(page.getByText(/NetFlow · 5 мин · ответ/)).toBeVisible()
|
|
const path=part==="snapshot"?"/api/servers":part==="flow"?"/api/traffic/flow/map-hops":"/api/network/resolve-hosts"
|
|
await page.route("**/api/**",async r=>{
|
|
const u=new URL(r.request().url());if(u.port!=="8000"||u.pathname!==path||started)return r.fallback()
|
|
started=true;await gate
|
|
try{await r.fulfill(fails?{headers,status:503,json:{error:"Старая ошибка карты"}}:{headers,json:part==="snapshot"?[row("Поздняя карта")]:part==="flow"?{...empty,services:[{id:"svc:late",label:"Поздний сервис",category:"Web",bytes:1,bps:1,share:1}]}:{results:{"router.example":null}}})}catch{}finally{completed=true}
|
|
})
|
|
await page.getByRole("button",{name:"Обновить",exact:true}).click()
|
|
await expect.poll(()=>started).toBe(true);await page.goBack();await expect(page).toHaveURL(/settings/)
|
|
if(change==="backend"){const input=page.getByPlaceholder("http://localhost:8000");await input.fill("http://localhost:8101");await input.press("Enter")}
|
|
else await page.getByRole("button",{name:"Моковые",exact:true}).click()
|
|
await page.getByRole("link",{name:/^Карта сети/}).click()
|
|
if(change==="backend"){await expect(page.getByText("Новая карта",{exact:true}).first()).toBeVisible();await expect(page.getByText(/NetFlow · 5 мин · ответ/)).toBeVisible()}
|
|
else await expect(page.getByText("Демо · mock",{exact:true})).toBeVisible()
|
|
const before=newReads;release();await expect.poll(()=>completed).toBe(true)
|
|
await page.evaluate(()=>new Promise<void>(resolve=>requestAnimationFrame(()=>requestAnimationFrame(()=>resolve()))))
|
|
await expect(page.getByText("Старая ошибка карты",{exact:false})).toHaveCount(0)
|
|
await expect(page.getByText("Поздняя карта",{exact:false})).toHaveCount(0)
|
|
await expect(page.getByText("Поздний сервис",{exact:false})).toHaveCount(0)
|
|
await expect(page.getByRole("alert").filter({hasText:"DNS не разрешён"})).toHaveCount(0)
|
|
if(change==="backend")await expect(page.getByText("Новая карта",{exact:true}).first()).toBeVisible()
|
|
expect(newReads).toBe(before)
|
|
})
|