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:
max
2026-01-17 03:47:18 -08:00
committed by Steve Yegge
parent e853ac3539
commit 4a856f6e0d

101
internal/cmd/patrol_test.go Normal file
View 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")
}
}