33 lines
3.2 KiB
TypeScript
33 lines
3.2 KiB
TypeScript
import { test, expect } from "@playwright/test"
|
|
const headers={"access-control-allow-origin":"*","access-control-allow-methods":"GET,PATCH,OPTIONS","access-control-allow-headers":"Content-Type,Authorization"}
|
|
const iface=(port:string)=>({id:"*1",rosId:"*1",name:port==="8101"?"Новый WireGuard":"Старый WireGuard",serverId:"1",serverName:"Роутер",listenPort:13231,mtu:1420,comment:"",enabled:true,status:"up",peers:[]})
|
|
for(const operation of ["read","toggle"])for(const change of ["backend","mode"])for(const fails of [false,true])test("WireGuard source context/"+operation+"/"+change+"/"+fails,async({page})=>{
|
|
let oldReads=0
|
|
await page.route("**/health",r=>r.fulfill({headers,json:{ok:true}}))
|
|
await page.route("**/api/**",r=>{const url=new URL(r.request().url()),p=url.pathname;if(p==="/api/wireguard"&&url.port==="8000")oldReads++;return r.fulfill({headers,json:p==="/api/wireguard"?{interfaces:[iface(url.port)]}:p==="/api/servers"?[{id:1,name:"Роутер",host:"192.0.2.1",country:"RU",enabled:true,status:null}]:p==="/api/auth/config"?{required:false}:{}})})
|
|
await page.goto("/settings");await page.getByRole("link",{name:/^WireGuard/}).click()
|
|
await expect(page.locator("tr[data-row-id]")).toContainText("Старый WireGuard")
|
|
let release:(()=>void)|undefined,started=false
|
|
const gate=new Promise<void>(resolve=>{release=resolve})
|
|
await page.route(operation==="read"?"**/api/wireguard":"**/api/wireguard/interfaces/**",async r=>{
|
|
const url=new URL(r.request().url());if(url.port!=="8000"||(operation==="toggle"&&r.request().method()!=="PATCH"))return r.fallback()
|
|
started=true;await gate
|
|
return r.fulfill(fails?{headers,status:503,json:{error:"Старая ошибка WireGuard"}}:{headers,json:operation==="read"?{interfaces:[]}:{ok:true}})
|
|
})
|
|
if(operation==="read")await page.getByRole("button",{name:"Обновить",exact:true}).click()
|
|
else{await page.getByRole("button",{name:"Действия: Старый WireGuard",exact:true}).click();await page.getByRole("menuitem",{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:/^WireGuard/}).click()
|
|
if(change==="backend")await expect(page.locator("tr[data-row-id]")).toContainText("Новый WireGuard")
|
|
else await expect(page.getByText("Mock-режим",{exact:true})).toBeVisible()
|
|
const before=oldReads,response=page.waitForResponse(r=>r.url().includes(":8000/api/wireguard")&&(operation==="read"||r.request().method()==="PATCH"))
|
|
release!();await(await response).finished();await page.evaluate(()=>new Promise<void>(resolve=>requestAnimationFrame(()=>requestAnimationFrame(()=>resolve()))))
|
|
if(change==="backend")await expect(page.locator("tr[data-row-id]")).toContainText("Новый WireGuard")
|
|
await expect(page.getByText("Старая ошибка WireGuard",{exact:true})).toHaveCount(0)
|
|
await expect(page.getByText("Отключено",{exact:true})).toHaveCount(0)
|
|
expect(oldReads).toBe(before)
|
|
})
|