Skip to content

Commit 4f05dfb

Browse files
Add ListReleaseReactions and DeleteReleaseReaction (#3533)
1 parent 51d32d9 commit 4f05dfb

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed

github/reactions.go

+51
Original file line numberDiff line numberDiff line change
@@ -568,3 +568,54 @@ func (s *ReactionsService) CreateReleaseReaction(ctx context.Context, owner, rep
568568

569569
return m, resp, nil
570570
}
571+
572+
// ListReleaseReactions lists the reactions for a release.
573+
//
574+
// GitHub API docs: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-release
575+
//
576+
//meta:operation GET /repos/{owner}/{repo}/releases/{release_id}/reactions
577+
func (s *ReactionsService) ListReleaseReactions(ctx context.Context, owner, repo string, releaseID int64, opts *ListReactionOptions) ([]*Reaction, *Response, error) {
578+
u := fmt.Sprintf("repos/%v/%v/releases/%v/reactions", owner, repo, releaseID)
579+
u, err := addOptions(u, opts)
580+
if err != nil {
581+
return nil, nil, err
582+
}
583+
584+
req, err := s.client.NewRequest("GET", u, nil)
585+
if err != nil {
586+
return nil, nil, err
587+
}
588+
589+
// TODO: remove custom Accept headers when APIs fully launch.
590+
req.Header.Set("Accept", mediaTypeReactionsPreview)
591+
592+
var m []*Reaction
593+
resp, err := s.client.Do(ctx, req, &m)
594+
if err != nil {
595+
return nil, resp, err
596+
}
597+
598+
return m, resp, nil
599+
}
600+
601+
// DeleteReleaseReaction deletes the reaction for a release.
602+
//
603+
// GitHub API docs: https://docs.github.com/rest/reactions/reactions#delete-a-release-reaction
604+
//
605+
//meta:operation DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}
606+
func (s *ReactionsService) DeleteReleaseReaction(ctx context.Context, owner, repo string, releaseID, reactionID int64) (*Response, error) {
607+
u := fmt.Sprintf("repos/%v/%v/releases/%v/reactions/%v", owner, repo, releaseID, reactionID)
608+
609+
return s.deleteReaction(ctx, u)
610+
}
611+
612+
// DeleteReleaseReactionByID deletes the reaction for a release by repository ID.
613+
//
614+
// GitHub API docs: https://docs.github.com/rest/reactions/reactions#delete-a-release-reaction
615+
//
616+
//meta:operation DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}
617+
func (s *ReactionsService) DeleteReleaseReactionByID(ctx context.Context, repoID, releaseID, reactionID int64) (*Response, error) {
618+
u := fmt.Sprintf("repositories/%v/releases/%v/reactions/%v", repoID, releaseID, reactionID)
619+
620+
return s.deleteReaction(ctx, u)
621+
}

github/reactions_test.go

+100
Original file line numberDiff line numberDiff line change
@@ -918,3 +918,103 @@ func TestReactionService_CreateReleaseReaction(t *testing.T) {
918918
return resp, err
919919
})
920920
}
921+
922+
func TestReactionsService_ListReleaseReactions(t *testing.T) {
923+
t.Parallel()
924+
client, mux, _ := setup(t)
925+
926+
mux.HandleFunc("/repos/o/r/releases/1/reactions", func(w http.ResponseWriter, r *http.Request) {
927+
testMethod(t, r, "GET")
928+
testHeader(t, r, "Accept", mediaTypeReactionsPreview)
929+
testFormValues(t, r, values{"content": "+1"})
930+
931+
w.WriteHeader(http.StatusOK)
932+
assertWrite(t, w, []byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`))
933+
})
934+
935+
opt := &ListReactionOptions{Content: "+1"}
936+
ctx := context.Background()
937+
got, _, err := client.Reactions.ListReleaseReactions(ctx, "o", "r", 1, opt)
938+
if err != nil {
939+
t.Errorf("ListReleaseReactions returned error: %v", err)
940+
}
941+
want := []*Reaction{{ID: Ptr(int64(1)), User: &User{Login: Ptr("l"), ID: Ptr(int64(2))}, Content: Ptr("+1")}}
942+
if !cmp.Equal(got, want) {
943+
t.Errorf("ListReleaseReactions = %+v, want %+v", got, want)
944+
}
945+
}
946+
947+
func TestReactionsService_ListReleaseReactions_coverage(t *testing.T) {
948+
t.Parallel()
949+
client, _, _ := setup(t)
950+
951+
ctx := context.Background()
952+
953+
const methodName = "ListReleaseReactions"
954+
testBadOptions(t, methodName, func() (err error) {
955+
_, _, err = client.Reactions.ListReleaseReactions(ctx, "\n", "\n", -1, &ListReactionOptions{})
956+
return err
957+
})
958+
959+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
960+
got, resp, err := client.Reactions.ListReleaseReactions(ctx, "o", "r", 1, nil)
961+
if got != nil {
962+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
963+
}
964+
return resp, err
965+
})
966+
}
967+
968+
func TestReactionsService_DeleteReleaseReaction(t *testing.T) {
969+
t.Parallel()
970+
client, mux, _ := setup(t)
971+
972+
mux.HandleFunc("/repos/o/r/releases/1/reactions/2", func(w http.ResponseWriter, r *http.Request) {
973+
testMethod(t, r, "DELETE")
974+
testHeader(t, r, "Accept", mediaTypeReactionsPreview)
975+
976+
w.WriteHeader(http.StatusNoContent)
977+
})
978+
979+
ctx := context.Background()
980+
if _, err := client.Reactions.DeleteReleaseReaction(ctx, "o", "r", 1, 2); err != nil {
981+
t.Errorf("DeleteReleaseReaction returned error: %v", err)
982+
}
983+
984+
const methodName = "DeleteReleaseReaction"
985+
testBadOptions(t, methodName, func() (err error) {
986+
_, err = client.Reactions.DeleteReleaseReaction(ctx, "\n", "\n", -1, -2)
987+
return err
988+
})
989+
990+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
991+
return client.Reactions.DeleteReleaseReaction(ctx, "o", "r", 1, 2)
992+
})
993+
}
994+
995+
func TestReactionsService_DeleteReleaseReactionByRepoID(t *testing.T) {
996+
t.Parallel()
997+
client, mux, _ := setup(t)
998+
999+
mux.HandleFunc("/repositories/1/releases/2/reactions/3", func(w http.ResponseWriter, r *http.Request) {
1000+
testMethod(t, r, "DELETE")
1001+
testHeader(t, r, "Accept", mediaTypeReactionsPreview)
1002+
1003+
w.WriteHeader(http.StatusNoContent)
1004+
})
1005+
1006+
ctx := context.Background()
1007+
if _, err := client.Reactions.DeleteReleaseReactionByID(ctx, 1, 2, 3); err != nil {
1008+
t.Errorf("DeleteReleaseReactionByRepoID returned error: %v", err)
1009+
}
1010+
1011+
const methodName = "DeleteReleaseReactionByID"
1012+
testBadOptions(t, methodName, func() (err error) {
1013+
_, err = client.Reactions.DeleteIssueReactionByID(ctx, -1, -2, -3)
1014+
return err
1015+
})
1016+
1017+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
1018+
return client.Reactions.DeleteIssueReactionByID(ctx, 1, 2, 3)
1019+
})
1020+
}

0 commit comments

Comments
 (0)