From 7fbe21c8e195643cb1ad19b448203a09fd8c18ab Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sat, 7 Mar 2026 11:08:22 +0300 Subject: [PATCH] Fix flaky E2E tests: layers panel, zoom-to-fit, snapshot stability - layers-panel: navigate to /demo so demo layers exist - app-menu zoom-to-fit: zoom in first so zoom-to-fit has something to change - playwright.config: force workers=1 and colorScheme=dark for consistent WebGL/SwiftShader snapshot rendering across runs - Update empty-canvas snapshot for current dark-mode canvas appearance --- playwright.config.ts | 5 ++++- tests/e2e/app-menu.spec.ts | 5 +++++ .../empty-canvas-openpencil-darwin.png | Bin 26867 -> 17575 bytes tests/e2e/layers-panel.spec.ts | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 75981f58b..c50532e1d 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from '@playwright/test' export default defineConfig({ testDir: './tests', timeout: 15_000, + workers: 1, expect: { toHaveScreenshot: { maxDiffPixelRatio: 0.01, @@ -17,6 +18,7 @@ export default defineConfig({ baseURL: 'http://localhost:1420', viewport: { width: 1280, height: 800 }, deviceScaleFactor: 2, + colorScheme: 'dark', launchOptions: { args: ['--enable-unsafe-swiftshader'] } @@ -24,7 +26,8 @@ export default defineConfig({ projects: [ { name: 'openpencil', - testDir: './tests/e2e' + testDir: './tests/e2e', + fullyParallel: false }, { name: 'figma', diff --git a/tests/e2e/app-menu.spec.ts b/tests/e2e/app-menu.spec.ts index 5c44756f6..61e770c29 100644 --- a/tests/e2e/app-menu.spec.ts +++ b/tests/e2e/app-menu.spec.ts @@ -120,7 +120,12 @@ test('Duplicate via Edit menu works', async () => { }) test('Zoom to fit via View menu works', async () => { + await page.locator('[role="menubar"] [role="menuitem"]', { hasText: 'View' }).click() + await page.locator('[role="menu"] [role="menuitem"]', { hasText: 'Zoom in' }).click() + await canvas.waitForRender() + const zoomBefore = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.zoom) + expect(zoomBefore).toBeGreaterThan(1) await page.locator('[role="menubar"] [role="menuitem"]', { hasText: 'View' }).click() await page.locator('[role="menu"] [role="menuitem"]', { hasText: 'Zoom to fit' }).click() diff --git a/tests/e2e/create-shapes.spec.ts-snapshots/empty-canvas-openpencil-darwin.png b/tests/e2e/create-shapes.spec.ts-snapshots/empty-canvas-openpencil-darwin.png index d38a70d5b3f5680906ab11b1ca0c8d291cca1eea..de77c1af47dda96ff121c8e569ab1eecd036fe35 100644 GIT binary patch literal 17575 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 { page = await browser.newPage() - await page.goto('/') + await page.goto('/demo') canvas = new CanvasHelper(page) await canvas.waitForInit() })