46 lines
1.8 KiB
TypeScript
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();
|
|
});
|
|
});
|