// 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"); }); });