package fqapi import "testing" // TestBuildSortedQuery form 编码 + 排序(机型含空格时 URL 与签名一致的关键) func TestBuildSortedQuery(t *testing.T) { got := buildSortedQuery("b=2", "a=1", "device_type=Pixel 6") want := "a=1&b=2&device_type=Pixel+6" if got != want { t.Fatalf("buildSortedQuery = %q, want %q", got, want) } } // TestNormalizeNovelImageURL 插图/封面/已永久化链接的归一化 func TestNormalizeNovelImageURL(t *testing.T) { cases := map[string]string{ // 正文插图(纯 md5)→ origin 原图 "//p9-novel.byteimg.com/img/novel-pic/0123456789abcdef0123456789abcdef": "https://p6-novel.byteimg.com/origin/novel-pic/0123456789abcdef0123456789abcdef", // 已永久化的链接幂等 "https://p6-novel.byteimg.com/origin/novel-pic/0123456789abcdef0123456789abcdef": "https://p6-novel.byteimg.com/origin/novel-pic/0123456789abcdef0123456789abcdef", // 封面模板图(~tplv 缩放)→ 保留原路径仅换域名 "https://p3-novel.byteimg.com/novel-pic/0123456789abcdef0123456789abcdef~tplv-novel-pic-large.webp": "https://p6-novel.byteimg.com/novel-pic/0123456789abcdef0123456789abcdef~tplv-novel-pic-large.webp", // 非 novel-pic 链接原样返回 "https://example.com/other.jpg": "https://example.com/other.jpg", } for in, want := range cases { if got := NormalizeNovelImageURL(in); got != want { t.Errorf("NormalizeNovelImageURL(%q) = %q, want %q", in, got, want) } } }