fix(traffic): сохранять историю и показывать достоверную свежесть

This commit is contained in:
Denozordec committed 2026-10-12 20:23:07 +07:00
1 parent ebe62ae2ef
commit 1275dd7b9b
48 files changed
+1899 -187

No files matched your search

+7 -6
View File
@@ -1,18 +1,19 @@
import { observedTrafficFixturePayload } from "./traffic-observation-fixture"
import { test, expect, type Page } from '@playwright/test'
async function setup(page: Page) {
const control = { holdRange: '', failIface: false, series: undefined as Array<number | null> | undefined, txSeries: undefined as number[] | undefined, release: () => {} }
const gate = new Promise<void>(resolve => { control.release = resolve })
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('**/health', route => route.fulfill({ json: observedTrafficFixturePayload({ ok: true }) }))
await page.route('**/api/**', async route => {
const url = new URL(route.request().url()), path = url.pathname
if (path.endsWith('/live')) return route.fulfill({ status: 503, json: {} })
if (path.endsWith('/live')) return route.fulfill({ status: 503, json: observedTrafficFixturePayload({}) })
if (path === '/api/traffic/servers/1') {
const range = url.searchParams.get('range'), iface = url.searchParams.get('iface')
if (control.holdRange && range === control.holdRange) await gate
if (control.failIface && iface === 'ether2') return route.fulfill({ status: 500, json: { error: 'Интерфейс временно недоступен' } })
return route.fulfill({ json: { server: { ...server, rxSeries: control.series ?? server.rxSeries, txSeries: control.txSeries ?? control.series ?? server.txSeries, name: `Детали ${range} ${iface}`, rxNow: range === '24h' ? 24 : 15 } } })
if (control.failIface && iface === 'ether2') return route.fulfill({ status: 500, json: observedTrafficFixturePayload({ error: 'Интерфейс временно недоступен' }) })
return route.fulfill({ json: observedTrafficFixturePayload({ server: { ...server, rxSeries: control.series ?? server.rxSeries, txSeries: control.txSeries ?? control.series ?? server.txSeries, name: `Детали ${range} ${iface}`, rxNow: range === '24h' ? 24 : 15 } }) })
}
const json = path === '/api/auth/config' ? { required: false }
: path === '/api/traffic/servers' ? { servers: [{ ...server, rxSeries: control.series ?? server.rxSeries, txSeries: control.txSeries ?? control.series ?? server.txSeries }] }
@@ -20,7 +21,7 @@ async function setup(page: Page) {
: path.endsWith('/interfaces') || path === '/api/traffic/bound-interfaces' ? { interfaces: [] }
: path === '/api/traffic/users' ? { users: [] }
: path === '/api/servers' ? [] : {}
await route.fulfill({ json })
await route.fulfill({ json: observedTrafficFixturePayload(json) })
})
await page.goto('/traffic')
await expect(page.getByRole('heading', { name: 'Детали 1h __all__', exact: true })).toBeVisible()
@@ -118,7 +119,7 @@ test('Карточка трафика: пустая история, одна т
await page.getByRole('button', { name: '15м', exact: true }).click()
await expect(card.locator('circle')).toHaveCount(1)
await expect(card.locator('circle')).toHaveAttribute('cx', '150')
control.series = [2, 3, -1, 4, 5]
control.series = [2, 3, null, 4, 5]
control.txSeries = [0, 0, 0, 0, 0]
await page.getByRole('button', { name: '4ч', exact: true }).click()
await expect(card.locator('[data-direction="rx"] polyline')).toHaveCount(2)