fix(nightly): de-flake matrix timeouts, exclude browser tool from fuzz (#349)

Systematic round - attack the failure classes, not one bug at a time:

- Flakiness (Coverage/Extended Matrix flipped green<->red): the generated
  format-matrix conversion tests hardcode a 30s/60s per-test timeout that the
  jobs' VITEST_TEST_TIMEOUT can't override. Heavy conversions under coverage
  instrumentation / full matrix intermittently exceed it. Raise to 120s.
- Schemathesis: html-to-image returns 503 when its headless browser isn't
  present (always, in the fuzz env) - same expected-unavailable class as the
  AI 501s. Exclude it from the fuzz (it can't be exercised without a browser).
- Baseline regen: bump timeout 60->120 min so it can finish now that the
  route sweep (#347) lets the visual specs pass instead of failing+retrying.
This commit is contained in:
SnapOtter
2026-06-25 00:14:45 +08:00
committed by GitHub
parent 078743d6b2
commit bbad953e79
6 changed files with 6 additions and 6 deletions
@@ -955,7 +955,7 @@ describe("Extended conversion targets (core formats)", () => {
if (fmt.name.toLowerCase() === target.format) continue;
if (fmt.name === "AVIF" && target.format === "avif") continue;
const testTimeout = target.format === "avif" || target.format === "gif" ? 120_000 : 30_000;
const testTimeout = target.format === "avif" || target.format === "gif" ? 120_000 : 120_000;
it(`${fmt.name} -> ${target.format}`, { timeout: testTimeout }, async () => {
const res = await callTool("convert", fmt, { format: target.format });
if (!res) return;
@@ -859,7 +859,7 @@ describe("SVG-to-raster", () => {
const SVG_OUTPUT_FORMATS = ["png", "jpg", "webp", "avif"] as const;
for (const outFmt of SVG_OUTPUT_FORMATS) {
const testTimeout = outFmt === "avif" ? 120_000 : 30_000;
const testTimeout = outFmt === "avif" ? 120_000 : 120_000;
it(`converts SVG to ${outFmt}`, { timeout: testTimeout }, async () => {
const fixturePath = fixtures.image.formats("svg");
if (!existsSync(fixturePath)) return;
@@ -704,7 +704,7 @@ describe("Cross-format conversion matrix", () => {
if (inputLower === outFmt) continue;
if (inputLower === "jpeg" && outFmt === "jpg") continue;
const testTimeout = outFmt === "avif" ? 120_000 : 60_000;
const testTimeout = outFmt === "avif" ? 120_000 : 120_000;
it(`${fmt.name} -> ${outFmt}`, { timeout: testTimeout }, async () => {
const fixturePath = join(fixtureDir.formats, fmt.file);
if (!existsSync(fixturePath)) return;
@@ -185,7 +185,7 @@ describe("New format support", () => {
for (const outFmt of OUTPUTS) {
const inLower = input.name.toLowerCase();
if (inLower === outFmt || (inLower === "jpeg" && outFmt === "jpg")) continue;
const testTimeout = outFmt === "avif" ? 120_000 : 60_000;
const testTimeout = outFmt === "avif" ? 120_000 : 120_000;
it(`converts ${input.name} to ${outFmt}`, { timeout: testTimeout }, async () => {
const fileBuffer = readFileSync(join(fixtureDir.formats, input.file));
const { body, contentType } = createMultipartPayload([