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
+21 -8
View File
@@ -270,14 +270,27 @@ test.describe('UI шапки сервера, комнаты и саундбор
await expect(page.getByTestId('soundboard-notice')).toContainText('zvonok', {
timeout: 20_000,
});
const counters = await page.evaluate(
() => window as unknown as { __soundCalls?: number; __soundPlayed?: number },
);
expect(
counters.__soundCalls ?? 0,
'клиент запустил локальное воспроизведение',
).toBeGreaterThan(0);
expect(counters.__soundPlayed ?? 0, 'звук действительно заиграл локально').toBeGreaterThan(0);
// Локальное воспроизведение асинхронно: клиент сначала скачивает файл
// (`/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,
);
await expect
.poll(() => counter('__soundCalls'), {
message: 'клиент запустил локальное воспроизведение',
timeout: 20_000,
})
.toBeGreaterThan(0);
await expect
.poll(() => counter('__soundPlayed'), {
message: 'звук действительно заиграл локально',
timeout: 20_000,
})
.toBeGreaterThan(0);
} finally {
await session?.context.close();
await cleanupGuild(ownerApi, fixture, OWNER_LOGIN.password);