fix(traffic): дождаться каталога перед запросами выбранного сервера

This commit is contained in:
Denozordec committed 2026-10-11 13:10:37 +07:00
1 parent b619ef208e
commit 59938118bd
9 files changed
+194 -18

No files matched your search

+45
View File
@@ -0,0 +1,45 @@
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<void>(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: { 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: { error: 'Каталог временно недоступен' } })
return route.fulfill({ json: { servers: [server] } })
}
if (path.endsWith('/live')) return route.fulfill({ status: 503, json: {} })
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 })
})
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([])
}
})
}