diff --git a/pkg/hook/fake.go b/pkg/hook/fake.go new file mode 100644 index 0000000..b158aae --- /dev/null +++ b/pkg/hook/fake.go @@ -0,0 +1,20 @@ +package hook + +import ( + "net/http" + + "github.com/pkg/errors" +) + +type fakeSender struct { + fail bool + Urls []string +} + +func (f *fakeSender) send(forwardURL string, bodyBytes []byte, header http.Header) error { + f.Urls = append(f.Urls, forwardURL) + if f.fail { + return errors.New("simulate a failure") + } + return nil +} diff --git a/pkg/hook/store_handler.go b/pkg/hook/store_handler.go index adfa4aa..438bee8 100644 --- a/pkg/hook/store_handler.go +++ b/pkg/hook/store_handler.go @@ -15,11 +15,15 @@ import ( ) type handler struct { - ForwardURL string InsecureRelay bool client *http.Client maxRetryDuration *time.Duration store store.Store + sender sender +} + +type sender interface { + send(forwardURL string, bodyBytes []byte, header http.Header) error } func (h *handler) Handle(hook *Hook) error { @@ -31,20 +35,23 @@ func (h *handler) Handle(hook *Hook) error { hook.ID = hookID + if h.sender == nil { + h.sender = h + } // attempt to send - err = h.send(hook.ForwardURL, hook.Body, hook.Headers) + err = h.sender.send(hook.ForwardURL, hook.Body, hook.Headers) if err != nil { // if failed, mark as failed with the error as the message err = h.store.Error(hookID, err.Error()) if err != nil { return err } - } - - // if success, mark as successful, - err = h.store.Success(hookID) - if err != nil { - return err + } else { + // if success, mark as successful, + err = h.store.Success(hookID) + if err != nil { + return err + } } return nil diff --git a/pkg/hook/store_handler_test.go b/pkg/hook/store_handler_test.go new file mode 100644 index 0000000..274bdfe --- /dev/null +++ b/pkg/hook/store_handler_test.go @@ -0,0 +1,50 @@ +package hook + +import ( + "testing" + + "github.com/garethjevans/captain-hook/pkg/store" + "github.com/stretchr/testify/assert" +) + +func TestHandle_Success(t *testing.T) { + s := store.FakeStore{} + sender := fakeSender{} + h := handler{ + store: &s, + maxRetryDuration: &defaultMaxRetryDuration, + sender: &sender, + } + + hook := Hook{ + ForwardURL: "http://example.com", + } + + err := h.Handle(&hook) + assert.NoError(t, err) + + assert.Equal(t, 1, len(s.MessageIDs)) + assert.Equal(t, 1, len(s.SuccessMessageIDs)) + assert.Equal(t, 0, len(s.ErroredMessageIDs)) +} + +func TestHandle_Error(t *testing.T) { + s := store.FakeStore{} + sender := fakeSender{fail: true} + h := handler{ + store: &s, + maxRetryDuration: &defaultMaxRetryDuration, + sender: &sender, + } + + hook := Hook{ + ForwardURL: "http://example.com", + } + + err := h.Handle(&hook) + assert.NoError(t, err) + + assert.Equal(t, 1, len(s.MessageIDs)) + assert.Equal(t, 0, len(s.SuccessMessageIDs)) + assert.Equal(t, 1, len(s.ErroredMessageIDs)) +} diff --git a/pkg/store/fake.go b/pkg/store/fake.go new file mode 100644 index 0000000..3351120 --- /dev/null +++ b/pkg/store/fake.go @@ -0,0 +1,25 @@ +package store + +import "github.com/google/uuid" + +type FakeStore struct { + MessageIDs []string + SuccessMessageIDs []string + ErroredMessageIDs []string +} + +func (s *FakeStore) StoreHook(forwardURL string, body []byte, header map[string][]string) (string, error) { + messageID := uuid.New().String() + s.MessageIDs = append(s.MessageIDs, messageID) + return messageID, nil +} + +func (s *FakeStore) Success(id string) error { + s.SuccessMessageIDs = append(s.SuccessMessageIDs, id) + return nil +} + +func (s *FakeStore) Error(id string, message string) error { + s.ErroredMessageIDs = append(s.ErroredMessageIDs, id) + return nil +}