package gitea import ( "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestGetPullRequest(t *testing.T) { pr := PullRequest{ Title: "Add feature X", Body: "This adds feature X.", } pr.Head.Sha = "abc123" server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/v1/repos/owner/repo/pulls/1" { t.Errorf("unexpected path: %s", r.URL.Path) } if r.Header.Get("Authorization") != "token test-token" { t.Errorf("unexpected auth header: %s", r.Header.Get("Authorization")) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(pr) })) defer server.Close() client := NewClient(server.URL, "test-token") got, err := client.GetPullRequest("owner", "repo", 1) if err != nil { t.Fatalf("unexpected error: %v", err) } if got.Title != "Add feature X" { t.Errorf("expected title %q, got %q", "Add feature X", got.Title) } if got.Body != "This adds feature X." { t.Errorf("expected body %q, got %q", "This adds feature X.", got.Body) } if got.Head.Sha != "abc123" { t.Errorf("expected sha %q, got %q", "abc123", got.Head.Sha) } } func TestGetPullRequestDiff(t *testing.T) { expectedDiff := "diff --git a/file.go b/file.go\n--- a/file.go\n+++ b/file.go\n@@ -1 +1 @@\n-old\n+new\n" server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/v1/repos/owner/repo/pulls/5.diff" { t.Errorf("unexpected path: %s", r.URL.Path) } w.Write([]byte(expectedDiff)) })) defer server.Close() client := NewClient(server.URL, "test-token") got, err := client.GetPullRequestDiff("owner", "repo", 5) if err != nil { t.Fatalf("unexpected error: %v", err) } if got != expectedDiff { t.Errorf("expected diff %q, got %q", expectedDiff, got) } } func TestGetCommitStatuses(t *testing.T) { statuses := []CommitStatus{ {Status: "success", Context: "ci/test", Description: "All tests passed"}, {Status: "failure", Context: "ci/lint", Description: "Lint failed"}, } server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/v1/repos/owner/repo/commits/abc123/statuses" { t.Errorf("unexpected path: %s", r.URL.Path) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(statuses) })) defer server.Close() client := NewClient(server.URL, "test-token") got, err := client.GetCommitStatuses("owner", "repo", "abc123") if err != nil { t.Fatalf("unexpected error: %v", err) } if len(got) != 2 { t.Fatalf("expected 2 statuses, got %d", len(got)) } if got[0].Status != "success" { t.Errorf("expected first status %q, got %q", "success", got[0].Status) } if got[1].Status != "failure" { t.Errorf("expected second status %q, got %q", "failure", got[1].Status) } } func TestPostReview(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { t.Errorf("expected POST, got %s", r.Method) } if r.URL.Path != "/api/v1/repos/owner/repo/pulls/3/reviews" { t.Errorf("unexpected path: %s", r.URL.Path) } if r.Header.Get("Content-Type") != "application/json" { t.Errorf("unexpected content type: %s", r.Header.Get("Content-Type")) } var payload struct { Body string `json:"body"` Event string `json:"event"` } if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatalf("failed to decode payload: %v", err) } if payload.Body != "LGTM" { t.Errorf("expected body %q, got %q", "LGTM", payload.Body) } if payload.Event != "APPROVED" { t.Errorf("expected event %q, got %q", "APPROVED", payload.Event) } w.WriteHeader(http.StatusOK) w.Write([]byte(`{}`)) })) defer server.Close() client := NewClient(server.URL, "test-token") err := client.PostReview("owner", "repo", 3, "APPROVED", "LGTM") if err != nil { t.Fatalf("unexpected error: %v", err) } } func TestGetPullRequest_Non200(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) w.Write([]byte(`{"message":"not found"}`)) })) defer server.Close() client := NewClient(server.URL, "test-token") _, err := client.GetPullRequest("owner", "repo", 999) if err == nil { t.Fatal("expected error for 404, got nil") } } func TestGetPullRequest_BadJSON(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`not json`)) })) defer server.Close() client := NewClient(server.URL, "test-token") _, err := client.GetPullRequest("owner", "repo", 1) if err == nil { t.Fatal("expected error for bad JSON, got nil") } } func TestPostReview_Non200(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusForbidden) w.Write([]byte(`{"message":"forbidden"}`)) })) defer server.Close() client := NewClient(server.URL, "test-token") err := client.PostReview("owner", "repo", 1, "APPROVED", "test") if err == nil { t.Fatal("expected error for 403, got nil") } } func TestGetFileContent(t *testing.T) { expected := "# Conventions\n- Be nice\n" server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/v1/repos/owner/repo/raw/CONVENTIONS.md" { t.Errorf("unexpected path: %s", r.URL.Path) } w.Write([]byte(expected)) })) defer server.Close() client := NewClient(server.URL, "test-token") got, err := client.GetFileContent("owner", "repo", "CONVENTIONS.md") if err != nil { t.Fatalf("unexpected error: %v", err) } if got != expected { t.Errorf("expected %q, got %q", expected, got) } }