chore: stabilize Playwright E2E runs (#2164)

#1351 made `styleStore` initialization asynchronous in
`componentDidMount`. `setStyle` currently treats `toolbar:link`
appearing as the signal that loading is complete, but if the style
network request (`empty-style.json` from jsdelivr) takes over ~1s, the
`toolbar:link` can appear while `styleStore` is still null (because the
request has not finished). Subsequent `saveStyle` calls in tests then
silently do nothing, causing test failures (3 in #2157, and often 20+ on
my machine).

Changes are:

1. Mock the default empty style to avoid slow network E2E failures.
2. Also cap Playwright workers at 4 to avoid overloading Chromium on
high-core machines.

Fixes #2158.

## Launch Checklist

<!-- Thanks for the PR! Feel free to add or remove items from the
checklist. -->


 - [x] Briefly describe the changes in this PR.
 - [x] Link to related issues.
- [ ] ~~Include before/after visuals or gifs if this PR includes visual
changes.~~
 - [ ] ~~Write tests for all new functionality.~~
- [ ] ~~Add an entry to `CHANGELOG.md` under the `## main` section.~~
(only minor test infra fix)

Co-authored-by: liuly <me@liuly.moe>
Co-authored-by: Harel M <harel.mazor@gmail.com>
This commit is contained in:
undef_26
2026-09-14 19:05:28 +03:00
committed by GitHub
co-authored by liuly Harel M
parent 6b6710f7f8
commit a3e9c91ce0
2 changed files with 11 additions and 0 deletions
+5
View File
@@ -1,6 +1,10 @@
import { cpus } from "node:os";
import { defineConfig, devices } from "@playwright/test";
const isCI = !!process.env.CI;
// Playwright defaults to CPU / 2 workers,
// capping the number of workers to 4 to avoid overloading browsers.
const workers = Math.min(4, Math.max(1, Math.floor(cpus().length / 2)));
// When the app is already served elsewhere (e.g. the docker e2e job) set
// E2E_NO_WEBSERVER=1 so Playwright does not start its own dev server.
const useExternalServer = !!process.env.E2E_NO_WEBSERVER;
@@ -13,6 +17,7 @@ export default defineConfig({
globalTeardown: "./e2e/utils/e2e-teardown.ts",
fullyParallel: true,
forbidOnly: isCI,
workers,
retries: isCI ? 2 : 0,
reporter: isCI ? [["list"], ["html", { open: "never" }]] : "list",
use: {