diff --git a/.gitignore b/.gitignore index aea73858e5..c903cf6b46 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ coverage.out .idea/ vendor/ .DS_Store -.vscode \ No newline at end of file +.vscode +# vim temp files +*.swp diff --git a/github/apps_hooks_deliveries.go b/github/apps_hooks_deliveries.go new file mode 100644 index 0000000000..0b631b80e8 --- /dev/null +++ b/github/apps_hooks_deliveries.go @@ -0,0 +1,72 @@ +// Copyright 2021 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +// ListHookDeliveries lists deliveries of an App webhook. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/apps#list-deliveries-for-an-app-webhook +func (s *AppsService) ListHookDeliveries(ctx context.Context, opts *ListCursorOptions) ([]*HookDelivery, *Response, error) { + u, err := addOptions("app/hook/deliveries", opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + deliveries := []*HookDelivery{} + resp, err := s.client.Do(ctx, req, &deliveries) + if err != nil { + return nil, resp, err + } + + return deliveries, resp, nil +} + +// GetHookDelivery returns the App webhook delivery with the specified ID. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/apps#get-a-delivery-for-an-app-webhook +func (s *AppsService) GetHookDelivery(ctx context.Context, deliveryID int64) (*HookDelivery, *Response, error) { + u := fmt.Sprintf("app/hook/deliveries/%v", deliveryID) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + h := new(HookDelivery) + resp, err := s.client.Do(ctx, req, h) + if err != nil { + return nil, resp, err + } + + return h, resp, nil +} + +// RedeliverHookDelivery redelivers a delivery for an App webhook. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/apps#redeliver-a-delivery-for-an-app-webhook +func (s *AppsService) RedeliverHookDelivery(ctx context.Context, deliveryID int64) (*HookDelivery, *Response, error) { + u := fmt.Sprintf("app/hook/deliveries/%v/attempts", deliveryID) + req, err := s.client.NewRequest("POST", u, nil) + if err != nil { + return nil, nil, err + } + + h := new(HookDelivery) + resp, err := s.client.Do(ctx, req, h) + if err != nil { + return nil, resp, err + } + + return h, resp, nil +} diff --git a/github/apps_hooks_deliveries_test.go b/github/apps_hooks_deliveries_test.go new file mode 100644 index 0000000000..38e25540cf --- /dev/null +++ b/github/apps_hooks_deliveries_test.go @@ -0,0 +1,119 @@ +// Copyright 2021 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" + "net/http" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestAppsService_ListHookDeliveries(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/app/hook/deliveries", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{"cursor": "v1_12077215967"}) + fmt.Fprint(w, `[{"id":1}, {"id":2}]`) + }) + + opts := &ListCursorOptions{Cursor: "v1_12077215967"} + + ctx := context.Background() + + deliveries, _, err := client.Apps.ListHookDeliveries(ctx, opts) + if err != nil { + t.Errorf("Apps.ListHookDeliveries returned error: %v", err) + } + + want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}} + if d := cmp.Diff(deliveries, want); d != "" { + t.Errorf("Apps.ListHooks want (-), got (+):\n%s", d) + } + + const methodName = "ListHookDeliveries" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Apps.ListHookDeliveries(ctx, opts) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestAppsService_GetHookDelivery(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/app/hook/deliveries/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"id":1}`) + }) + + ctx := context.Background() + hook, _, err := client.Apps.GetHookDelivery(ctx, 1) + if err != nil { + t.Errorf("Apps.GetHookDelivery returned error: %v", err) + } + + want := &HookDelivery{ID: Int64(1)} + if !cmp.Equal(hook, want) { + t.Errorf("Apps.GetHookDelivery returned %+v, want %+v", hook, want) + } + + const methodName = "GetHookDelivery" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Apps.GetHookDelivery(ctx, -1) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Apps.GetHookDelivery(ctx, 1) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestAppsService_RedeliverHookDelivery(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/app/hook/deliveries/1/attempts", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "POST") + fmt.Fprint(w, `{"id":1}`) + }) + + ctx := context.Background() + hook, _, err := client.Apps.RedeliverHookDelivery(ctx, 1) + if err != nil { + t.Errorf("Apps.RedeliverHookDelivery returned error: %v", err) + } + + want := &HookDelivery{ID: Int64(1)} + if !cmp.Equal(hook, want) { + t.Errorf("Apps.RedeliverHookDelivery returned %+v, want %+v", hook, want) + } + + const methodName = "RedeliverHookDelivery" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Apps.RedeliverHookDelivery(ctx, -1) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Apps.RedeliverHookDelivery(ctx, 1) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +}