testBlogFeed

tcmts.site.testBlogFeed · #fa4fmc3h · function

import { blogFeed, highlighter, pageList, renderPost, SOURCES } from "#codebase/tcmts/site";
import type { Post } from "#codebase/tcmts/site";
import assert from "node:assert/strict";

export const testBlogFeed = async () => {
  const hl = await highlighter();
  const docs = new Set(pageList(SOURCES["docs/README.md"]!).map((p) => p.file));
  const post = (slug: string, date: string): Post => ({
    slug,
    date,
    author: "Ada <a>",
    md: `# Post ${slug}\n\nRead [the docs](/docs/apps.html), or [Unison](https://www.unison-lang.org).`,
  });
  const posts = [post("two", "2026-12-01"), post("one", "2026-11-07")];
  const feed = blogFeed(posts.map((p) => ({ post: p, rendered: renderPost(p, hl, docs) })));
  assert.equal(feed.match(/<item>/g)?.length, 2);
  assert.ok(feed.indexOf("blog/two.html") < feed.indexOf("blog/one.html"), "newest first");
  assert.match(feed, /<pubDate>Sat, 07 Nov 2026 00:00:00 GMT<\/pubDate>/);
  assert.match(feed, /<lastBuildDate>Tue, 01 Dec 2026 00:00:00 GMT<\/lastBuildDate>/);
  // links made absolute, the post's HTML escaped, as XML has it
  assert.match(feed, /href=&quot;https:\/\/tcm\.codes\/docs\/apps\.html&quot;/);
  assert.match(feed, /href=&quot;https:\/\/www\.unison-lang\.org&quot;/);
  assert.match(feed, /<dc:creator>Ada &lt;a&gt;<\/dc:creator>/);
  assert.doesNotMatch(feed, /<description>[^<]*<p>/);
}

uses