import { observedTrafficFixturePayload } from "./traffic-observation-fixture" import { test, expect } from '@playwright/test' for (const outcome of ['success', 'error'] as const) { test(`Трафик: каталог ${outcome} не отправляет запросы к неподтверждённому серверу`, async ({ page }) => { let release!: () => void const gate = new Promise(resolve => { release = resolve }) const individual: string[] = [] const server = { id: '1', name: 'Подтверждённый сервер', site: 'TEST', country: 'RU', status: 'online', rxNow: 2, txNow: 3, rxPeak: 5, txPeak: 6, rxTotal: 100, txTotal: 200, sessions: 1, rxSeries: [1, 2], txSeries: [2, 3] } await page.route('**/health', route => route.fulfill({ json: observedTrafficFixturePayload({ ok: true }) })) await page.route('**/api/**', async route => { const path = new URL(route.request().url()).pathname if (/^\/api\/traffic\/servers\/[^/]+/.test(path)) individual.push(path) if (path === '/api/traffic/servers') { await gate if (outcome === 'error') return route.fulfill({ status: 503, json: observedTrafficFixturePayload({ error: 'Каталог временно недоступен' }) }) return route.fulfill({ json: observedTrafficFixturePayload({ servers: [server] }) }) } if (path.endsWith('/live')) return route.fulfill({ status: 503, json: observedTrafficFixturePayload({}) }) const json = path === '/api/auth/config' ? { required: false } : path === '/api/traffic/servers/1' ? { server } : path === '/api/traffic/servers/1/interfaces' ? { interfaces: [] } : path === '/api/traffic/users' ? { users: [] } : path === '/api/traffic/bound-interfaces' ? { interfaces: [] } : path === '/api/servers' ? [] : {} return route.fulfill({ json: observedTrafficFixturePayload(json) }) }) const catalog = page.waitForRequest(r => new URL(r.url()).pathname === '/api/traffic/servers') await page.goto('/traffic') await catalog await expect(page.getByRole('main')).toBeVisible() // Allow initial effects to run while the catalog remains deliberately pending. await page.waitForTimeout(500) expect(individual).toEqual([]) release() if (outcome === 'success') { await expect(page.getByRole('heading', { name: server.name, exact: true })).toBeVisible() await expect.poll(() => individual.includes('/api/traffic/servers/1/interfaces')).toBe(true) await expect.poll(() => individual.includes('/api/traffic/servers/1/live')).toBe(true) expect(individual.every(path => /^\/api\/traffic\/servers\/1(?:\/|$)/.test(path))).toBe(true) } else { await expect(page.getByText('Каталог временно недоступен', { exact: false }).first()).toBeVisible() expect(individual).toEqual([]) } }) }