import { describe, expect, it } from "vitest" import type { NavLink } from "@/types/navigation" import { getIconCandidates } from "./icon-candidates" const baseLink: NavLink = { id: "example", title: "Example", description: "Example site", url: "https://example.com/path", categoryId: "dev", pinned: false, keywords: [], sort: 10, } describe("站点图标候选链", () => { it("local 图标后依次回退 favicon 和文字", () => { expect(getIconCandidates({ ...baseLink, icon: "local:custom" })).toEqual([ { kind: "image", src: "/icons/custom.svg" }, { kind: "image", src: "https://example.com/favicon.ico" }, { kind: "initial", value: "E" }, ]) }) it("不允许 local 图标名越出 icons 目录", () => { expect( getIconCandidates({ ...baseLink, icon: "local:../brand/logo" })[0], ).toEqual({ kind: "image", src: "https://example.com/favicon.ico", }) }) it("已知 simple icon 优先使用本地 SVG 数据", () => { expect( getIconCandidates({ ...baseLink, icon: "si:github" })[0], ).toMatchObject({ kind: "simple", slug: "github", }) }) it("未知 simple icon 跳过无效映射", () => { expect(getIconCandidates({ ...baseLink, icon: "si:not-real" })[0]).toEqual({ kind: "image", src: "https://example.com/favicon.ico", }) }) it("去重写法不同但语义相同的 favicon URL", () => { expect( getIconCandidates({ ...baseLink, icon: "url:https://example.com:443/favicon.ico", }), ).toEqual([ { kind: "image", src: "https://example.com/favicon.ico" }, { kind: "initial", value: "E" }, ]) }) it("显式 URL 图标失败后仍回退 favicon 和文字", () => { expect( getIconCandidates({ ...baseLink, icon: "url:https://cdn.example.com/icon.png", }), ).toEqual([ { kind: "image", src: "https://cdn.example.com/icon.png" }, { kind: "image", src: "https://example.com/favicon.ico" }, { kind: "initial", value: "E" }, ]) }) })