Files
fristydev/lib/game/game-profile.test.ts
T
fristy 864b9226fc
Build & Push / Lint & Build (pull_request) Failing after 52s
Build & Push / Build & Push Image (pull_request) Skipped
Build & Push / Trigger Deploy (pull_request) Skipped
desloppify: code health overhaul plus abuse hardening (140 green, strict 87.2)
Honest baseline after removing 45 gaming suppressions. Structural: lib/game plus root hooks extraction, CORS origin echo, DEV_ORIGINS layering. Fixes: error-cause binding, discord 5xx split, null-cache guard, co-located tests, rejecting-fetch coverage, naming and typing cleanup, socket controller, cache bound, cascade helpers, latch resets. Hardening: per-IP rate limit on API routes, deterministic-miss UX, retry cooldown plus cap. Suite 140 green, build plus lint clean.
2026-09-11 23:54:59 +03:00

95 lines
3.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { buildLinks, mergePeople, mergePlatforms, selectScreenshots } from "@/lib/game/game-profile";
import type { IgdbGame } from "@/lib/game/game-profile-types";
describe("mergePeople", () => {
it("prefers IGDB companies when present", () => {
const igdb = {
involved_companies: [
{ developer: true, company: { name: "Dev Studio" } },
{ publisher: true, company: { name: "Pub Inc" } },
],
} as IgdbGame;
const { developers, publishers } = mergePeople(igdb, null, null);
expect(developers).toEqual(["Dev Studio"]);
expect(publishers).toEqual(["Pub Inc"]);
});
it("falls back to Steam and ITAD lists", () => {
const steam = { developers: ["Valve"], publishers: ["Valve"] };
const { developers, publishers } = mergePeople(null, steam, null);
expect(developers).toEqual(["Valve"]);
expect(publishers).toEqual(["Valve"]);
});
it("returns empty lists without sources", () => {
expect(mergePeople(null, null, null)).toEqual({ developers: [], publishers: [] });
});
});
describe("mergePlatforms", () => {
it("normalizes IGDB platform names", () => {
const igdb = {
platforms: [{ name: "PC (Microsoft Windows)" }, { name: "Mac" }, { name: "Switch" }],
} as IgdbGame;
expect(mergePlatforms(igdb, null, undefined)).toEqual(["Windows", "MacOS", "Switch"]);
});
it("merges IGDB, Steam, and SKU platforms without early exit", () => {
const igdb = { platforms: [{ name: "Switch" }] } as IgdbGame;
const steam = { platforms: { windows: true, mac: false, linux: false } };
const entry = { id: "g", name: "G", third_party_skus: [{ distributor: "xbox", id: "1" }] };
expect(mergePlatforms(igdb, steam, entry)).toEqual(["Switch", "Windows", "Xbox"]);
});
it("still resolves SKUs when Steam data is missing", () => {
const entry = {
id: "g",
name: "G",
third_party_skus: [{ distributor: "playstation", id: "1" }],
};
expect(mergePlatforms(null, null, entry)).toEqual(["PlayStation"]);
});
});
describe("buildLinks", () => {
it("labels known categories and dedupes", () => {
const igdb = {
websites: [
{ url: "https://store.steampowered.com/app/1", category: 13 },
{ url: "https://store.steampowered.com/app/1", category: 13 },
{ url: "example.com", category: 99 },
],
} as IgdbGame;
const links = buildLinks(igdb);
expect(links).toHaveLength(2);
expect(links[0]).toEqual({
label: "Steam",
url: "https://store.steampowered.com/app/1",
});
expect(links[1].label).toBe("example.com");
});
it("returns no links without websites", () => {
expect(buildLinks(null)).toEqual([]);
});
});
describe("selectScreenshots", () => {
it("prefers IGDB shots and caps at 8", () => {
const igdb = {
screenshots: Array.from({ length: 10 }, (_, i) => ({
url: `//images.igdb.com/t_thumb/${i}.jpg`,
})),
} as IgdbGame;
const shots = selectScreenshots(igdb, null);
expect(shots).toHaveLength(8);
expect(shots[0]).toContain("t_screenshot_big");
});
it("falls back to Steam shots", () => {
const steam = { screenshots: [{ path_full: "https://cdn/shot.jpg" }] };
expect(selectScreenshots(null, steam)).toEqual(["https://cdn/shot.jpg"]);
});
});