import "../setup.ts"; import { assertEquals } from "@std/assert"; import { extractBestIcon, extractFirstContentImage, extractJsonLd, extractLargeImage, extractMaskIconColor, extractMetaName, extractOgTag, extractPageTitle, extractThemeColor, normalizeCssColor, } from "../../remote/html.ts"; const BASE = "https://example.com/articles/1"; Deno.test("extractOgTag / extractMetaName: either attribute order, entities decoded", () => { const page = ` `; assertEquals(extractOgTag(page, "title"), "Tom & Jerry — ❤"); assertEquals(extractOgTag(page, "description"), "Desc"); assertEquals(extractOgTag(page, "image"), undefined); assertEquals(extractMetaName(page, "twitter:title"), "TW"); }); Deno.test("extractOgTag: content never spans into the next tag", () => { const page = ``; assertEquals(extractOgTag(page, "title"), undefined); }); Deno.test("extractPageTitle", () => { assertEquals( extractPageTitle(" A <b> "), "A ", ); assertEquals(extractPageTitle("

none

"), undefined); }); Deno.test("extractThemeColor: unscoped, then light, then any", () => { assertEquals( extractThemeColor(` `), "#fff", ); assertEquals( extractThemeColor(` `), "#123", ); assertEquals( extractThemeColor( ``, ), "#000", ); assertEquals( extractMaskIconColor( ``, ), "#5bbad5", ); }); Deno.test("normalizeCssColor", () => { assertEquals(normalizeCssColor("#ABC"), "#aabbcc"); assertEquals(normalizeCssColor("#abcd"), "#aabbcc"); assertEquals(normalizeCssColor("#112233"), "#112233"); assertEquals(normalizeCssColor("#11223380"), "#112233"); assertEquals(normalizeCssColor(" Navy "), "#000080"); assertEquals(normalizeCssColor("rgb(255, 0, 128)"), "#ff0080"); assertEquals(normalizeCssColor("rgba(300 -5 50% / .5)"), "#ff0080"); assertEquals(normalizeCssColor("#12345"), undefined); assertEquals(normalizeCssColor("hsl(0 100% 50%)"), undefined); assertEquals(normalizeCssColor("rgb(1,2)"), undefined); assertEquals(normalizeCssColor("transparent"), undefined); assertEquals(normalizeCssColor(undefined), undefined); }); Deno.test("extractJsonLd: @graph, arrays and image shapes", () => { const ld = (data: unknown) => ``; assertEquals( extractJsonLd( ld({ "@graph": [{ "@type": "WebSite" }, { headline: "Head", image: { url: "https://i/1.jpg" }, }], }), ), { title: "Head", description: undefined, thumbnailUrl: "https://i/1.jpg" }, ); assertEquals( extractJsonLd(ld({ name: ["N"], image: ["https://i/2.jpg"] })).thumbnailUrl, "https://i/2.jpg", ); assertEquals( extractJsonLd(ld({ name: "N", image: "/relative.jpg" })).thumbnailUrl, undefined, ); // Invalid JSON is skipped for the next block. assertEquals( extractJsonLd( `${ ld({ name: "Second" }) }`, ).title, "Second", ); assertEquals(extractJsonLd("

"), {}); }); Deno.test("image extraction: large images, content images, relative URLs", () => { const page = ` `; assertEquals( extractLargeImage(page, BASE), "https://example.com/photos/cat.jpg", ); assertEquals( extractFirstContentImage(page, BASE), "https://example.com/small.jpg", ); assertEquals( extractFirstContentImage(``, BASE), "https://cdn.test/a.jpg", ); }); Deno.test("extractBestIcon: SVG beats everything, else the largest", () => { assertEquals( extractBestIcon( ` `, BASE, ), "https://example.com/180.png", ); assertEquals( extractBestIcon( ` `, BASE, ), "https://example.com/icon", ); assertEquals(extractBestIcon("

", BASE), undefined); });