test(web): проверка саундборда дожидается локального воспроизведения

Клиент играет звук асинхронно: сначала скачивает файл через /files/{id} в
blob, и только потом создаёт Audio и зовёт play(). Подпись о проигрывании
появляется раньше звука, а проверка читала счётчики сразу после неё и ловила
гонку: в прогоне build/e2e-all-run8.log пункт 27 падал с __soundCalls = 0,
хотя сервер отвечал 200 и запрос файла уже шёл. Ждём факт запуска через
expect.poll — проверка снова проверяет воспроизведение, а не скорость сети.

Пункт был недоступен раньше: без медиапути LiveKit тест скипался, поэтому
гонка не проявлялась.
This commit is contained in:
2026-09-26 14:42:47 +03:00
parent ee334a77bc
commit ad7b3d21bb
+20 -7
View File
@@ -270,14 +270,27 @@ test.describe('UI шапки сервера, комнаты и саундбор
await expect(page.getByTestId('soundboard-notice')).toContainText('zvonok', { await expect(page.getByTestId('soundboard-notice')).toContainText('zvonok', {
timeout: 20_000, timeout: 20_000,
}); });
const counters = await page.evaluate( // Локальное воспроизведение асинхронно: клиент сначала скачивает файл
() => window as unknown as { __soundCalls?: number; __soundPlayed?: number }, // (`/files/{id}` → blob), и только потом создаёт `Audio` и зовёт `play()`.
// Подпись появляется раньше звука, поэтому счётчики не читаем сразу —
// дожидаемся факта запуска (иначе проверка ловит гонку, а не дефект).
const counter = (name: '__soundCalls' | '__soundPlayed'): Promise<number> =>
page.evaluate(
(key) => (window as unknown as Record<string, number | undefined>)[key] ?? 0,
name,
); );
expect( await expect
counters.__soundCalls ?? 0, .poll(() => counter('__soundCalls'), {
'клиент запустил локальное воспроизведение', message: 'клиент запустил локальное воспроизведение',
).toBeGreaterThan(0); timeout: 20_000,
expect(counters.__soundPlayed ?? 0, 'звук действительно заиграл локально').toBeGreaterThan(0); })
.toBeGreaterThan(0);
await expect
.poll(() => counter('__soundPlayed'), {
message: 'звук действительно заиграл локально',
timeout: 20_000,
})
.toBeGreaterThan(0);
} finally { } finally {
await session?.context.close(); await session?.context.close();
await cleanupGuild(ownerApi, fixture, OWNER_LOGIN.password); await cleanupGuild(ownerApi, fixture, OWNER_LOGIN.password);