syntaxai/tdd.md · main · src / b51_render_projects.test.ts
// Sibling test for c51_render_projects.ts (Layer 1, render).
// projectsLandingMd / projectRegisterMd / projectDetailMd take typed
// ProjectRow + viewer inputs and return markdown strings. End-to-end
// shape covered by /projects routes; this pins the pure transform.
import { describe, test, expect } from "bun:test";
import {
projectsLandingMd,
projectRegisterMd,
projectDetailMd,
} from "./b51_render_projects.ts";
import type { ProjectRow } from "./a31_project_config.ts";
const fixture = (): ProjectRow => ({
id: 1,
registeredBy: "alice",
repoOwner: "alice",
repoName: "demo",
testRunner: "bun",
trackedBranches: ["main"],
displayName: null,
team: null,
registeredAt: Date.now(),
status: "active",
});
describe("c51_render_projects — projectsLandingMd", () => {
test("returns a non-empty markdown string for an empty project list", () => {
const md = projectsLandingMd([]);
expect(typeof md).toBe("string");
expect(md.length).toBeGreaterThan(0);
});
test("includes the owner/name pair when given one project", () => {
const md = projectsLandingMd([fixture()]);
expect(md).toContain("alice/demo");
});
});
describe("c51_render_projects — projectRegisterMd", () => {
test("returns markdown that asks an anonymous viewer to sign in", () => {
const md = projectRegisterMd(null);
expect(typeof md).toBe("string");
expect(md.toLowerCase()).toMatch(/sign in|github|register/);
});
test("includes the viewer's name when signed in", () => {
const md = projectRegisterMd("alice");
expect(md).toContain("alice");
});
});
describe("c51_render_projects — projectDetailMd", () => {
test("returns markdown that names the project", () => {
const md = projectDetailMd(fixture());
expect(md).toContain("alice/demo");
});
});