70 lines
4.3 KiB
TypeScript
70 lines
4.3 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { LinkError } from "../src/core/links";
|
|
import {
|
|
archivePrefixes, fetchUrlFor, isSameWebtoonsSeries, isWebtoonsSeriesUrl, mangabakaLanguage,
|
|
normalizeImageUrl, parseWebtoonsUrl,
|
|
} from "../src/core/sources/webtoons/urls";
|
|
|
|
test("parses official, canvas, mobile and canonicalised links", () => {
|
|
expect(parseWebtoonsUrl(new URL("https://www.webtoons.com/en/fantasy/tower-of-god/list?title_no=95")))
|
|
.toEqual({ titleNo: "95", languageSegment: "en", canvas: false });
|
|
expect(parseWebtoonsUrl(new URL("https://m.webtoons.com/fr/romance/x/list?title_no=1&page=3")))
|
|
.toEqual({ titleNo: "1", languageSegment: "fr", canvas: false });
|
|
expect(parseWebtoonsUrl(new URL("https://www.webtoons.com/en/canvas/crow-time/list?title_no=693372")))
|
|
.toEqual({ titleNo: "693372", languageSegment: "en", canvas: true });
|
|
expect(parseWebtoonsUrl(new URL("https://www.webtoons.com/-/-/-/list?title_no=95")))
|
|
.toEqual({ titleNo: "95", languageSegment: null, canvas: false });
|
|
expect(parseWebtoonsUrl(new URL("https://www.webtoons.com/zh-hant/fantasy/x/list?title_no=160")).languageSegment)
|
|
.toBe("zh-hant");
|
|
});
|
|
|
|
test("rejects links without a numeric title_no or on other hosts", () => {
|
|
expect(() => parseWebtoonsUrl(new URL("https://www.webtoons.com/en/fantasy/tower-of-god/list"))).toThrow(LinkError);
|
|
expect(() => parseWebtoonsUrl(new URL("https://www.webtoons.com/en/x/list?title_no=abc"))).toThrow(LinkError);
|
|
expect(() => parseWebtoonsUrl(new URL("https://tapas.io/series/x"))).toThrow(LinkError);
|
|
expect(isWebtoonsSeriesUrl(new URL("https://www.webtoons.com/en/x/list?title_no=95"))).toBe(true);
|
|
expect(isWebtoonsSeriesUrl(new URL("https://www.webtoons.com/en/x/viewer?title_no=95&episode_no=1"))).toBe(true);
|
|
expect(isWebtoonsSeriesUrl(new URL("https://tapas.io/?title_no=95"))).toBe(false);
|
|
});
|
|
|
|
test("maps Webtoons language segments to MangaBaka codes", () => {
|
|
expect(mangabakaLanguage("en")).toBe("en");
|
|
expect(mangabakaLanguage("zh-hant")).toBe("zh-Hant");
|
|
expect(mangabakaLanguage("de")).toBe("de");
|
|
expect(mangabakaLanguage(null)).toBe("unknown");
|
|
expect(mangabakaLanguage("xx")).toBe("unknown");
|
|
});
|
|
|
|
test("fetches the /-/-/-/ form (official) or /-/canvas/-/ form (canvas); both redirect to the canonical page", () => {
|
|
expect(fetchUrlFor("95")).toBe("https://www.webtoons.com/-/-/-/list?title_no=95");
|
|
expect(fetchUrlFor("693372", true)).toBe("https://www.webtoons.com/-/canvas/-/list?title_no=693372");
|
|
});
|
|
|
|
test("archive prefixes cover www. and m. without a scheme", () => {
|
|
expect(archivePrefixes("https://www.webtoons.com/en/fantasy/tower-of-god/list?title_no=95")).toEqual([
|
|
"www.webtoons.com/en/fantasy/tower-of-god/list?title_no=95",
|
|
"m.webtoons.com/en/fantasy/tower-of-god/list?title_no=95",
|
|
]);
|
|
});
|
|
|
|
test.each([
|
|
["https://webtoon-phinf.pstatic.net/20250204_46/17386458444547o1b2_JPEG/95.jpg?type=crop540_540",
|
|
"https://swebtoon-phinf.pstatic.net/20250204_46/17386458444547o1b2_JPEG/95.jpg"],
|
|
["http://swebtoon.phinf.naver.net/20140710_28/1404979632969uKBA8_JPEG/01_EC8BA0EC9D98ED8391.jpg",
|
|
"https://swebtoon-phinf.pstatic.net/20140710_28/1404979632969uKBA8_JPEG/01_EC8BA0EC9D98ED8391.jpg"],
|
|
["http://webtoon.phinf.naver.net/20140915_195/1410759727783HvB4R_JPEG/11_EC8BA0EC9D98ED8391_bg.jpg",
|
|
"https://swebtoon-phinf.pstatic.net/20140915_195/1410759727783HvB4R_JPEG/11_EC8BA0EC9D98ED8391_bg.jpg"],
|
|
["//swebtoon-phinf.pstatic.net/a/b c).jpg", "https://swebtoon-phinf.pstatic.net/a/b%20c).jpg"],
|
|
["https://example.org/x.jpg?keep=1", "https://example.org/x.jpg?keep=1"],
|
|
])("normalizeImageUrl(%p)", (raw, expected) => {
|
|
expect(normalizeImageUrl(raw, "https://www.webtoons.com/en/x/list?title_no=1")).toBe(expected);
|
|
});
|
|
|
|
test("isSameWebtoonsSeries compares title_no exactly, including MangaBaka's canonical form", () => {
|
|
expect(isSameWebtoonsSeries("https://www.webtoons.com/-/-/-/list?title_no=95", "95")).toBe(true);
|
|
expect(isSameWebtoonsSeries("http://www.webtoons.com:80/en/fantasy/tower-of-god/list?title_no=95", "95")).toBe(true);
|
|
expect(isSameWebtoonsSeries("https://www.webtoons.com/-/-/-/list?title_no=950", "95")).toBe(false);
|
|
expect(isSameWebtoonsSeries("https://comic.naver.com/webtoon/list?titleId=95", "95")).toBe(false);
|
|
expect(isSameWebtoonsSeries("not a url", "95")).toBe(false);
|
|
});
|