Skip to content

Commit 391599d

Browse files
ghostsquadjames-lawrence
authored andcommitted
Add convience method for webhooks
Resolves slack-go#355
1 parent 808be12 commit 391599d

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

dialog_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ func TestOpenDialog(t *testing.T) {
299299
}
300300
err = api.OpenDialog("", *dialog)
301301
if err == nil {
302-
t.Errorf("Did not error with empty trigger: %s", err)
302+
t.Errorf("Did not error with empty trigger, %s", err)
303303
return
304304
}
305305
}

webhooks.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package slack
2+
3+
import (
4+
"github.com/pkg/errors"
5+
"net/http"
6+
"bytes"
7+
"encoding/json"
8+
)
9+
10+
type WebhookMessage struct {
11+
Text string `json:"text,omitempty"`
12+
Attachments []Attachment `json:"attachments,omitempty"`
13+
}
14+
15+
func PostWebhook(url string, msg *WebhookMessage) error {
16+
raw, err := json.Marshal(msg)
17+
18+
if err != nil {
19+
return errors.Wrap(err, "marshal failed")
20+
}
21+
22+
response, err := http.Post(url, "application/json", bytes.NewReader(raw));
23+
24+
if err != nil {
25+
return errors.Wrap(err, "failed to post webhook")
26+
}
27+
28+
if response.StatusCode != http.StatusOK {
29+
return statusCodeError{Code: response.StatusCode, Status: response.Status}
30+
}
31+
32+
return nil
33+
}

webhooks_test.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package slack
2+
3+
import (
4+
"testing"
5+
"net/http"
6+
"encoding/json"
7+
"reflect"
8+
)
9+
10+
func TestPostWebhook_OK(t *testing.T) {
11+
once.Do(startServer)
12+
13+
var receivedPayload WebhookMessage
14+
15+
http.HandleFunc("/webhook", func(rw http.ResponseWriter, r *http.Request) {
16+
rw.Header().Set("Content-Type", "application/json")
17+
18+
decoder := json.NewDecoder(r.Body)
19+
err := decoder.Decode(&receivedPayload)
20+
if err != nil {
21+
t.Errorf("Request contained invalid JSON, %s", err)
22+
}
23+
24+
response := []byte(`{}`)
25+
rw.Write(response)
26+
})
27+
28+
url := "http://" + serverAddr + "/webhook"
29+
30+
payload := &WebhookMessage{
31+
Text: "Test Text",
32+
Attachments: []Attachment{
33+
{
34+
Text: "Foo",
35+
},
36+
},
37+
}
38+
39+
err := PostWebhook(url, payload)
40+
41+
if err != nil {
42+
t.Errorf("Expected not to receive error: %s", err)
43+
}
44+
45+
if !reflect.DeepEqual(payload, &receivedPayload) {
46+
t.Errorf("Payload did not match\nwant: %#v\n got: %#v", payload, receivedPayload)
47+
}
48+
}
49+
50+
func TestPostWebhook_NotOK(t *testing.T) {
51+
once.Do(startServer)
52+
53+
http.HandleFunc("/webhook2", func(rw http.ResponseWriter, r *http.Request) {
54+
rw.WriteHeader(http.StatusInternalServerError)
55+
rw.Write([]byte("500 - Something bad happened!"))
56+
})
57+
58+
url := "http://" + serverAddr + "/webhook2"
59+
60+
err := PostWebhook(url, &WebhookMessage{})
61+
62+
if err == nil {
63+
t.Errorf("Expected to receive error")
64+
}
65+
}

0 commit comments

Comments
 (0)