package templates import ( "strings" "testing" ) func TestNew(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } if tmpl == nil { t.Fatal("New() returned nil") } } func TestRenderRole_Mayor(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } data := RoleData{ Role: "mayor", TownRoot: "/test/town", WorkDir: "/test/town", } output, err := tmpl.RenderRole("mayor", data) if err != nil { t.Fatalf("RenderRole() error = %v", err) } // Check for key content if !strings.Contains(output, "Mayor Context") { t.Error("output missing 'Mayor Context'") } if !strings.Contains(output, "/test/town") { t.Error("output missing town root") } if !strings.Contains(output, "global coordinator") { t.Error("output missing role description") } } func TestRenderRole_Polecat(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } data := RoleData{ Role: "polecat", RigName: "myrig", TownRoot: "/test/town", WorkDir: "/test/town/myrig/polecats/TestCat", Polecat: "TestCat", } output, err := tmpl.RenderRole("polecat", data) if err != nil { t.Fatalf("RenderRole() error = %v", err) } // Check for key content if !strings.Contains(output, "Polecat Context") { t.Error("output missing 'Polecat Context'") } if !strings.Contains(output, "TestCat") { t.Error("output missing polecat name") } if !strings.Contains(output, "myrig") { t.Error("output missing rig name") } } func TestRenderRole_Deacon(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } data := RoleData{ Role: "deacon", TownRoot: "/test/town", WorkDir: "/test/town", } output, err := tmpl.RenderRole("deacon", data) if err != nil { t.Fatalf("RenderRole() error = %v", err) } // Check for key content if !strings.Contains(output, "Deacon Context") { t.Error("output missing 'Deacon Context'") } if !strings.Contains(output, "/test/town") { t.Error("output missing town root") } if !strings.Contains(output, "Patrol Executor") { t.Error("output missing role description") } if !strings.Contains(output, "Patrol Execution Protocol") { t.Error("output missing patrol execution section") } if !strings.Contains(output, "mol-deacon-patrol") { t.Error("output missing patrol molecule reference") } } func TestRenderMessage_Spawn(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } data := SpawnData{ Issue: "gt-123", Title: "Test Issue", Priority: 1, Description: "Test description", Branch: "feature/test", RigName: "myrig", Polecat: "TestCat", } output, err := tmpl.RenderMessage("spawn", data) if err != nil { t.Fatalf("RenderMessage() error = %v", err) } // Check for key content if !strings.Contains(output, "gt-123") { t.Error("output missing issue ID") } if !strings.Contains(output, "Test Issue") { t.Error("output missing issue title") } } func TestRenderMessage_Nudge(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } data := NudgeData{ Polecat: "TestCat", Reason: "No progress for 30 minutes", NudgeCount: 2, MaxNudges: 3, Issue: "gt-123", Status: "in_progress", } output, err := tmpl.RenderMessage("nudge", data) if err != nil { t.Fatalf("RenderMessage() error = %v", err) } // Check for key content if !strings.Contains(output, "TestCat") { t.Error("output missing polecat name") } if !strings.Contains(output, "2/3") { t.Error("output missing nudge count") } } func TestRoleNames(t *testing.T) { tmpl, err := New() if err != nil { t.Fatalf("New() error = %v", err) } names := tmpl.RoleNames() expected := []string{"mayor", "witness", "refinery", "polecat", "crew", "deacon"} if len(names) != len(expected) { t.Errorf("RoleNames() = %v, want %v", names, expected) } for i, name := range names { if name != expected[i] { t.Errorf("RoleNames()[%d] = %q, want %q", i, name, expected[i]) } } }