import "../setup.ts"; import { assertEquals } from "@std/assert"; import { absoluteHttpUrl, decodeHtmlEntities, normalizeCssColor, parsePage, } from "../../remote/html.ts"; const BASE = "https://example.com/articles/1"; const read = (html: string) => parsePage(html, BASE); Deno.test("parsePage meta: either attribute, either order, entities decoded", () => { const page = read(` `); assertEquals(page.meta("og:title"), "Tom & Jerry — ❤"); assertEquals(page.meta("og:description"), "Desc"); assertEquals(page.meta("twitter:title"), "TW"); // Sites write og: tags under `name` too. assertEquals(page.meta("og:image"), "https://example.com/by-name.jpg"); assertEquals(page.meta("OG:Title"), "Tom & Jerry — ❤"); assertEquals(page.meta("og:url"), undefined); }); Deno.test("parsePage meta: attributes read as a browser reads them", () => { const page = read(` `); assertEquals(page.meta("og:title"), "Unquoted"); assertEquals(page.meta("og:description"), "a > b, still the tag"); assertEquals(page.meta("og:image"), undefined); assertEquals(page.meta("og:site_name"), undefined); // A blank value is no value, so a fallback can take over. assertEquals(page.meta("og:type"), undefined); }); Deno.test("parsePage: tags in comments and scripts aren't read", () => { const page = read(` `); assertEquals(page.meta("og:title"), "Real"); // An unclosed comment runs to the end of the page. assertEquals( read(`