Files
mangabaka-seeder/test/webtoons-urls.test.ts
T

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);
});