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-15 00:05:28 +08:00
committed by GitHub
parent 6b6710f7f8
commit a3e9c91ce0
2 changed files with 11 additions and 0 deletions
+6
View File
@@ -1,5 +1,6 @@
import { PlaywrightHelper } from "./playwright-helper";
import { ModalDriver } from "./modal-driver";
import emptyStyle from "../src/config/empty-style.json" with { type: "json" };
const baseUrl = "http://localhost:8888/";
const isMac = process.platform === "darwin";
@@ -56,6 +57,11 @@ export class MaputnikDriver {
url: "https://www.glyph-server.com/*",
response: ["Font 1", "Font 2", "Font 3"],
});
await this.helper.given.interceptAndMockResponse({
method: "GET",
url: /cdn\.jsdelivr\.net\/.*\/empty-style\.json$/,
response: emptyStyle,
});
},
};
+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: {