From 41c7b4ca8991a2348cd70199549c7594a4539260 Mon Sep 17 00:00:00 2001 From: viveknathani Date: Wed, 3 Nov 2021 18:58:48 +0530 Subject: [PATCH 1/2] Add method to create reaction for a release Closes #2194 --- github/reactions.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/github/reactions.go b/github/reactions.go index 08387cb50f5..ecfcf2e9458 100644 --- a/github/reactions.go +++ b/github/reactions.go @@ -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 +} From 87dbde15dbccadd38a81086fefaf7cb03ec2fb5f Mon Sep 17 00:00:00 2001 From: viveknathani Date: Wed, 3 Nov 2021 19:01:35 +0530 Subject: [PATCH 2/2] Write test for CreateReleaseReaction --- github/reactions_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/github/reactions_test.go b/github/reactions_test.go index 3822a515c66..f84c3383290 100644 --- a/github/reactions_test.go +++ b/github/reactions_test.go @@ -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 + }) +}