syntaxai/tdd.md · main · src / b51_render_projects.test.ts

b51_render_projects.test.ts 59 lines · 1815 bytes raw
// 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");
  });
});