[dev-loop] Add tests for GetTimelineReviewCommentIDForReview and GitHub GetAllFilesInPath
CI / test (push) Successful in 17s
CI / review (anthropic--claude-4.6-sonnet, sonnet, SONNET_REVIEW_TOKEN) (push) Has been skipped
CI / review (gpt-5, gpt, GPT_REVIEW_TOKEN) (push) Has been skipped
CI / review (gpt-5, security, ., rodin/security-patterns, SECURITY_REVIEW.md, SECURITY_REVIEW_TOKEN) (push) Has been skipped
CI / test (push) Successful in 17s
CI / review (anthropic--claude-4.6-sonnet, sonnet, SONNET_REVIEW_TOKEN) (push) Has been skipped
CI / review (gpt-5, gpt, GPT_REVIEW_TOKEN) (push) Has been skipped
CI / review (gpt-5, security, ., rodin/security-patterns, SECURITY_REVIEW.md, SECURITY_REVIEW_TOKEN) (push) Has been skipped
gitea: Add 4 tests for GetTimelineReviewCommentIDForReview (was 0% coverage): - Success: find review in timeline by user login + body prefix match - ReviewFetchError: 404 on review API - EmptyBody: review with empty body returns error - NotFoundInTimeline: body matches but user login doesn't github: Add 3 tests for GetAllFilesInPath (was 0% coverage): - DirectoryWithFiles: lists directory, fetches base64-encoded file content - 404FallsBackToFile: 404 on dir path returns error when file also 404s - DirectoryWithSubdir: recursive directory traversal Coverage changes: - gitea: 80.0% → 85.2% - github: 79.9% → 86.3%
This commit is contained in:
@@ -1420,3 +1420,80 @@ func TestNewSafeHTTPClient_PreservesDefaultTransportSettings(t *testing.T) {
|
||||
t.Error("DialContext is nil; expected safeDialContext")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetTimelineReviewCommentIDForReview(t *testing.T) {
|
||||
const reviewID = int64(42)
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
switch r.URL.Path {
|
||||
case "/api/v1/repos/owner/repo/pulls/5/reviews/42":
|
||||
w.Write([]byte(`{"body": "The review body <!-- review-bot:sonnet -->", "user": {"login": "sonnet-review"}}`))
|
||||
case "/api/v1/repos/owner/repo/issues/5/timeline":
|
||||
w.Write([]byte(`[
|
||||
{"id": 100, "type": "comment", "body": "unrelated", "user": {"login": "sonnet-review"}},
|
||||
{"id": 200, "type": "review", "body": "The review body <!-- review-bot:sonnet -->", "user": {"login": "sonnet-review"}}
|
||||
]`))
|
||||
default:
|
||||
t.Errorf("unexpected path: %s", r.URL.Path)
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
}
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := NewTestClient(server.URL, "test-token")
|
||||
id, err := client.GetTimelineReviewCommentIDForReview(context.Background(), "owner", "repo", 5, reviewID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetTimelineReviewCommentIDForReview() error = %v", err)
|
||||
}
|
||||
if id != 200 {
|
||||
t.Errorf("got id=%d, want 200", id)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetTimelineReviewCommentIDForReview_ReviewFetchError(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 := NewTestClient(server.URL, "test-token")
|
||||
_, err := client.GetTimelineReviewCommentIDForReview(context.Background(), "owner", "repo", 5, 99)
|
||||
if err == nil {
|
||||
t.Fatal("expected error for missing review, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetTimelineReviewCommentIDForReview_EmptyBody(t *testing.T) {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Write([]byte(`{"body": "", "user": {"login": "bot"}}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := NewTestClient(server.URL, "test-token")
|
||||
_, err := client.GetTimelineReviewCommentIDForReview(context.Background(), "owner", "repo", 5, 42)
|
||||
if err == nil {
|
||||
t.Fatal("expected error for empty body, got nil")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "empty body") {
|
||||
t.Errorf("error = %q, want to contain 'empty body'", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetTimelineReviewCommentIDForReview_NotFoundInTimeline(t *testing.T) {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
switch r.URL.Path {
|
||||
case "/api/v1/repos/owner/repo/pulls/5/reviews/42":
|
||||
w.Write([]byte(`{"body": "review content <!-- review-bot:sonnet -->", "user": {"login": "bot"}}`))
|
||||
default:
|
||||
// Timeline returns events that don't match (different user)
|
||||
w.Write([]byte(`[{"id": 1, "type": "review", "body": "review content <!-- review-bot:sonnet -->", "user": {"login": "other-user"}}]`))
|
||||
}
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := NewTestClient(server.URL, "test-token")
|
||||
_, err := client.GetTimelineReviewCommentIDForReview(context.Background(), "owner", "repo", 5, 42)
|
||||
if err == nil {
|
||||
t.Fatal("expected error when review not found in timeline, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user