import { html, stubNetwork } from "../../helpers.ts";
import { assert, assertEquals } from "@std/assert";
import { fetchRichContent } from "../../../services/rich-content-service.ts";
const BASE = "https://example.com/articles/1";
Deno.test("generic provider: the full fallback chain", async () => {
using _ = stubNetwork(() =>
html(`
Page title
`)
);
const content = await fetchRichContent(BASE);
assertEquals(content, {
type: "generic",
url: BASE,
title: "OG title",
description: "Plain description",
thumbnailUrl: "https://example.com/og.jpg",
faviconUrl: "https://example.com/favicon-32.png",
accentColor: "#0080ff",
siteName: "Example",
});
});
Deno.test("generic provider: a site-wide og:url means og:title/image are ignored", async () => {
using _ = stubNetwork(() =>
html(`
`)
);
const content = await fetchRichContent("https://www.example.com/articles/1");
assertEquals(content?.title, "Article title");
assertEquals(content?.thumbnailUrl, "https://www.example.com/photo.jpg");
assertEquals(content?.siteName, "example.com");
assertEquals(content?.faviconUrl, "https://www.example.com/favicon.ico");
});
Deno.test("generic provider: non-HTML responses carry just the URL", async () => {
using _ = stubNetwork(() =>
new Response("{}", { headers: { "content-type": "application/json" } })
);
assertEquals(await fetchRichContent(BASE), { type: "generic", url: BASE });
});
Deno.test("generic provider: a canonical og:url with a slug keeps the OG tags", async () => {
using _ = stubNetwork(() =>
html(`
How to X - Example`)
);
const content = await fetchRichContent("https://example.com/q/123");
assertEquals(content?.title, "How to X");
assertEquals(content?.thumbnailUrl, "https://example.com/x.jpg");
});
Deno.test("generic provider: relative URLs resolve against the page after redirects", async () => {
using _ = stubNetwork((url) =>
url.hostname === "old.example"
? new Response(null, {
status: 301,
headers: { location: "https://new.example/b/page" },
})
: html(`
`)
);
const content = await fetchRichContent("https://old.example/a");
assertEquals(content?.url, "https://old.example/a");
assertEquals(content?.thumbnailUrl, "https://new.example/og.png");
assertEquals(content?.faviconUrl, "https://new.example/favicon.ico");
});
Deno.test("generic provider: an og:image that isn't http(s) falls through", async () => {
using _ = stubNetwork(() =>
html(`
`)
);
assertEquals(
(await fetchRichContent(BASE))?.thumbnailUrl,
"https://cdn.example/tw.png",
);
});
Deno.test("generic provider: a loses its site suffix", async () => {
using _ = stubNetwork(() =>
html(`
Un article écrit — Le Monde`)
);
const content = await fetchRichContent(BASE);
assertEquals(content?.title, "Un article écrit");
assertEquals(content?.siteName, "Le Monde");
});
Deno.test("generic provider: text on one line, and of bounded length", async () => {
using _ = stubNetwork(() =>
html(`
A title
on two lines
`)
);
const content = await fetchRichContent(BASE);
assertEquals(content?.title, "A title on two lines");
assertEquals([...content!.description!].length, 1000);
assert(content!.description!.endsWith("word…"));
});