import { test, expect } from '@playwright/test' test('WireGuard: меню переживает refresh и использует новое состояние интерфейса', async ({ page }) => { let refreshing = false, release: (() => void) | undefined, patches = 0 const gate = new Promise(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) })