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(`