Skip to content

Commit

Permalink
fix(slack): dont panic on send http errors (#114)
Browse files Browse the repository at this point in the history
* fix(slack): dont panic on send http errors

* test(slack): add sending blackbox tests

* test(slack): add sending blackbox tests
  • Loading branch information
piksel committed Jan 12, 2021
1 parent 1290cec commit 163ff52
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 7 deletions.
21 changes: 15 additions & 6 deletions pkg/services/slack/slack.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,23 @@ func (service *Service) Initialize(configURL *url.URL, logger *log.Logger) error
}

func (service *Service) doSend(config *Config, message string) error {
apiURL := service.getURL(config)
json, _ := CreateJSONPayload(config, message)
res, err := http.Post(apiURL, "application/json", bytes.NewReader(json))
postURL := service.getURL(config)
payload, _ := CreateJSONPayload(config, message)
res, err := http.Post(postURL, "application/json", bytes.NewBuffer(payload))

if res.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send notification to service, response status code %s", res.Status)
if res == nil && err == nil {
err = fmt.Errorf("unknown error")
}
return err

if err == nil && res.StatusCode != http.StatusOK {
err = fmt.Errorf("response status code %s", res.Status)
}

if err != nil {
return fmt.Errorf("failed to send slack notification: %v", err)
}

return nil
}

func (service *Service) getURL(config *Config) string {
Expand Down
38 changes: 37 additions & 1 deletion pkg/services/slack/slack_test.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package slack_test

import (
"errors"
. "github.com/containrrr/shoutrrr/pkg/services/slack"
"github.com/containrrr/shoutrrr/pkg/util"
"github.com/jarcoal/httpmock"
"log"

"net/url"
"os"
Expand All @@ -20,14 +23,15 @@ func TestSlack(t *testing.T) {
var (
service *Service
envSlackURL *url.URL
logger *log.Logger
)

var _ = Describe("the slack service", func() {

BeforeSuite(func() {
service = &Service{}
logger = log.New(GinkgoWriter, "Test", log.LstdFlags)
envSlackURL, _ = url.Parse(os.Getenv("SHOUTRRR_SLACK_URL"))

})

When("running integration tests", func() {
Expand Down Expand Up @@ -120,6 +124,38 @@ var _ = Describe("the slack service", func() {
})
})
})

Describe("sending the payload", func() {
var err error
BeforeEach(func() {
httpmock.Activate()
})
AfterEach(func() {
httpmock.DeactivateAndReset()
})
It("should not report an error if the server accepts the payload", func() {
serviceURL, _ := url.Parse("slack://testbot@AAAAAAAAA/BBBBBBBBB/123456789123456789123456")
err = service.Initialize(serviceURL, logger)
Expect(err).NotTo(HaveOccurred())

targetURL := "https://hooks.slack.com/services/AAAAAAAAA/BBBBBBBBB/123456789123456789123456"
httpmock.RegisterResponder("POST", targetURL, httpmock.NewStringResponder(200, ""))

err = service.Send("Message", nil)
Expect(err).NotTo(HaveOccurred())
})
It("should not panic if an error occurs when sending the payload", func() {
serviceURL, _ := url.Parse("slack://testbot@AAAAAAAAA/BBBBBBBBB/123456789123456789123456")
err = service.Initialize(serviceURL, logger)
Expect(err).NotTo(HaveOccurred())

targetURL := "https://hooks.slack.com/services/AAAAAAAAA/BBBBBBBBB/123456789123456789123456"
httpmock.RegisterResponder("POST", targetURL, httpmock.NewErrorResponder(errors.New("dummy error")))

err = service.Send("Message", nil)
Expect(err).To(HaveOccurred())
})
})
})

func expectErrorMessageGivenURL(msg ErrorMessage, slackURL *url.URL) {
Expand Down

0 comments on commit 163ff52

Please sign in to comment.