From 4a81e048a1f1ebaa165cdcab0b13f92c9e024456 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Fri, 12 Jun 2026 07:13:07 +1000 Subject: [PATCH] fix(test): stabilize e2e tests (#1678) --- apps/e2e/tests/error-dialog.spec.ts | 27 ++++++++++++++++----------- apps/e2e/tests/video-controls.spec.ts | 10 +++------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/apps/e2e/tests/error-dialog.spec.ts b/apps/e2e/tests/error-dialog.spec.ts index 8f288181..f323b957 100644 --- a/apps/e2e/tests/error-dialog.spec.ts +++ b/apps/e2e/tests/error-dialog.spec.ts @@ -1,10 +1,23 @@ -import { expect, test } from '@playwright/test'; +import { expect, type Page, test } from '@playwright/test'; import { DATA_ATTRS, SELECTORS } from '../fixtures/selectors'; import { PlayerPage } from '../page-objects/player'; test.describe('Error Dialog', () => { let player: PlayerPage; + async function triggerError(page: Page) { + await page.evaluate(() => { + const video = document.querySelector('video') as HTMLVideoElement; + if (!video) return; + + Object.defineProperty(video, 'error', { + configurable: true, + value: { code: 4, message: 'Test media error' }, + }); + video.dispatchEvent(new Event('error')); + }); + } + test.beforeEach(async ({ page }) => { player = new PlayerPage(page); await page.goto('/pages/html-video-mp4.html'); @@ -14,11 +27,7 @@ test.describe('Error Dialog', () => { test('shows error dialog on media load failure', async ({ page }) => { const errorDialog = page.locator(SELECTORS.errorDialog).first(); - // Set an invalid source to trigger a media error - await page.evaluate(() => { - const video = document.querySelector('video') as HTMLVideoElement; - if (video) video.src = 'https://example.com/does-not-exist.mp4'; - }); + await triggerError(page); // Error dialog should appear with data-open await expect(errorDialog).toHaveAttribute(DATA_ATTRS.open, '', { timeout: 15_000 }); @@ -27,11 +36,7 @@ test.describe('Error Dialog', () => { test('error dialog can be dismissed', async ({ page }) => { const errorDialog = page.locator(SELECTORS.errorDialog).first(); - // Trigger error - await page.evaluate(() => { - const video = document.querySelector('video') as HTMLVideoElement; - if (video) video.src = 'https://example.com/does-not-exist.mp4'; - }); + await triggerError(page); await expect(errorDialog).toHaveAttribute(DATA_ATTRS.open, '', { timeout: 15_000 }); diff --git a/apps/e2e/tests/video-controls.spec.ts b/apps/e2e/tests/video-controls.spec.ts index d6efc86b..705ddaf9 100644 --- a/apps/e2e/tests/video-controls.spec.ts +++ b/apps/e2e/tests/video-controls.spec.ts @@ -4,7 +4,7 @@ import { DATA_ATTRS, SELECTORS } from '../fixtures/selectors'; import { PlayerPage } from '../page-objects/player'; for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly PageEntry[]) { - const usesSettingsMenu = !path.includes('/cdn-video') && !path.includes('/ejected'); + const rateMenu = !path.includes('/cdn-video') && !path.includes('/ejected'); test.describe(`Video Controls — ${name}`, () => { test.skip(({ browserName }) => { return skipBrowsers?.includes(browserName as 'chromium' | 'webkit' | 'firefox') ?? false; @@ -27,11 +27,7 @@ for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly Pa await expect(player.muteButton).toHaveAttribute(DATA_ATTRS.volumeLevel); await expect(player.fullscreenButton).toHaveAttribute(DATA_ATTRS.availability); await expect(player.pipButton).toHaveAttribute(DATA_ATTRS.availability); - if (usesSettingsMenu) { - await expect(player.settingsButton).toBeAttached(); - } else { - await expect(player.captionsButton).toHaveAttribute(DATA_ATTRS.availability); - } + await expect(player.settingsButton).toBeAttached(); await expect(player.duration).not.toHaveText(''); await player.showControls(); await expect(player.controls).toBeAttached(); @@ -96,7 +92,7 @@ for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly Pa // --- Playback Rate --- - (usesSettingsMenu ? test : test.skip)('playback rate menu changes selected rate', async () => { + (rateMenu ? test : test.skip)('playback rate menu changes selected rate', async () => { const initialRate = await player.getPlaybackRate(); await player.selectAlternativePlaybackRate();