Files
2026-07-13 13:39:12 +08:00

80 lines
2.0 KiB
JavaScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import {
parseFrontmatter,
serializeFrontmatter,
stripFrontmatter,
} from "../../../scripts/features/lib/frontmatter.mjs";
describe("parseFrontmatter", () => {
it("returns null when no frontmatter", () => {
assert.equal(parseFrontmatter("# Heading\nbody"), null);
});
it("parses simple key-value frontmatter", () => {
const md = `---
issue: 1046
last_synced_at: 2026-05-18T14:30:00Z
last_synced_comment_id: 1234567890
---
# Body`;
const r = parseFrontmatter(md);
assert.equal(r.issue, 1046);
assert.equal(r.last_synced_at, "2026-05-18T14:30:00Z");
assert.equal(r.last_synced_comment_id, 1234567890);
});
it("parses nested snapshot block", () => {
const md = `---
issue: 1046
snapshot:
thumbs: 8
commenters: 4
labels: [enhancement, ui]
state: open
---
body`;
const r = parseFrontmatter(md);
assert.equal(r.snapshot.thumbs, 8);
assert.equal(r.snapshot.commenters, 4);
assert.deepEqual(r.snapshot.labels, ["enhancement", "ui"]);
assert.equal(r.snapshot.state, "open");
});
it("returns null on malformed delimiters", () => {
assert.equal(parseFrontmatter("---\nfoo: bar\n# no close"), null);
});
});
describe("serializeFrontmatter", () => {
it("round-trips a parsed object", () => {
const original = `---
issue: 1046
last_synced_comment_id: 1234567890
snapshot:
thumbs: 8
commenters: 4
state: open
---
# Body
content here`;
const meta = parseFrontmatter(original);
const re = serializeFrontmatter(meta, "# Body\ncontent here");
const parsed2 = parseFrontmatter(re);
assert.deepEqual(parsed2, meta);
});
});
describe("stripFrontmatter", () => {
it("returns body after frontmatter", () => {
const md = "---\nissue: 1\n---\n\n# Body";
assert.equal(stripFrontmatter(md), "# Body");
});
it("returns full text if no frontmatter", () => {
assert.equal(stripFrontmatter("# Body"), "# Body");
});
});