diff --git a/web/e2e/guild-ui.spec.ts b/web/e2e/guild-ui.spec.ts index bd50e37..9880abb 100644 --- a/web/e2e/guild-ui.spec.ts +++ b/web/e2e/guild-ui.spec.ts @@ -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 => + page.evaluate( + (key) => (window as unknown as Record)[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);