test(patrol): add unit tests for patrol.go
Add tests for: - extractPatrolRole() - various title format cases - PatrolDigest struct - date format and field access - PatrolCycleEntry struct - field access Covers pure functions; bd-dependent functions would need mocking. Fixes: gt-bm9nx5 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
101
internal/cmd/patrol_test.go
Normal file
101
internal/cmd/patrol_test.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestExtractPatrolRole(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
title string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "deacon patrol",
|
||||||
|
title: "Digest: mol-deacon-patrol",
|
||||||
|
expected: "deacon",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "witness patrol",
|
||||||
|
title: "Digest: mol-witness-patrol",
|
||||||
|
expected: "witness",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "refinery patrol",
|
||||||
|
title: "Digest: mol-refinery-patrol",
|
||||||
|
expected: "refinery",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "wisp digest without patrol suffix",
|
||||||
|
title: "Digest: gt-wisp-abc123",
|
||||||
|
expected: "patrol",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "random title",
|
||||||
|
title: "Some other digest",
|
||||||
|
expected: "patrol",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty title",
|
||||||
|
title: "",
|
||||||
|
expected: "patrol",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "just digest prefix",
|
||||||
|
title: "Digest: ",
|
||||||
|
expected: "patrol",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mol prefix but no patrol suffix",
|
||||||
|
title: "Digest: mol-deacon-other",
|
||||||
|
expected: "patrol",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got := extractPatrolRole(tt.title)
|
||||||
|
if got != tt.expected {
|
||||||
|
t.Errorf("extractPatrolRole(%q) = %q, want %q", tt.title, got, tt.expected)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPatrolDigestDateFormat(t *testing.T) {
|
||||||
|
// Test that PatrolDigest.Date format is YYYY-MM-DD
|
||||||
|
digest := PatrolDigest{
|
||||||
|
Date: "2026-01-17",
|
||||||
|
TotalCycles: 5,
|
||||||
|
ByRole: map[string]int{"deacon": 2, "witness": 3},
|
||||||
|
}
|
||||||
|
|
||||||
|
if digest.Date != "2026-01-17" {
|
||||||
|
t.Errorf("Date format incorrect: got %q", digest.Date)
|
||||||
|
}
|
||||||
|
|
||||||
|
if digest.TotalCycles != 5 {
|
||||||
|
t.Errorf("TotalCycles: got %d, want 5", digest.TotalCycles)
|
||||||
|
}
|
||||||
|
|
||||||
|
if digest.ByRole["deacon"] != 2 {
|
||||||
|
t.Errorf("ByRole[deacon]: got %d, want 2", digest.ByRole["deacon"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPatrolCycleEntry(t *testing.T) {
|
||||||
|
entry := PatrolCycleEntry{
|
||||||
|
ID: "gt-abc123",
|
||||||
|
Role: "deacon",
|
||||||
|
Title: "Digest: mol-deacon-patrol",
|
||||||
|
Description: "Test description",
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.ID != "gt-abc123" {
|
||||||
|
t.Errorf("ID: got %q, want %q", entry.ID, "gt-abc123")
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.Role != "deacon" {
|
||||||
|
t.Errorf("Role: got %q, want %q", entry.Role, "deacon")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user