feat(github): implement Reviewer and Identity interfaces (#81) #105
+8
-2
@@ -66,9 +66,15 @@ func translateGitHubReviewState(state string) string {
|
||||
}
|
||||
|
||||
// PostReview submits a review on a pull request.
|
||||
// The ReviewRequest.Event values (APPROVE, REQUEST_CHANGES, COMMENT) are sent
|
||||
// directly — they match GitHub's canonical event strings.
|
||||
//
|
||||
// The vcs.ReviewEvent constants (ReviewEventApprove, ReviewEventRequestChanges,
|
||||
// ReviewEventComment) have string values that match GitHub's wire-format event
|
||||
// strings (APPROVE, REQUEST_CHANGES, COMMENT), so Event is cast directly to
|
||||
// string without translation.
|
||||
//
|
||||
// ReviewComment.Position maps directly to the GitHub API position field.
|
||||
// When req.Comments is empty, the payload omits the comments field entirely
|
||||
// (via the omitempty tag on postReviewRequest.Comments).
|
||||
func (c *Client) PostReview(ctx context.Context, owner, repo string, number int, req vcs.ReviewRequest) (*vcs.Review, error) {
|
||||
reqURL := fmt.Sprintf("%s/repos/%s/%s/pulls/%d/reviews",
|
||||
c.baseURL, url.PathEscape(owner), url.PathEscape(repo), number)
|
||||
|
|
||||
|
||||
@@ -362,8 +362,8 @@ func TestDismissReview_401(t *testing.T) {
|
||||
|
||||
func TestTranslateGitHubReviewState(t *testing.T) {
|
||||
tests := []struct {
|
||||
input string
|
||||
expected string
|
||||
input string
|
||||
want string
|
||||
}{
|
||||
{"APPROVED", "APPROVED"},
|
||||
{"CHANGES_REQUESTED", "REQUEST_CHANGES"},
|
||||
@@ -374,8 +374,8 @@ func TestTranslateGitHubReviewState(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
got := translateGitHubReviewState(tt.input)
|
||||
if got != tt.expected {
|
||||
t.Errorf("translateGitHubReviewState(%q) = %q, want %q", tt.input, got, tt.expected)
|
||||
if got != tt.want {
|
||||
t.Errorf("translateGitHubReviewState(%q) = %q, want %q", tt.input, got, tt.want)
|
||||
}
|
||||
}
|
||||
|
sonnet-review-bot
commented
[MINOR] containsStr and containsSubstring reimplement strings.Contains from the standard library. The repository conventions do not restrict use of the standard library; **[MINOR]** containsStr and containsSubstring reimplement strings.Contains from the standard library. The repository conventions do not restrict use of the standard library; `strings.Contains(s, substr)` should be used directly. The current implementation is also slightly incorrect: `containsStr` returns true when `s == substr` even without going through `containsSubstring`, but the logic mixing `len` checks and `||` chains is harder to read and maintain than a direct `strings.Contains` call.
|
||||
}
|
||||
|
sonnet-review-bot
commented
[NIT] There are two trailing blank lines at the end of review_test.go. gofmt typically produces a single trailing newline; this is minor but inconsistent with the style pattern. **[NIT]** There are two trailing blank lines at the end of review_test.go. gofmt typically produces a single trailing newline; this is minor but inconsistent with the style pattern.
|
||||
|
||||
Reference in New Issue
Block a user
[MINOR] PostReview doc comment says 'ReviewRequest.Event values (APPROVE, REQUEST_CHANGES, COMMENT) are sent directly — they match GitHub's canonical event strings.' This is misleading: GitHub's canonical event strings are actually APPROVE, REQUEST_CHANGES, and COMMENT, but the vcs type uses ReviewEventApprove etc. which the test confirms maps to 'APPROVE'. The comment is correct about the wire format but conflates the vcs abstraction with the GitHub API. More importantly, when a review has no comments,
payload.Commentswill be nil (not assigned), which is fine since it'somitempty, but this is an implicit assumption worth noting.