Files
MikrotikManager/tests/e2e/route-optimizer-context.spec.ts

36 lines
3.8 KiB
TypeScript

import {test,expect} from "@playwright/test"
const headers={"access-control-allow-origin":"*","access-control-allow-methods":"GET,POST,OPTIONS","access-control-allow-headers":"Content-Type,Authorization"}
const item=(name:string)=>({id:"i",interface:name,currentCost:10,optimalCost:20,score:50,pingMs:10,dlMbps:100,ulMbps:50})
for(const change of ["backend","mode"])for(const operation of ["preview","write"])for(const fails of [false,true])test("Оптимизатор: поздний "+operation+"/"+change+"/"+fails,async({page})=>{
let newReads=0,started=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++
const row=item(u.port==="8101"?"ether-new":"ether-old")
return r.fulfill({headers,json:p==="/api/auth/config"?{required:false}:p==="/api/servers"?[{id:1,name:"Router",host:"192.0.2.1",country:"RU",type:"home-router",enabled:true,status:null}]:p==="/api/filters/rules"?{rulesets:[]}:p==="/api/uptime/speed-probes"?{probes:[]}:p==="/api/ospf/catalog"?{interfaces:[],instances:[],neighbors:[],bfdSessions:[],routes:[],failures:[]}:p.endsWith("/preview")?{serverId:1,serverName:"Router",pingWeight:60,interfacesTotal:1,changedCount:1,unchangedCount:0,interfaces:[row],changes:[row]}:{}})
})
await page.goto("/settings");await page.getByRole("link",{name:/^Оптимизатор маршрутов/}).click()
const grid=page.getByRole("table").filter({hasText:"Speed (dl/ul)"})
await expect(grid).toContainText("ether-old");await expect(page.getByText("0 iface · 0 area",{exact:true})).toBeVisible()
const path=operation==="preview"?"/api/servers/1/ospf/optimize/preview":"/api/servers/1/ospf/optimize"
await page.route("**/api/servers/**",async r=>{
const u=new URL(r.request().url());if(u.port!=="8000"||u.pathname!==path)return r.fallback()
started=true;await gate;const row=item("ether-late")
return r.fulfill(fails?{headers,status:503,json:{error:"Старая ошибка оптимизатора"}}:{headers,json:operation==="preview"?{serverId:1,serverName:"Старый сервер",pingWeight:60,interfacesTotal:1,changedCount:1,unchangedCount:0,interfaces:[row],changes:[row]}:{serverId:1,serverName:"Старый сервер",pingWeight:60,optimizedCount:1,applied:[{interface:"ether-late",from:10,to:20}],interfaces:[row]}})
})
await page.getByRole("button",{name:operation==="preview"?"Обновить preview OSPF":"Оптимизировать OSPF",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(grid).toContainText("ether-new");await expect(page.getByText("0 iface · 0 area",{exact:true})).toBeVisible()}
else await expect(page.getByText("Доступно только в режиме живых данных.",{exact:true})).toBeVisible()
const before=newReads,response=page.waitForResponse(r=>new URL(r.url()).port==="8000"&&new URL(r.url()).pathname===path)
release();await(await response).finished()
await page.evaluate(()=>new Promise<void>(resolve=>requestAnimationFrame(()=>requestAnimationFrame(()=>resolve()))))
if(change==="backend")await expect(grid).toContainText("ether-new")
await expect(page.getByText("Старая ошибка оптимизатора",{exact:false})).toHaveCount(0)
await expect(page.getByText("Старый сервер",{exact:false})).toHaveCount(0)
expect(newReads).toBe(before)
})