mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-07-14 18:15:56 -04:00
Switch `mock.module("../src/image-cache", ...)` stubs in thumbhash, person-detail, colors, and credits tests to `spyOn(globalThis, "fetch")` instead. This avoids the cross-file persistence problem with `mock.module` and tests the real code paths more faithfully.
Update `image-cache.ts` to call `globalThis.fetch` so the spy intercepts it, add `mock.restore()` to the global `afterEach` in `preload.ts`, and set `IMAGE_CACHE_ENABLED=false` in affected tests to avoid disk writes during test runs.
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
import {
|
|
afterEach,
|
|
beforeEach,
|
|
describe,
|
|
expect,
|
|
mock,
|
|
spyOn,
|
|
test,
|
|
} from "bun:test";
|
|
import { eq } from "@sofa/db/helpers";
|
|
import { episodes, seasons, titles } from "@sofa/db/schema";
|
|
import { clearAllTables, testDb } from "@sofa/db/test-utils";
|
|
|
|
const TINY_PNG = Buffer.from(
|
|
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIHWP4//8/AwAI/AL+X2NDNwAAAABJRU5ErkJggg==",
|
|
"base64",
|
|
);
|
|
|
|
let nextBuffer: Buffer | null = TINY_PNG;
|
|
|
|
import { generateEpisodeThumbHash, generateThumbHash } from "../src/thumbhash";
|
|
|
|
beforeEach(() => {
|
|
clearAllTables();
|
|
process.env.IMAGE_CACHE_ENABLED = "false";
|
|
nextBuffer = TINY_PNG;
|
|
spyOn(globalThis, "fetch").mockImplementation((async (
|
|
_input: string | URL | Request,
|
|
_init?: RequestInit,
|
|
) => {
|
|
if (!nextBuffer) {
|
|
return new Response(null, { status: 404 });
|
|
}
|
|
|
|
return new Response(nextBuffer, {
|
|
status: 200,
|
|
headers: { "content-type": "image/png" },
|
|
});
|
|
}) as typeof fetch);
|
|
});
|
|
|
|
afterEach(() => {
|
|
delete process.env.IMAGE_CACHE_ENABLED;
|
|
mock.restore();
|
|
});
|
|
|
|
describe("thumbhash generation", () => {
|
|
test("generates a thumbhash from a loaded image buffer", async () => {
|
|
const hash = await generateThumbHash("/poster.png", "posters");
|
|
expect(hash).toBeString();
|
|
expect(hash).not.toBe("");
|
|
});
|
|
|
|
test("clears a stale episode thumbhash when regeneration fails", async () => {
|
|
testDb
|
|
.insert(titles)
|
|
.values({ id: "tv-1", tmdbId: 100, type: "tv", title: "Show" })
|
|
.run();
|
|
testDb
|
|
.insert(seasons)
|
|
.values({ id: "season-1", titleId: "tv-1", seasonNumber: 1 })
|
|
.run();
|
|
testDb
|
|
.insert(episodes)
|
|
.values({
|
|
id: "ep-1",
|
|
seasonId: "season-1",
|
|
episodeNumber: 1,
|
|
stillPath: "/old-still.png",
|
|
stillThumbHash: "stale-hash",
|
|
})
|
|
.run();
|
|
|
|
nextBuffer = null;
|
|
const hash = await generateEpisodeThumbHash("ep-1", "/new-still.png");
|
|
|
|
const episode = testDb
|
|
.select()
|
|
.from(episodes)
|
|
.where(eq(episodes.id, "ep-1"))
|
|
.get();
|
|
|
|
expect(hash).toBeNull();
|
|
expect(episode?.stillThumbHash).toBeNull();
|
|
});
|
|
});
|