Files
SnapOtter/tests/integration/fixtures/fixture-integrity.test.ts
T
SnapOtter 09b26718e1 test(fixtures): replace synthetic media with real CC-BY/CC0 content
- Video: Big Buck Bunny (Blender Foundation, CC-BY 3.0) 8s segment
  replaces ffmpeg testsrc2 synthetic; container variants hero.{mov,webm,mkv,avi}
- Speech: macOS TTS (CC0) replaces unknown-origin speech files;
  format variants speech.{flac,ogg,m4a,aac,opus} for depth tests
- Chat images: Sharp SVG mock chat UI (CC0) replaces third-party
  app screenshots with personal content
- Registry: video.hero.{mov,webm,mkv,avi}, audio.speech.{flac,ogg,m4a,aac,opus}
- Integrity guard: 19 ffprobe assertions (was 8)
- Parity: 13177 passed, 0 dropped
2026-06-20 01:24:59 +08:00

54 lines
1.9 KiB
TypeScript

import { execFileSync } from "node:child_process";
import sharp from "sharp";
import { describe, expect, it } from "vitest";
import { fixtures } from "../../fixtures/index.js";
const ffprobe = process.env.FFPROBE_PATH || "ffprobe";
const qpdf = process.env.QPDF_PATH || "qpdf";
describe("real fixtures decode through their real tools", () => {
// JPEG/PNG/WEBP only -- formats Sharp decodes unconditionally. HEIC/HEIF heroes
// (portrait.heic, motorcycle.heif) are exercised by the real tool routes in the
// Phase 2 depth tests, where the factory's HEIC decode path is in play.
it.each([
fixtures.image.portrait.jpg,
fixtures.image.redEye,
fixtures.image.ocr.clean,
fixtures.image.ocr.japanese,
fixtures.image.multiFace,
])("Sharp decodes %s with sane dimensions", async (path) => {
const meta = await sharp(path).metadata();
expect((meta.width ?? 0) * (meta.height ?? 0)).toBeGreaterThan(64 * 64);
});
it.each([
fixtures.video.hero.mp4,
fixtures.video.hero.mov,
fixtures.video.hero.webm,
fixtures.video.hero.mkv,
fixtures.video.hero.avi,
fixtures.audio.speech.wav,
fixtures.audio.speech.flac,
fixtures.audio.speech.ogg,
fixtures.audio.speech.m4a,
fixtures.audio.speech.aac,
fixtures.audio.speech.opus,
fixtures.audio.tagged,
])("ffprobe reads a positive duration from %s", (path) => {
const out = execFileSync(
ffprobe,
["-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", path],
{ encoding: "utf8" },
);
expect(Number.parseFloat(out.trim())).toBeGreaterThan(0);
});
it.each([
fixtures.document.pdfMulti,
fixtures.document.pdfScanned,
])("qpdf reports pages for %s", (path) => {
const out = execFileSync(qpdf, ["--show-npages", path], { encoding: "utf8" });
expect(Number.parseInt(out.trim(), 10)).toBeGreaterThan(0);
});
});