Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
77 lines
2.1 KiB
TypeScript
77 lines
2.1 KiB
TypeScript
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" },
|
|
])
|
|
})
|
|
})
|