Files
oh-my-pi/packages/coding-agent/test/discovery/helpers.test.ts
T
can1357 63e087368f refactor(coding-agent): added kebabToCamel and normalizeKeys utility
- Added kebabToCamel and normalizeKeys utility functions to convert kebab-case keys to camelCase recursively. Updated parseFrontmatter to normalize all parsed keys, ensuring consistent camelCase property access throughout the codebase. Updated all frontmatter key accesses to use camelCase notation (e.g., thinkingLevel, spdxId).
2026-03-05 00:25:13 +01:00

150 lines
3.3 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { parseFrontmatter } from "@oh-my-pi/pi-coding-agent/utils/frontmatter";
describe("parseFrontmatter", () => {
const parse = (content: string) => parseFrontmatter(content, { source: "tests:frontmatter", level: "off" });
test("parses simple key-value pairs", () => {
const content = `---
name: test
enabled: true
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({ name: "test", enabled: true });
expect(result.body).toBe("Body content");
});
test("parses YAML list syntax", () => {
const content = `---
tags:
- javascript
- typescript
- react
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({
tags: ["javascript", "typescript", "react"],
});
expect(result.body).toBe("Body content");
});
test("parses multi-line string values", () => {
const content = `---
description: |
This is a multi-line
description block
with several lines
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({
description: "This is a multi-line\ndescription block\nwith several lines\n",
});
expect(result.body).toBe("Body content");
});
test("parses nested objects", () => {
const content = `---
config:
server:
port: 3000
host: localhost
database:
name: mydb
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({
config: {
server: { port: 3000, host: "localhost" },
database: { name: "mydb" },
},
});
expect(result.body).toBe("Body content");
});
test("parses mixed complex YAML", () => {
const content = `---
name: complex-test
version: 1.0.0
tags:
- prod
- critical
metadata:
author: tester
created: 2024-01-01
description: |
Multi-line description
with formatting
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({
name: "complex-test",
version: "1.0.0",
tags: ["prod", "critical"],
metadata: {
author: "tester",
created: "2024-01-01",
},
description: "Multi-line description\nwith formatting\n",
});
expect(result.body).toBe("Body content");
});
test("handles missing frontmatter", () => {
const content = "Just body content";
const result = parse(content);
expect(result.frontmatter).toEqual({});
expect(result.body).toBe("Just body content");
});
test("handles invalid YAML in frontmatter", () => {
const content = `---
invalid: [unclosed array
---
Body content`;
const result = parse(content);
// Simple fallback parser extracts key:value pairs it can parse
expect(result.frontmatter).toEqual({ invalid: "[unclosed array" });
// Body is still extracted even with invalid YAML
expect(result.body).toBe("Body content");
});
test("handles empty frontmatter", () => {
const content = `---
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({});
expect(result.body).toBe("Body content");
});
test("normalizes kebab-case keys to camelCase", () => {
const content = `---
thinking-level: medium
output-schema: json
nested-field:
inner-key: value
---
Body content`;
const result = parse(content);
expect(result.frontmatter).toEqual({
thinkingLevel: "medium",
outputSchema: "json",
nestedField: { innerKey: "value" },
});
expect(result.body).toBe("Body content");
});
});