test: add unit tests for Jira integration

- Test isJiraExternalRef helper with various URL patterns
- Test stats struct initialization
- Test result struct fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-11-30 15:35:30 -08:00
parent ac07d034f9
commit 534772cf3c

183
cmd/bd/jira_test.go Normal file
View File

@@ -0,0 +1,183 @@
package main
import (
"testing"
)
func TestIsJiraExternalRef(t *testing.T) {
tests := []struct {
name string
externalRef string
jiraURL string
want bool
}{
{
name: "valid Jira Cloud URL",
externalRef: "https://company.atlassian.net/browse/PROJ-123",
jiraURL: "https://company.atlassian.net",
want: true,
},
{
name: "valid Jira Cloud URL with trailing slash in config",
externalRef: "https://company.atlassian.net/browse/PROJ-123",
jiraURL: "https://company.atlassian.net/",
want: true,
},
{
name: "valid Jira Server URL",
externalRef: "https://jira.company.com/browse/PROJ-456",
jiraURL: "https://jira.company.com",
want: true,
},
{
name: "mismatched Jira host",
externalRef: "https://other.atlassian.net/browse/PROJ-123",
jiraURL: "https://company.atlassian.net",
want: false,
},
{
name: "GitHub issue URL",
externalRef: "https://github.com/org/repo/issues/123",
jiraURL: "https://company.atlassian.net",
want: false,
},
{
name: "empty external_ref",
externalRef: "",
jiraURL: "https://company.atlassian.net",
want: false,
},
{
name: "no jiraURL configured - valid pattern",
externalRef: "https://any.atlassian.net/browse/PROJ-123",
jiraURL: "",
want: true,
},
{
name: "no jiraURL configured - invalid pattern",
externalRef: "https://github.com/org/repo/issues/123",
jiraURL: "",
want: false,
},
{
name: "browse in path but not Jira format",
externalRef: "https://example.com/browse/docs/page",
jiraURL: "",
want: true, // Contains /browse/, so matches pattern
},
{
name: "browse in path with jiraURL check",
externalRef: "https://example.com/browse/docs/page",
jiraURL: "https://company.atlassian.net",
want: false, // Host doesn't match
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isJiraExternalRef(tt.externalRef, tt.jiraURL)
if got != tt.want {
t.Errorf("isJiraExternalRef(%q, %q) = %v, want %v",
tt.externalRef, tt.jiraURL, got, tt.want)
}
})
}
}
func TestJiraSyncStats(t *testing.T) {
// Test that stats struct initializes correctly
stats := JiraSyncStats{}
if stats.Pulled != 0 {
t.Errorf("expected Pulled to be 0, got %d", stats.Pulled)
}
if stats.Pushed != 0 {
t.Errorf("expected Pushed to be 0, got %d", stats.Pushed)
}
if stats.Created != 0 {
t.Errorf("expected Created to be 0, got %d", stats.Created)
}
if stats.Updated != 0 {
t.Errorf("expected Updated to be 0, got %d", stats.Updated)
}
if stats.Skipped != 0 {
t.Errorf("expected Skipped to be 0, got %d", stats.Skipped)
}
if stats.Errors != 0 {
t.Errorf("expected Errors to be 0, got %d", stats.Errors)
}
if stats.Conflicts != 0 {
t.Errorf("expected Conflicts to be 0, got %d", stats.Conflicts)
}
}
func TestJiraSyncResult(t *testing.T) {
// Test result struct initialization
result := JiraSyncResult{
Success: true,
Stats: JiraSyncStats{
Created: 5,
Updated: 3,
},
LastSync: "2025-01-15T10:30:00Z",
}
if !result.Success {
t.Error("expected Success to be true")
}
if result.Stats.Created != 5 {
t.Errorf("expected Created to be 5, got %d", result.Stats.Created)
}
if result.Stats.Updated != 3 {
t.Errorf("expected Updated to be 3, got %d", result.Stats.Updated)
}
if result.LastSync != "2025-01-15T10:30:00Z" {
t.Errorf("unexpected LastSync value: %s", result.LastSync)
}
if result.Error != "" {
t.Errorf("expected Error to be empty, got %s", result.Error)
}
if len(result.Warnings) != 0 {
t.Errorf("expected Warnings to be empty, got %v", result.Warnings)
}
}
func TestPullStats(t *testing.T) {
stats := PullStats{
Created: 10,
Updated: 5,
Skipped: 2,
}
if stats.Created != 10 {
t.Errorf("expected Created to be 10, got %d", stats.Created)
}
if stats.Updated != 5 {
t.Errorf("expected Updated to be 5, got %d", stats.Updated)
}
if stats.Skipped != 2 {
t.Errorf("expected Skipped to be 2, got %d", stats.Skipped)
}
}
func TestPushStats(t *testing.T) {
stats := PushStats{
Created: 8,
Updated: 4,
Skipped: 1,
Errors: 2,
}
if stats.Created != 8 {
t.Errorf("expected Created to be 8, got %d", stats.Created)
}
if stats.Updated != 4 {
t.Errorf("expected Updated to be 4, got %d", stats.Updated)
}
if stats.Skipped != 1 {
t.Errorf("expected Skipped to be 1, got %d", stats.Skipped)
}
if stats.Errors != 2 {
t.Errorf("expected Errors to be 2, got %d", stats.Errors)
}
}