refactor: combine frontmatter fields and block, add tests
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
extractFrontmatterBlock,
|
||||
findFieldRange,
|
||||
formatTagsYamlValue,
|
||||
replaceFrontmatterField,
|
||||
@@ -76,3 +77,55 @@ describe("setFrontmatterTags", () => {
|
||||
expect(result.content).not.toContain("tags: [old]");
|
||||
});
|
||||
});
|
||||
|
||||
describe("extractFrontmatterBlock", () => {
|
||||
it("extracts yaml from a valid block", () => {
|
||||
const block = extractFrontmatterBlock(
|
||||
"---\ntitle: Hello\nstatus: todo\n---\nbody",
|
||||
);
|
||||
expect(block).not.toBeNull();
|
||||
expect(block!.yaml).toBe("title: Hello\nstatus: todo");
|
||||
expect(block!.closeLine).toBe(3);
|
||||
});
|
||||
|
||||
it("returns null when content does not start with ---", () => {
|
||||
expect(extractFrontmatterBlock("no frontmatter")).toBeNull();
|
||||
expect(extractFrontmatterBlock("")).toBeNull();
|
||||
});
|
||||
|
||||
it("handles unclosed frontmatter with trailing newline", () => {
|
||||
const block = extractFrontmatterBlock("---\ntitle: x\n");
|
||||
expect(block).not.toBeNull();
|
||||
expect(block!.closeLine).toBe(-1);
|
||||
expect(block!.yaml).toBe("title: x\n");
|
||||
});
|
||||
|
||||
it("handles unclosed frontmatter without trailing newline", () => {
|
||||
const block = extractFrontmatterBlock("---\ntitle: x");
|
||||
expect(block).not.toBeNull();
|
||||
expect(block!.closeLine).toBe(-1);
|
||||
expect(block!.yaml).toBe("title: x");
|
||||
});
|
||||
|
||||
it("handles CRLF line endings (yaml is normalized to LF)", () => {
|
||||
const block = extractFrontmatterBlock(
|
||||
"---\r\ntitle: Hello\r\nstatus: todo\r\n---\r\nbody",
|
||||
);
|
||||
expect(block).not.toBeNull();
|
||||
expect(block!.yaml).toBe("title: Hello\nstatus: todo");
|
||||
});
|
||||
|
||||
it("handles --- with trailing whitespace", () => {
|
||||
const block = extractFrontmatterBlock(
|
||||
"--- \ntitle: Hello\n--- \nbody",
|
||||
);
|
||||
expect(block).not.toBeNull();
|
||||
expect(block!.yaml).toBe("title: Hello");
|
||||
expect(block!.closeLine).toBe(2);
|
||||
});
|
||||
|
||||
it("only matches --- on the first line", () => {
|
||||
const block = extractFrontmatterBlock("text\n---\ntitle: x\n---\n");
|
||||
expect(block).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user