From e466c06cad8b5493c449bc13dfa2d239b865d503 Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Fri, 1 May 2026 14:50:03 +0800 Subject: [PATCH] fix: add 60s timeout to all HEIF integration tests for CI HEIF decoding via heif-convert is slow on CI runners (~15-30s per image) and exceeds the default 30s Vitest timeout. Add explicit 60s timeouts to all 16 HEIF input tests across integration suite. --- tests/integration/barcode-read.test.ts | 2 +- tests/integration/border.test.ts | 2 +- tests/integration/bulk-rename.test.ts | 2 +- tests/integration/collage.test.ts | 2 +- tests/integration/color-palette.test.ts | 2 +- tests/integration/compare.test.ts | 2 +- tests/integration/compose.test.ts | 2 +- tests/integration/favicon.test.ts | 2 +- tests/integration/image-enhancement.test.ts | 2 +- tests/integration/info.test.ts | 2 +- tests/integration/optimize-for-web.test.ts | 2 +- tests/integration/split.test.ts | 2 +- tests/integration/stitch.test.ts | 2 +- tests/integration/text-overlay.test.ts | 37 ++++++++++++--------- tests/integration/vectorize.test.ts | 2 +- tests/integration/watermark-text.test.ts | 37 ++++++++++++--------- 16 files changed, 56 insertions(+), 46 deletions(-) diff --git a/tests/integration/barcode-read.test.ts b/tests/integration/barcode-read.test.ts index 4d401456..77d361e0 100644 --- a/tests/integration/barcode-read.test.ts +++ b/tests/integration/barcode-read.test.ts @@ -829,7 +829,7 @@ describe("Barcode Read", () => { // ── HEIF format input ───────────────────────────────────────────── - it("reads barcodes from a HEIF image", async () => { + it("reads barcodes from a HEIF image", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/border.test.ts b/tests/integration/border.test.ts index c56ad0e0..9442cfa9 100644 --- a/tests/integration/border.test.ts +++ b/tests/integration/border.test.ts @@ -573,7 +573,7 @@ describe("Border", () => { expect(result.processedSize).toBeGreaterThan(0); }); - it("handles HEIF input (motorcycle.heif)", async () => { + it("handles HEIF input (motorcycle.heif)", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/bulk-rename.test.ts b/tests/integration/bulk-rename.test.ts index 0cc55ca5..f6f442db 100644 --- a/tests/integration/bulk-rename.test.ts +++ b/tests/integration/bulk-rename.test.ts @@ -620,7 +620,7 @@ describe("Bulk Rename", () => { // ── HEIF file handling ───────────────────────────────────────── - it("renames HEIF files preserving extension", async () => { + it("renames HEIF files preserving extension", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "formats", "sample.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/collage.test.ts b/tests/integration/collage.test.ts index a9935014..3e57a74c 100644 --- a/tests/integration/collage.test.ts +++ b/tests/integration/collage.test.ts @@ -1457,7 +1457,7 @@ describe("Collage", () => { // ── HEIF format input ───────────────────────────────────────────── - it("handles HEIF input images", async () => { + it("handles HEIF input images", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "f1", filename: "a.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/color-palette.test.ts b/tests/integration/color-palette.test.ts index 28821095..ea0f7c26 100644 --- a/tests/integration/color-palette.test.ts +++ b/tests/integration/color-palette.test.ts @@ -382,7 +382,7 @@ describe("Solid white image", () => { // ── HEIF input ───────────────────────────────────────────────── describe("HEIF input", () => { - it("extracts palette from HEIF image", async () => { + it("extracts palette from HEIF image", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body: payload, contentType } = makeFilePayload(HEIF, "photo.heif", "image/heif"); const res = await app.inject({ diff --git a/tests/integration/compare.test.ts b/tests/integration/compare.test.ts index 2eadc990..274bd45e 100644 --- a/tests/integration/compare.test.ts +++ b/tests/integration/compare.test.ts @@ -776,7 +776,7 @@ describe("Compare", () => { // ── HEIF format input ───────────────────────────────────────────── - it("compares HEIF image with PNG", async () => { + it("compares HEIF image with PNG", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "a.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/compose.test.ts b/tests/integration/compose.test.ts index 1d406b39..14dbffc8 100644 --- a/tests/integration/compose.test.ts +++ b/tests/integration/compose.test.ts @@ -1012,7 +1012,7 @@ describe("Compose", () => { // ── HEIF format input ───────────────────────────────────────────── - it("handles HEIF base image", async () => { + it("handles HEIF base image", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "base.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/favicon.test.ts b/tests/integration/favicon.test.ts index 799638f2..e05e494e 100644 --- a/tests/integration/favicon.test.ts +++ b/tests/integration/favicon.test.ts @@ -682,7 +682,7 @@ describe("favicon", () => { // ── HEIF format input ──────────────────────────────────────────── - it("generates favicons from HEIF input", async () => { + it("generates favicons from HEIF input", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/image-enhancement.test.ts b/tests/integration/image-enhancement.test.ts index 6c1cb973..c8ecd53c 100644 --- a/tests/integration/image-enhancement.test.ts +++ b/tests/integration/image-enhancement.test.ts @@ -601,7 +601,7 @@ describe("Authentication", () => { // ── HEIF input ───────────────────────────────────────────────── describe("HEIF input", () => { - it("enhances HEIF (sample.heif) input", async () => { + it("enhances HEIF (sample.heif) input", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "formats", "sample.heif")); const res = await postTool({ mode: "auto" }, HEIF, "sample.heif", "image/heif"); expect([200, 422]).toContain(res.statusCode); diff --git a/tests/integration/info.test.ts b/tests/integration/info.test.ts index 0d4b5df4..bb373451 100644 --- a/tests/integration/info.test.ts +++ b/tests/integration/info.test.ts @@ -589,7 +589,7 @@ describe("Info", () => { // ── HEIF format info ────────────────────────────────────────── - it("returns correct metadata for HEIF (sample.heif) image", async () => { + it("returns correct metadata for HEIF (sample.heif) image", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "formats", "sample.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "sample.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/optimize-for-web.test.ts b/tests/integration/optimize-for-web.test.ts index 44747d33..82eaaf53 100644 --- a/tests/integration/optimize-for-web.test.ts +++ b/tests/integration/optimize-for-web.test.ts @@ -739,7 +739,7 @@ describe("Authentication", () => { // ── HEIF input handling ─────────────────────────────────────── describe("HEIF input", () => { - it("optimizes HEIF (sample.heif) input to webp", async () => { + it("optimizes HEIF (sample.heif) input to webp", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "formats", "sample.heif")); const res = await postTool({ format: "webp" }, HEIF, "sample.heif", "image/heif"); // HEIF decode may not be available diff --git a/tests/integration/split.test.ts b/tests/integration/split.test.ts index 26c1e214..64f1d4e6 100644 --- a/tests/integration/split.test.ts +++ b/tests/integration/split.test.ts @@ -1389,7 +1389,7 @@ describe("Split", () => { // ── HEIF format input ───────────────────────────────────────────── - it("splits a HEIF input image", async () => { + it("splits a HEIF input image", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/stitch.test.ts b/tests/integration/stitch.test.ts index 4682d240..f0352ec1 100644 --- a/tests/integration/stitch.test.ts +++ b/tests/integration/stitch.test.ts @@ -1487,7 +1487,7 @@ describe("Stitch", () => { // ── HEIF format input ───────────────────────────────────────────── - it("handles HEIF input in stitching", async () => { + it("handles HEIF input in stitching", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); const { body, contentType } = createMultipartPayload([ { name: "f1", filename: "a.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/text-overlay.test.ts b/tests/integration/text-overlay.test.ts index 551a4cc6..4984605c 100644 --- a/tests/integration/text-overlay.test.ts +++ b/tests/integration/text-overlay.test.ts @@ -532,24 +532,29 @@ describe("text-overlay", () => { // ── HEIF input ─────────────────────────────────────────────────── - it("handles HEIF input (motorcycle.heif)", async () => { - const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); - const { body, contentType } = createMultipartPayload([ - { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, - { name: "settings", content: JSON.stringify({ text: "HEIF overlay" }) }, - ]); + it( + "handles HEIF input (motorcycle.heif)", + { timeout: 60_000 }, + async () => { + const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); + const { body, contentType } = createMultipartPayload([ + { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, + { name: "settings", content: JSON.stringify({ text: "HEIF overlay" }) }, + ]); - const res = await app.inject({ - method: "POST", - url: "/api/v1/tools/text-overlay", - headers: { authorization: `Bearer ${adminToken}`, "content-type": contentType }, - body, - }); + const res = await app.inject({ + method: "POST", + url: "/api/v1/tools/text-overlay", + headers: { authorization: `Bearer ${adminToken}`, "content-type": contentType }, + body, + }); - expect(res.statusCode).toBe(200); - const json = JSON.parse(res.body); - expect(json.downloadUrl).toBeDefined(); - }, 60_000); + expect(res.statusCode).toBe(200); + const json = JSON.parse(res.body); + expect(json.downloadUrl).toBeDefined(); + }, + 60_000, + ); // ── Animated GIF input ────────────────────────────────────────── diff --git a/tests/integration/vectorize.test.ts b/tests/integration/vectorize.test.ts index 4298b62c..2d65b7f8 100644 --- a/tests/integration/vectorize.test.ts +++ b/tests/integration/vectorize.test.ts @@ -702,7 +702,7 @@ describe("vectorize", () => { // ── HEIF input ─────────────────────────────────────────────── - it("works with HEIF (sample.heif) input after decoding", async () => { + it("works with HEIF (sample.heif) input after decoding", { timeout: 60_000 }, async () => { const HEIF = readFileSync(join(FIXTURES, "formats", "sample.heif")); const { body, contentType } = createMultipartPayload([ { name: "file", filename: "sample.heif", contentType: "image/heif", content: HEIF }, diff --git a/tests/integration/watermark-text.test.ts b/tests/integration/watermark-text.test.ts index 11afc56c..bc46478a 100644 --- a/tests/integration/watermark-text.test.ts +++ b/tests/integration/watermark-text.test.ts @@ -520,24 +520,29 @@ describe("watermark-text", () => { // ── HEIF input ─────────────────────────────────────────────────── - it("handles HEIF input (motorcycle.heif)", async () => { - const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); - const { body, contentType } = createMultipartPayload([ - { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, - { name: "settings", content: JSON.stringify({ text: "HEIF Test" }) }, - ]); + it( + "handles HEIF input (motorcycle.heif)", + { timeout: 60_000 }, + async () => { + const HEIF = readFileSync(join(FIXTURES, "content", "motorcycle.heif")); + const { body, contentType } = createMultipartPayload([ + { name: "file", filename: "photo.heif", contentType: "image/heif", content: HEIF }, + { name: "settings", content: JSON.stringify({ text: "HEIF Test" }) }, + ]); - const res = await app.inject({ - method: "POST", - url: "/api/v1/tools/watermark-text", - headers: { authorization: `Bearer ${adminToken}`, "content-type": contentType }, - body, - }); + const res = await app.inject({ + method: "POST", + url: "/api/v1/tools/watermark-text", + headers: { authorization: `Bearer ${adminToken}`, "content-type": contentType }, + body, + }); - expect(res.statusCode).toBe(200); - const json = JSON.parse(res.body); - expect(json.downloadUrl).toBeDefined(); - }, 60_000); + expect(res.statusCode).toBe(200); + const json = JSON.parse(res.body); + expect(json.downloadUrl).toBeDefined(); + }, + 60_000, + ); // ── Animated GIF input ──────────────────────────────────────────