49 lines
4.4 KiB
TypeScript
49 lines
4.4 KiB
TypeScript
import {test,expect,type Page} from "@playwright/test"
|
|
const row=(changed=true)=>({id:"i",interface:"ether1",currentCost:changed?10:20,optimalCost:20,score:50,pingMs:10,dlMbps:100,ulMbps:50})
|
|
async function setup(page:Page,mode:string,delayed=false){
|
|
let writes=0,previews=0,applied=false,started=false,release!:()=>void
|
|
const gate=new Promise<void>(resolve=>{release=resolve})
|
|
await page.route("**/health",r=>r.fulfill({json:{ok:true}}))
|
|
await page.route("**/api/**",async r=>{
|
|
const p=new URL(r.request().url()).pathname
|
|
if(p.endsWith("/ospf/optimize")){
|
|
writes++;started=true;if(delayed)await gate
|
|
const receipt={serverId:1,serverName:"Роутер 1",pingWeight:60,optimizedCount:1,applied:[{interface:"ether1",from:10,to:20}],interfaces:[row()]}
|
|
if(mode==="success")applied=true
|
|
return r.fulfill(mode==="http"?{status:503,json:{error:"Ошибка записи"}}:{json:mode==="foreign"?{...receipt,serverId:2}:mode==="weight"?{...receipt,pingWeight:20}:mode==="count"?{...receipt,applied:[]}:mode==="missing"?{}:receipt})
|
|
}
|
|
if(p.endsWith("/preview")){previews++;const item=row(!applied);return r.fulfill({json:{serverId:1,serverName:"Роутер 1",pingWeight:60,interfacesTotal:1,changedCount:applied?0:1,unchangedCount:applied?1:0,interfaces:[item],changes:applied?[]:[item]}})}
|
|
return r.fulfill({json:p==="/api/auth/config"?{required:mode==="readonly"}:p==="/api/servers"?[1,2].map(id=>({id,name:"Роутер "+id,host:"192.0.2."+id,type:"home-router",country:"RU",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:[]}:{}})
|
|
})
|
|
await page.goto("/route-optimizer")
|
|
const button=page.getByRole("button",{name:"Оптимизировать OSPF",exact:true})
|
|
await expect(page.getByRole("table").filter({hasText:"Speed (dl/ul)"}).locator("tr[data-row-id]")).toHaveCount(1)
|
|
return {button,writes:()=>writes,previews:()=>previews,started:()=>started,release:()=>release()}
|
|
}
|
|
for(const mode of ["success","http","foreign","weight","count","missing"])test("Оптимизатор: подтверждение OSPF "+mode,async({page})=>{
|
|
const state=await setup(page,mode),before=state.previews()
|
|
await expect(state.button).toBeEnabled();await state.button.click()
|
|
if(mode==="success")await expect(page.getByRole("status").filter({hasText:"Последнее подтверждение API"})).toBeVisible()
|
|
else{await expect(page.getByRole("alert").filter({hasText:mode==="http"?"Ошибка записи":"Применение OSPF не подтверждено"})).toBeVisible();await expect(page.getByText(/Последнее подтверждение API/)).toHaveCount(0)}
|
|
await expect.poll(state.previews).toBeGreaterThan(before)
|
|
if(mode==="success"){await expect(page.getByText("0 из 1 изменятся",{exact:true})).toBeVisible();await expect(state.button).toBeDisabled()}
|
|
else await expect(state.button).toBeEnabled()
|
|
expect(state.writes()).toBe(1)
|
|
})
|
|
test("Оптимизатор: повтор и смена устройства заблокированы до receipt",async({page})=>{
|
|
const state=await setup(page,"success",true)
|
|
await state.button.evaluate(button=>{(button as HTMLButtonElement).click();(button as HTMLButtonElement).click()})
|
|
await expect.poll(state.started).toBe(true);await expect(page.locator("select")).toBeDisabled()
|
|
await expect(page.getByRole("button",{name:"Настройки оптимизатора",exact:true})).toBeDisabled()
|
|
expect(state.writes()).toBe(1);state.release()
|
|
await expect(page.getByRole("status").filter({hasText:"Последнее подтверждение API"})).toBeVisible()
|
|
})
|
|
test("Оптимизатор: readonly preview доступен без применения",async({page})=>{
|
|
const claims={sub:"test",email:"[email protected]",name:"Reader",apps:["mm"],permissions:["mm:network:read"],exp:4102444800}
|
|
await page.addInitScript(value=>localStorage.setItem("mmapp_token","test."+btoa(JSON.stringify(value))+".test"),claims)
|
|
const state=await setup(page,"readonly");await expect(state.button).toBeDisabled()
|
|
await expect(page.getByText("Доступен просмотр OSPF. Для применения требуется право изменения сети.",{exact:true})).toBeVisible()
|
|
await expect(page.getByText("0 iface · 0 area",{exact:true})).toBeVisible()
|
|
expect(state.writes()).toBe(0)
|
|
})
|