brackt/app/lib/__tests__/sport-icon-url.test.ts
2026-05-08 21:19:09 -07:00

46 lines
1.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
isCloudinarySportIconUrl,
isLegacySportIconFilename,
parseSportIconUrlInput,
resolveSportIconUrl,
} from "../sport-icon-url";
describe("resolveSportIconUrl", () => {
it("returns null for empty values", () => {
expect(resolveSportIconUrl(null)).toBeNull();
expect(resolveSportIconUrl(undefined)).toBeNull();
});
it("keeps remote and absolute URLs unchanged", () => {
expect(resolveSportIconUrl("https://res.cloudinary.com/demo/image/upload/v1/sports-icons/nfl.svg")).toBe(
"https://res.cloudinary.com/demo/image/upload/v1/sports-icons/nfl.svg"
);
expect(resolveSportIconUrl("/custom/icon.svg")).toBe("/custom/icon.svg");
});
it("resolves legacy filenames from public sports-icons", () => {
expect(resolveSportIconUrl("nfl.svg")).toBe("/sports-icons/nfl.svg");
});
});
describe("sport icon URL validation", () => {
it("accepts Cloudinary sports icon SVG URLs", () => {
const url = "https://res.cloudinary.com/demo/image/upload/v123/sports-icons/nfl.svg";
expect(isCloudinarySportIconUrl(url)).toBe(true);
expect(parseSportIconUrlInput(url)).toBe(url);
});
it("accepts legacy SVG filenames", () => {
expect(isLegacySportIconFilename("nfl.svg")).toBe(true);
expect(parseSportIconUrlInput("nfl.svg")).toBe("nfl.svg");
});
it("rejects arbitrary URLs and non-SVG files", () => {
expect(parseSportIconUrlInput("https://example.com/icon.svg")).toBeUndefined();
expect(parseSportIconUrlInput("https://res.cloudinary.com/demo/image/upload/v123/avatars/nfl.svg")).toBeUndefined();
expect(parseSportIconUrlInput("nfl.png")).toBeUndefined();
expect(parseSportIconUrlInput("../nfl.svg")).toBeUndefined();
expect(parseSportIconUrlInput("/sports-icons/nfl.svg")).toBeUndefined();
});
});