36 lines
2.2 KiB
TypeScript
36 lines
2.2 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
test('WireGuard: меню переживает refresh и использует новое состояние интерфейса', async ({ page }) => {
|
|
let refreshing = false, release: (() => void) | undefined, patches = 0
|
|
const gate = new Promise<void>(resolve => { release = resolve })
|
|
const iface = { id: '1:*A', rosId: '*A', name: 'wg-menu', serverId: '1', serverName: 'CHR', listenPort: 51879, mtu: 1420, comment: '', enabled: true, status: 'up', peers: [] }
|
|
await page.route('**/health', route => route.fulfill({ json: { ok: true } }))
|
|
await page.route('**/api/**', async route => {
|
|
const path = new URL(route.request().url()).pathname
|
|
if (route.request().method() === 'PATCH') {
|
|
expect(path).toBe('/api/wireguard/interfaces/1/*A')
|
|
expect(route.request().postDataJSON()).toEqual({ disabled: false })
|
|
patches++
|
|
return route.fulfill({ json: { ok: true } })
|
|
}
|
|
if (path === '/api/wireguard') {
|
|
if (refreshing) await gate
|
|
return route.fulfill({ json: { interfaces: [{ ...iface, enabled: !refreshing, status: refreshing ? 'down' : 'up' }] } })
|
|
}
|
|
return route.fulfill({ json: path === '/api/auth/config' ? { required: false } : path === '/api/servers' ? [{ id: 1, name: 'CHR', host: '192.0.2.1', enabled: true, type: 'home-router', country: 'RU', status: 'online' }] : {} })
|
|
})
|
|
await page.goto('/wireguard')
|
|
const refresh = page.getByRole('button', { name: 'Обновить', exact: true })
|
|
await expect(refresh).toBeEnabled()
|
|
await page.getByRole('button', { name: 'Действия: wg-menu' }).click()
|
|
await expect(page.getByRole('menuitem', { name: 'Отключить', exact: true })).toBeVisible()
|
|
refreshing = true
|
|
await refresh.evaluate(e => (e as HTMLButtonElement).click())
|
|
await expect(refresh).toBeDisabled()
|
|
await expect(page.getByRole('menuitem', { name: 'Добавить пира', exact: true })).toBeVisible()
|
|
release!()
|
|
await expect(refresh).toBeEnabled()
|
|
await expect(page.getByRole('menuitem', { name: 'Включить', exact: true })).toBeVisible()
|
|
await page.getByRole('menuitem', { name: 'Включить', exact: true }).click()
|
|
await expect.poll(() => patches).toBe(1)
|
|
})
|