| package git |
| |
| import ( |
| "encoding/json" |
| "testing" |
| "time" |
| ) |
| |
| func TestProcessMergeWebhook(t *testing.T) { |
| // Create a sample GitHub webhook payload for a merged PR |
| webhookPayload := GitHubWebhook{ |
| Action: "closed", |
| Number: 123, |
| PullRequest: &GitHubPullRequest{ |
| ID: 456, |
| Number: 123, |
| State: "closed", |
| Title: "Add solution for task-123", |
| Merged: true, |
| MergedAt: func() *time.Time { |
| t := time.Now() |
| return &t |
| }(), |
| MergedBy: &User{ |
| Login: "testuser", |
| ID: 789, |
| }, |
| Head: &PullRequestBranch{ |
| Ref: "solution/task-123", |
| SHA: "abc123def456", |
| }, |
| Base: &PullRequestBranch{ |
| Ref: "main", |
| SHA: "def456ghi789", |
| }, |
| }, |
| Repository: &Repository{ |
| Name: "test-repo", |
| FullName: "testuser/test-repo", |
| }, |
| Sender: &User{ |
| Login: "testuser", |
| ID: 789, |
| }, |
| } |
| |
| // Convert to JSON |
| payload, err := json.Marshal(webhookPayload) |
| if err != nil { |
| t.Fatalf("Failed to marshal webhook payload: %v", err) |
| } |
| |
| // Test signature validation (this will fail without proper secret) |
| _, err = ProcessMergeWebhook(payload, "sha256=invalid", "test-secret") |
| if err == nil { |
| t.Error("Expected signature validation to fail with invalid signature") |
| } |
| |
| // Test with valid signature (you would need to generate this properly in a real test) |
| // For now, we'll test the parsing and validation logic separately |
| webhook, err := ParseWebhook(payload) |
| if err != nil { |
| t.Fatalf("Failed to parse webhook: %v", err) |
| } |
| |
| if !IsValidMergeEvent(webhook) { |
| t.Error("Expected webhook to be a valid merge event") |
| } |
| |
| taskID, err := ExtractTaskID(webhook.PullRequest.Head.Ref) |
| if err != nil { |
| t.Fatalf("Failed to extract task ID: %v", err) |
| } |
| |
| if taskID != "task-123" { |
| t.Errorf("Expected task ID 'task-123', got '%s'", taskID) |
| } |
| |
| // Test GetWebhookInfo function |
| info := GetWebhookInfo(webhook) |
| if info["action"] != "closed" { |
| t.Errorf("Expected action 'closed', got '%v'", info["action"]) |
| } |
| if info["pr_title"] != "Add solution for task-123" { |
| t.Errorf("Expected title 'Add solution for task-123', got '%v'", info["pr_title"]) |
| } |
| if info["head_ref"] != "solution/task-123" { |
| t.Errorf("Expected head_ref 'solution/task-123', got '%v'", info["head_ref"]) |
| } |
| } |
| |
| func TestExtractTaskID(t *testing.T) { |
| tests := []struct { |
| branchName string |
| expected string |
| shouldErr bool |
| }{ |
| {"solution/task-123", "task-123", false}, |
| {"subtasks/task-456", "task-456", false}, |
| {"feature/new-feature", "", true}, |
| {"main", "", true}, |
| {"solution/", "", true}, |
| {"subtasks/", "", true}, |
| } |
| |
| for _, test := range tests { |
| taskID, err := ExtractTaskID(test.branchName) |
| if test.shouldErr { |
| if err == nil { |
| t.Errorf("Expected error for branch '%s', but got none", test.branchName) |
| } |
| } else { |
| if err != nil { |
| t.Errorf("Unexpected error for branch '%s': %v", test.branchName, err) |
| } |
| if taskID != test.expected { |
| t.Errorf("Expected task ID '%s' for branch '%s', got '%s'", test.expected, test.branchName, taskID) |
| } |
| } |
| } |
| } |
| |
| func TestIsValidMergeEvent(t *testing.T) { |
| tests := []struct { |
| name string |
| webhook *GitHubWebhook |
| expected bool |
| }{ |
| { |
| name: "valid merge event", |
| webhook: &GitHubWebhook{ |
| Action: "closed", |
| PullRequest: &GitHubPullRequest{ |
| Merged: true, |
| Head: &PullRequestBranch{Ref: "solution/task-123"}, |
| }, |
| }, |
| expected: true, |
| }, |
| { |
| name: "not closed", |
| webhook: &GitHubWebhook{ |
| Action: "opened", |
| PullRequest: &GitHubPullRequest{ |
| Merged: true, |
| Head: &PullRequestBranch{Ref: "solution/task-123"}, |
| }, |
| }, |
| expected: false, |
| }, |
| { |
| name: "not merged", |
| webhook: &GitHubWebhook{ |
| Action: "closed", |
| PullRequest: &GitHubPullRequest{ |
| Merged: false, |
| Head: &PullRequestBranch{Ref: "solution/task-123"}, |
| }, |
| }, |
| expected: false, |
| }, |
| { |
| name: "no pull request", |
| webhook: &GitHubWebhook{ |
| Action: "closed", |
| }, |
| expected: false, |
| }, |
| { |
| name: "no head branch", |
| webhook: &GitHubWebhook{ |
| Action: "closed", |
| PullRequest: &GitHubPullRequest{ |
| Merged: true, |
| }, |
| }, |
| expected: false, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| result := IsValidMergeEvent(test.webhook) |
| if result != test.expected { |
| t.Errorf("Expected %v, got %v", test.expected, result) |
| } |
| }) |
| } |
| } |