test(ui): проверить ожидание первого сообщения SSE
This commit is contained in:
1 parent
88a8b5f02f
commit
7a01e8d545
6 files changed
+55
-8
No files matched your search
@@ -1,9 +1,9 @@
|
||||
import type { Page } from '@playwright/test'
|
||||
|
||||
// Keep a response open; the browser test controls sample delivery independently of HTTP routes.
|
||||
export async function installOpenLiveStream(page: Page, path: string, sample: unknown) {
|
||||
export async function installOpenLiveStream(page: Page, path: string, sample: unknown, sendImmediately = true) {
|
||||
await page.clock.install()
|
||||
await page.addInitScript(({ path, sample }) => {
|
||||
await page.addInitScript(({ path, sample, sendImmediately }) => {
|
||||
const originalFetch = window.fetch.bind(window)
|
||||
window.fetch = async (input, init) => {
|
||||
const url = new URL(input instanceof Request ? input.url : String(input), location.href)
|
||||
@@ -18,12 +18,12 @@ export async function installOpenLiveStream(page: Page, path: string, sample: un
|
||||
}
|
||||
const heartbeat = () => controller.enqueue(encode(': heartbeat\r\n\r\n'))
|
||||
Object.assign(window, { sendLiveSample: send, sendLiveHeartbeat: heartbeat })
|
||||
send()
|
||||
if (sendImmediately) send()
|
||||
},
|
||||
})
|
||||
return new Response(stream, { headers: { 'Content-Type': 'text/event-stream' } })
|
||||
}
|
||||
}, { path, sample })
|
||||
}, { path, sample, sendImmediately })
|
||||
}
|
||||
|
||||
export async function resumeLiveStream(page: Page) {
|
||||
|
||||
@@ -343,3 +343,25 @@ test('Flow: молчащий SSE сохраняет данные и восста
|
||||
await page.clock.fastForward(15_001)
|
||||
await expect(page.getByText('Нет обновлений live более 15 секунд', { exact: true })).toHaveCount(0)
|
||||
})
|
||||
|
||||
|
||||
test('Flow: ожидание первого sample использует историю без фиктивного live', async ({ page }) => {
|
||||
await installOpenLiveStream(page, '/api/traffic/flow/live', { bpsNow: 7000000, bytes: 200, packets: 2, conversations: 1, uniqueSrc: 1, uniqueDst: 1, topProto: 'TCP', rxSeries: [1], txSeries: [2], applications: [], protocols: [], sources: [], destinations: [], interfaces: [], conversationsList: [], ifaces: [], live: true }, false)
|
||||
await setup(page)
|
||||
const receipt = page.getByLabel('Получение аналитики потоков')
|
||||
await expect(receipt).toContainText('Получено (API)')
|
||||
await expect(page.getByText('live', { exact: true })).toHaveCount(0)
|
||||
await expect(page.getByLabel('Скорость потоков')).toContainText('1.00 Мбит/с')
|
||||
const stamp = await receipt.locator('time').getAttribute('datetime')
|
||||
await page.clock.fastForward(10_000)
|
||||
await sendLiveHeartbeat(page)
|
||||
await page.clock.fastForward(5_001)
|
||||
await expect(page.getByText('Нет обновлений live более 15 секунд', { exact: true })).toBeVisible()
|
||||
await expect(page.getByText('История · live недоступен', { exact: true }).filter({ visible: true })).toHaveCount(2)
|
||||
await expect(receipt.locator('time')).toHaveAttribute('datetime', stamp!)
|
||||
await resumeLiveStream(page)
|
||||
await expect(page.getByText('live', { exact: true }).filter({ visible: true })).toHaveCount(3)
|
||||
await expect(page.getByLabel('Скорость потоков')).toContainText('7.00 Мбит/с')
|
||||
await expect(receipt).toContainText('Получено (live-поток)')
|
||||
await expect(receipt.locator('time')).not.toHaveAttribute('datetime', stamp!)
|
||||
})
|
||||
@@ -1,7 +1,7 @@
|
||||
import { installOpenLiveStream, resumeLiveStream, sendLiveHeartbeat } from "./live-stream-fixture"
|
||||
import { test, expect } from '@playwright/test'
|
||||
|
||||
for (const variant of ['closed', 'invalid', 'http-error', 'silent'] as const) {
|
||||
for (const variant of ['closed', 'invalid', 'http-error', 'silent', 'awaiting'] as const) {
|
||||
test(`Трафик: SSE ${variant} не выдаёт старое измерение за live`, async ({ page }) => {
|
||||
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 } }))
|
||||
@@ -23,12 +23,28 @@ for (const variant of ['closed', 'invalid', 'http-error', 'silent'] as const) {
|
||||
: path === '/api/servers' ? [] : {}
|
||||
return route.fulfill({ json })
|
||||
})
|
||||
if (variant === 'silent') await installOpenLiveStream(page, '/api/traffic/servers/1/live', { rxMbps: 17, txMbps: 19, at: '2026-09-23T12:00:00Z' })
|
||||
if (variant === 'silent' || variant === 'awaiting') await installOpenLiveStream(page, '/api/traffic/servers/1/live', { rxMbps: 17, txMbps: 19, at: '2026-09-23T12:00:00Z' }, variant !== 'awaiting')
|
||||
const received = new Date('2026-09-28T06:00:00Z')
|
||||
await page.clock.setFixedTime(received)
|
||||
await page.goto('/traffic')
|
||||
const summary = page.getByLabel('Скорость выбранного сервера')
|
||||
await expect(summary).toBeVisible()
|
||||
if (variant === 'awaiting') {
|
||||
const measurement = page.getByLabel('Последнее измерение сервера')
|
||||
await expect(summary.getByText('История · ожидание live', { exact: true }).filter({ visible: true })).toHaveCount(2)
|
||||
await expect(measurement).toHaveCount(0)
|
||||
await expect(summary).not.toContainText('17.0')
|
||||
await page.clock.fastForward(10_000)
|
||||
await sendLiveHeartbeat(page)
|
||||
await page.clock.fastForward(5_001)
|
||||
await expect(summary.getByText('История · live недоступен', { exact: true }).filter({ visible: true })).toHaveCount(2)
|
||||
await expect(measurement).toHaveCount(0)
|
||||
await resumeLiveStream(page)
|
||||
await expect(summary.getByText('live', { exact: true }).filter({ visible: true })).toHaveCount(2)
|
||||
await expect(summary).toContainText('17.0')
|
||||
await expect(measurement).toBeVisible()
|
||||
return
|
||||
}
|
||||
if (variant === 'silent') {
|
||||
await expect(summary.getByText('live', { exact: true }).filter({ visible: true })).toHaveCount(2)
|
||||
const stamp = await page.getByLabel('Последнее измерение сервера').locator('time').first().getAttribute('datetime')
|
||||
|
||||
Reference in new issue
Block a user