Files
MikrotikManager/tests/e2e/wireguard-menu-refresh.spec.ts

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)
})