package cockpit import ( "strings" "testing" ) // synthPlaybook builds a minimal read-only playbook for aggregate-render // tests, with a distinct name so set ordering is observable. func synthPlaybook(name string) Playbook { return Playbook{ Name: name, Description: "synthetic " + name + " playbook for tests", Intent: Intent{ Guarantee: "reads and reports only", Forbidden: []string{"git commit", "edit any tracked file"}, }, Capabilities: []Capability{ {Kind: "tool", Name: "Read"}, {Kind: "bash", Verb: "git status", Scope: "*"}, }, Steps: []Step{ {Index: 0, Title: "look", Body: "inspect the tree"}, {Index: 1, Title: "report", Body: "print findings"}, }, OutputFormat: "a short report", } } func twoPlaybooks(t *testing.T) []Playbook { t.Helper() return []Playbook{loadHandover(t), synthPlaybook("zeta")} } func TestAgentsRender_Structure(t *testing.T) { out, err := agentsRenderer{}.RenderAll(twoPlaybooks(t)) if err != nil { t.Fatalf("RenderAll: %v", err) } got := string(out) if strings.HasPrefix(got, "---") { t.Error("AGENTS.md must not carry YAML frontmatter") } for _, want := range []string{"# AGENTS.md", advisoryBanner, "## Fidelity report", "### " + headingForbidden, "### " + headingAllowed} { if !strings.Contains(got, want) { t.Errorf("AGENTS.md missing %q", want) } } // Both playbooks' sections present (sorted by Name → handover before zeta). hIdx := strings.Index(got, "## Handover") zIdx := strings.Index(got, "## Zeta") if hIdx < 0 || zIdx < 0 { t.Fatalf("missing a playbook section: handover@%d zeta@%d", hIdx, zIdx) } if hIdx > zIdx { t.Error("sections not sorted by Name (handover should precede zeta)") } } func TestAgentsRender_SetOrderStable(t *testing.T) { a, err := agentsRenderer{}.RenderAll([]Playbook{loadHandover(t), synthPlaybook("zeta")}) if err != nil { t.Fatal(err) } b, err := agentsRenderer{}.RenderAll([]Playbook{synthPlaybook("zeta"), loadHandover(t)}) if err != nil { t.Fatal(err) } if string(a) != string(b) { t.Error("aggregate render not stable under input reordering") } } func TestAgentsAggRelPath(t *testing.T) { if got := (agentsRenderer{}).AggRelPath(); got != "AGENTS.md" { t.Errorf("AggRelPath = %q, want AGENTS.md", got) } if !IsAggregateTarget("agents") { t.Error("agents should be an aggregate target") } } func TestAgentsEnforcement(t *testing.T) { if got := (agentsRenderer{}).Enforcement(); got != EnforcementAdvisory { t.Errorf("agents enforcement = %v, want advisory", got) } }