Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions github/reactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -492,3 +492,29 @@ func (s *ReactionsService) deleteReaction(ctx context.Context, url string) (*Res

return s.client.Do(ctx, req, nil)
}

// Create a reaction to a release.
// Note that a response with a Status: 200 OK means that you already
// added the reaction type to this release.
// The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes".
//
// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-release
func (s *ReactionsService) CreateReleaseReaction(ctx context.Context, owner, repo string, releaseID int64, content string) (*Reaction, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/releases/%v/reactions", owner, repo, releaseID)

body := &Reaction{Content: String(content)}
req, err := s.client.NewRequest("POST", u, body)
if err != nil {
return nil, nil, err
}

req.Header.Set("Accept", mediaTypeReactionsPreview)

m := &Reaction{}
resp, err := s.client.Do(ctx, req, m)
if err != nil {
return nil, resp, err
}

return m, resp, nil
}
38 changes: 38 additions & 0 deletions github/reactions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -868,3 +868,41 @@ func TestReactionsService_DeleteTeamDiscussionCommentReactionByTeamIDAndOrgID(t
return client.Reactions.DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx, 1, 2, 3, 4, 5)
})
}

func TestReactionService_CreateReleaseReaction(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()

mux.HandleFunc("/repos/o/r/releases/1/reactions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "POST")
testHeader(t, r, "Accept", mediaTypeReactionsPreview)

w.WriteHeader(http.StatusCreated)
w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"rocket"}`))
})

const methodName = "CreateReleaseReaction"
ctx := context.Background()
got, _, err := client.Reactions.CreateReleaseReaction(ctx, "o", "r", 1, "rocket")
if err != nil {
t.Errorf("%v returned error: %v", methodName, err)
}

want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("rocket")}
if !cmp.Equal(got, want) {
t.Errorf("%v = %+v, want %+v", methodName, got, want)
}

testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Reactions.CreateReleaseReaction(ctx, "\n", "\n", -1, "\n")
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Reactions.CreateReleaseReaction(ctx, "o", "r", 1, "rocket")
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}