mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-08-29 02:45:39 -04:00
bun's mock.module persists across test files in the same process, causing image.test.ts to receive the stub instead of the real tmdbImageUrl. Since tmdbImageUrl has no heavy runtime dependencies, service tests work fine with the real implementation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import { beforeEach, describe, expect, test } from "bun:test";
|
|
import { persons, titleCast } from "@/lib/db/schema";
|
|
import { clearAllTables, insertTitle, testDb } from "@/lib/test-utils";
|
|
|
|
import { getLocalFilmography } from "./person";
|
|
|
|
beforeEach(() => {
|
|
clearAllTables();
|
|
});
|
|
|
|
function insertPerson(id: string, tmdbId: number, name: string) {
|
|
testDb.insert(persons).values({ id, tmdbId, name }).run();
|
|
return id;
|
|
}
|
|
|
|
function insertCastEntry(
|
|
titleId: string,
|
|
personId: string,
|
|
overrides: {
|
|
character?: string | null;
|
|
department?: string;
|
|
job?: string | null;
|
|
displayOrder?: number;
|
|
} = {},
|
|
) {
|
|
testDb
|
|
.insert(titleCast)
|
|
.values({
|
|
titleId,
|
|
personId,
|
|
character: overrides.character ?? "Character",
|
|
department: overrides.department ?? "Acting",
|
|
job: overrides.job ?? null,
|
|
displayOrder: overrides.displayOrder ?? 0,
|
|
lastFetchedAt: new Date(),
|
|
})
|
|
.run();
|
|
}
|
|
|
|
describe("getLocalFilmography", () => {
|
|
test("returns filmography for a person", () => {
|
|
insertTitle({ id: "m1", tmdbId: 1, title: "Movie One" });
|
|
insertTitle({ id: "m2", tmdbId: 2, title: "Movie Two" });
|
|
insertPerson("p1", 100, "Test Actor");
|
|
insertCastEntry("m1", "p1", { character: "Hero" });
|
|
insertCastEntry("m2", "p1", { character: "Sidekick" });
|
|
|
|
const filmography = getLocalFilmography("p1");
|
|
expect(filmography).toHaveLength(2);
|
|
expect(filmography.map((f) => f.title).sort()).toEqual([
|
|
"Movie One",
|
|
"Movie Two",
|
|
]);
|
|
});
|
|
|
|
test("includes crew roles", () => {
|
|
insertTitle({ id: "m1", tmdbId: 1, title: "Directed Movie" });
|
|
insertPerson("p1", 100, "Director Person");
|
|
insertCastEntry("m1", "p1", {
|
|
character: null,
|
|
department: "Directing",
|
|
job: "Director",
|
|
});
|
|
|
|
const filmography = getLocalFilmography("p1");
|
|
expect(filmography).toHaveLength(1);
|
|
expect(filmography[0].department).toBe("Directing");
|
|
expect(filmography[0].job).toBe("Director");
|
|
});
|
|
|
|
test("returns empty for person with no credits", () => {
|
|
insertPerson("p1", 100, "Unknown Actor");
|
|
const filmography = getLocalFilmography("p1");
|
|
expect(filmography).toHaveLength(0);
|
|
});
|
|
|
|
test("returns correct title types", () => {
|
|
insertTitle({ id: "m1", tmdbId: 1, type: "movie", title: "A Movie" });
|
|
insertTitle({ id: "tv1", tmdbId: 2, type: "tv", title: "A Show" });
|
|
insertPerson("p1", 100, "Versatile Actor");
|
|
insertCastEntry("m1", "p1");
|
|
insertCastEntry("tv1", "p1");
|
|
|
|
const filmography = getLocalFilmography("p1");
|
|
const types = filmography.map((f) => f.type).sort();
|
|
expect(types).toEqual(["movie", "tv"]);
|
|
});
|
|
});
|