Skip to content
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ coverage.out
.idea/
vendor/
.DS_Store
.vscode
.vscode
# vim temp files
*.swp
72 changes: 72 additions & 0 deletions github/apps_hooks_deliveries.go
Original file line number Diff line number Diff line change
@@ -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
}
119 changes: 119 additions & 0 deletions github/apps_hooks_deliveries_test.go
Original file line number Diff line number Diff line change
@@ -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
})
}