Skip unrelated required checks without losing their names (#2542)

* fix(ci): skip unrelated required checks cleanly

Matrix jobs had to start no-op runners to preserve interpolated required-check names. Static named jobs let GitHub report genuine skipped conclusions while keeping those names stable.

* fix(ci): gate changes to install patching script

* fix(ci): route cross-package test contracts narrowly

* fix(ci): keep routed contracts merge-blocking

* fix(server): exclude nested test utilities from builds

* fix(ci): cover app-owned native and browser domains

* refactor(ci): align tests with runtime domains

Own browser specs, desktop specs, and Electron-only app code by stable directories so PR routing does not depend on filename conventions. Keep desktop integration coverage inside the required desktop check.

* fix(ci): keep routing and desktop suites isolated

The routing regression must run before dependency installation, and desktop Vitest must not collect Playwright-owned specs.

* fix(ci): isolate desktop e2e runtime

* perf(test): isolate Playwright workers

* perf(test): parallelize Playwright within specs

* fix(test): keep Playwright file scheduling

* fix(test): share dynamic Metro fixture

* fix(test): preserve own-host restart fixtures

* fix(ci): preserve routed contracts after rebase

* Stabilize Playwright wheel-scroll assertions
This commit is contained in:
Mohamed Boudra
2026-08-02 00:56:05 +08:00
committed by GitHub
parent 429155b536
commit 5a30affd7f
256 changed files with 2693 additions and 2674 deletions
+27 -6
View File
@@ -1,10 +1,11 @@
import { createServer, type Server } from "node:http";
import { afterEach, expect, test } from "vitest";
import { waitForMetro } from "../e2e/global-setup";
import { waitForMetro, warmMetro } from "../e2e/support/global-setup";
class MetroPort {
private response = { status: 500, body: "fallback" };
private readonly responses = new Map<string, { status: number; body: string }>();
readonly requests: string[] = [];
private constructor(
readonly port: number,
@@ -13,9 +14,12 @@ class MetroPort {
static async listen(): Promise<MetroPort> {
let endpoint!: MetroPort;
const server = createServer((_request, response) => {
response.writeHead(endpoint.response.status, { "content-type": "text/plain" });
response.end(endpoint.response.body);
const server = createServer((request, response) => {
const pathname = new URL(request.url ?? "/", "http://localhost").pathname;
endpoint.requests.push(pathname);
const served = endpoint.responses.get(pathname) ?? { status: 500, body: "fallback" };
response.writeHead(served.status, { "content-type": "text/plain" });
response.end(served.body);
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
const address = server.address();
@@ -28,7 +32,15 @@ class MetroPort {
}
serveMetro(): void {
this.response = { status: 200, body: "packager-status:running" };
this.responses.set("/status", { status: 200, body: "packager-status:running" });
}
serveWarmableDocument(): void {
this.responses.set("/", {
status: 200,
body: '<html><script src="/index.bundle?platform=web"></script></html>',
});
this.responses.set("/index.bundle", { status: 200, body: "compiled bundle" });
}
async close(): Promise<void> {
@@ -63,3 +75,12 @@ test("Metro readiness rejects another HTTP listener on the selected port", async
undefined,
);
});
test("Metro warmup compiles the document's same-origin scripts before tests start", async () => {
endpoint = await MetroPort.listen();
endpoint.serveWarmableDocument();
await warmMetro(endpoint.port);
expect(endpoint.requests).toEqual(["/", "/index.bundle"]);
});