Files
SnapOtterandGitHub 301e6eb01a test: coverage campaign and mutation testing across five packages (#628)
Coverage 83.6 to 87.36% lines, 81.63 to 84.14% branches. Mutation testing across five packages: image-engine 85, media-engine 92, doc-engine 87, shared+enterprise 86, apps/api security and jobs slice. Runs all five lanes weekly. Fixes the silently-broken mutation CI (babel pin), a redact-pdf envelope-shape test bug, an untested enterprise license valid-signature path, and an audit test that only exercised a hand-copied reproduction. Test and config only, no product code changes beyond the babel pin and one test-only oidc export. Full suite: 16,712 pass, 0 fail.
2026-07-24 17:36:57 +08:00

114 lines
3.9 KiB
TypeScript

import { afterEach, describe, expect, it } from "vitest";
import { type EncoderTarget, resolveEncoder } from "../src/encoders.js";
/**
* resolveEncoder reads process.env.SNAPOTTER_HW_ACCEL at call time, so each
* test sets or clears it. Assertions are exact strings: an existence-only test
* would leave every map-entry mutant alive.
*/
afterEach(() => {
delete process.env.SNAPOTTER_HW_ACCEL;
});
const ALL_TARGETS: EncoderTarget[] = ["h264", "hevc", "av1", "vp9", "aac", "opus", "mp3"];
describe("resolveEncoder: software (no accel set)", () => {
const expected: Record<EncoderTarget, string> = {
h264: "libx264",
hevc: "libx265",
av1: "libsvtav1",
vp9: "libvpx-vp9",
aac: "aac",
opus: "libopus",
mp3: "libmp3lame",
};
for (const target of ALL_TARGETS) {
it(`${target} -> ${expected[target]}`, () => {
delete process.env.SNAPOTTER_HW_ACCEL;
expect(resolveEncoder(target)).toBe(expected[target]);
});
}
it("falls back to software when SNAPOTTER_HW_ACCEL is empty string", () => {
process.env.SNAPOTTER_HW_ACCEL = "";
expect(resolveEncoder("h264")).toBe("libx264");
});
});
describe("resolveEncoder: nvenc", () => {
it("h264 -> h264_nvenc", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("h264")).toBe("h264_nvenc");
});
it("hevc -> hevc_nvenc", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("hevc")).toBe("hevc_nvenc");
});
it("av1 -> av1_nvenc", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("av1")).toBe("av1_nvenc");
});
it("vp9 has no nvenc entry -> software libvpx-vp9", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("vp9")).toBe("libvpx-vp9");
});
it("aac has no nvenc entry -> software aac", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("aac")).toBe("aac");
});
it("opus has no nvenc entry -> software libopus", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("opus")).toBe("libopus");
});
it("mp3 has no nvenc entry -> software libmp3lame", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc";
expect(resolveEncoder("mp3")).toBe("libmp3lame");
});
});
describe("resolveEncoder: vaapi", () => {
it("h264 -> h264_vaapi", () => {
process.env.SNAPOTTER_HW_ACCEL = "vaapi";
expect(resolveEncoder("h264")).toBe("h264_vaapi");
});
it("hevc -> hevc_vaapi", () => {
process.env.SNAPOTTER_HW_ACCEL = "vaapi";
expect(resolveEncoder("hevc")).toBe("hevc_vaapi");
});
it("av1 has no vaapi entry -> software libsvtav1", () => {
process.env.SNAPOTTER_HW_ACCEL = "vaapi";
expect(resolveEncoder("av1")).toBe("libsvtav1");
});
it("vp9 has no vaapi entry -> software libvpx-vp9", () => {
process.env.SNAPOTTER_HW_ACCEL = "vaapi";
expect(resolveEncoder("vp9")).toBe("libvpx-vp9");
});
it("mp3 has no vaapi entry -> software libmp3lame", () => {
process.env.SNAPOTTER_HW_ACCEL = "vaapi";
expect(resolveEncoder("mp3")).toBe("libmp3lame");
});
});
describe("resolveEncoder: unknown accel and casing", () => {
it("unknown accel value falls back to software", () => {
process.env.SNAPOTTER_HW_ACCEL = "quicksync";
expect(resolveEncoder("h264")).toBe("libx264");
expect(resolveEncoder("hevc")).toBe("libx265");
});
it("lowercases the env value: NVENC selects the nvenc family", () => {
process.env.SNAPOTTER_HW_ACCEL = "NVENC";
expect(resolveEncoder("h264")).toBe("h264_nvenc");
});
it("lowercases the env value: VaApi selects the vaapi family", () => {
process.env.SNAPOTTER_HW_ACCEL = "VaApi";
expect(resolveEncoder("hevc")).toBe("hevc_vaapi");
});
it("does not partial-match: 'nvenc-extra' falls back to software", () => {
process.env.SNAPOTTER_HW_ACCEL = "nvenc-extra";
expect(resolveEncoder("h264")).toBe("libx264");
});
});