import { describe, expect, test } from "vitest"; import { JSDOM } from "jsdom"; import { extractMetadataFromDocument, extractPublishedTime, formatMetadataBlock, pickBestContentNode, } from "../utils"; describe("extractMetadataFromDocument", () => { test("extracts metadata from standard meta tags", () => { const html = ` Doc Title `; const document = new JSDOM(html).window.document; const metadata = extractMetadataFromDocument(document); expect(metadata.title).toBe("OG Title"); expect(metadata.byline).toBe("Ada Lovelace"); expect(metadata.siteName).toBe("Example Site"); expect(metadata.publishedTime).toBe("2025-01-01T10:00:00Z"); expect(metadata.lang).toBe("en"); }); }); describe("extractPublishedTime", () => { test("falls back to time elements", () => { const html = ` `; const document = new JSDOM(html).window.document; expect(extractPublishedTime(document)).toBe("2024-12-24"); }); }); describe("pickBestContentNode", () => { test("chooses the most substantial content block", () => { const html = `
Short.

This is the main content with more text than the article.

Another sentence to make it longer.

`; const document = new JSDOM(html).window.document; const selected = pickBestContentNode(document); expect(selected?.selector).toBe("main"); expect(selected?.text).toContain("main content"); }); }); describe("formatMetadataBlock", () => { test("renders metadata lines", () => { const block = formatMetadataBlock( { title: "Article Title", byline: "Author Name", siteName: "Site", publishedTime: "2024-10-01", lang: "en", }, { url: "https://example.com", contentType: "text/html" }, ); expect(block).toContain("URL: https://example.com"); expect(block).toContain("Content-Type: text/html"); expect(block).toContain("Title: Article Title"); expect(block).toContain("Byline: Author Name"); expect(block).toContain("Site: Site"); expect(block).toContain("Published: 2024-10-01"); expect(block).toContain("Language: en"); }); });