Skip to content

Commit 0252279

Browse files
authored
Merge pull request #36 from devatherock/35-exit-code
feat: Quit with non-zero exit code when API call to Slack fails
2 parents bb9f0b8 + eb532a6 commit 0252279

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

.circleci/config.yml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ work_directory: &work_directory
1414
resource_class: &resource_class
1515
resource_class: small
1616

17+
release_filter: &release_filter
18+
filters:
19+
branches:
20+
only: non-existent-branch
21+
tags:
22+
only: /^v[0-9\.]+$/
23+
1724
executors:
1825
docker-executor:
1926
docker:
@@ -116,15 +123,12 @@ workflows:
116123
- publish_release:
117124
context:
118125
- docker-credentials
119-
filters:
120-
branches:
121-
only: non-existent-branch
122-
tags:
123-
only: /^v[0-9\.]+$/
126+
<<: *release_filter
124127
- notify:
125128
context:
126129
- docker-credentials
127130
- slack-webhook
131+
<<: *release_filter
128132
requires:
129133
- publish_release
130134
pr_check:

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22

33
## [Unreleased]
4+
### Changed
5+
- feat: Quit with non-zero exit code when API call to Slack fails([#35](https://github.com/devatherock/simple-slack/issues/35))
6+
7+
## [0.6.0] - 2021-02-14
48
### Added
59
- feat: Used `VELA_BUILD_STATUS` environment variable to choose message highlight color in vela
610
- feat: Added support for sprig functions within the text template([#32](https://github.com/devatherock/simple-slack/issues/32))

main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ func run(context *cli.Context) error {
107107
defer res.Body.Close()
108108
log.Println("Message posted to webhook with http status", res.StatusCode)
109109

110+
if res.StatusCode > 399 {
111+
return errors.New("HTTP request to Slack failed")
112+
}
113+
110114
return nil
111115
}
112116

main_test.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ func TestRunApp(test *testing.T) {
2929
var capturedRequest []byte
3030
testServer := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
3131
capturedRequest, _ = ioutil.ReadAll(request.Body)
32-
writer.WriteHeader(400)
32+
writer.Header().Set("Content-Type", "application/json")
33+
fmt.Fprintln(writer, `{"success":true}`)
3334
}))
3435
defer testServer.Close()
3536
setEnvironmentVariable(test, "WEBHOOK", testServer.URL)
@@ -134,6 +135,54 @@ func TestRun(test *testing.T) {
134135
assert.Equal(test, "general", jsonRequest["channel"])
135136
}
136137

138+
func TestRunSlackCallFailed(test *testing.T) {
139+
cases := []int{
140+
400,
141+
500,
142+
}
143+
144+
for _, statusCode := range cases {
145+
// Test HTTP server
146+
var capturedRequest []byte
147+
testServer := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
148+
capturedRequest, _ = ioutil.ReadAll(request.Body)
149+
writer.WriteHeader(statusCode)
150+
}))
151+
defer testServer.Close()
152+
153+
set := flag.NewFlagSet("test", 0)
154+
set.String("text", "Build failed!", "")
155+
set.String("color", "red", "")
156+
set.String("title", "Build notification", "")
157+
set.String("channel", "general", "")
158+
set.String("webhook", testServer.URL, "")
159+
160+
context := cli.NewContext(nil, set, nil)
161+
actual := run(context)
162+
163+
// Verify error
164+
assert.NotNil(test, actual)
165+
assert.Equal(test, "HTTP request to Slack failed", actual.Error())
166+
167+
// Verify request
168+
jsonRequest := make(map[string]interface{})
169+
json.Unmarshal(capturedRequest, &jsonRequest)
170+
assert.Equal(test, 2, len(jsonRequest))
171+
172+
var attachments []interface{}
173+
attachments = jsonRequest["attachments"].([]interface{})
174+
var attachment map[string]interface{}
175+
attachment = attachments[0].(map[string]interface{})
176+
177+
assert.Equal(test, 1, len(attachments))
178+
assert.Equal(test, 3, len(attachment))
179+
assert.Equal(test, "Build failed!", attachment["text"])
180+
assert.Equal(test, "red", attachment["color"])
181+
assert.Equal(test, "Build notification", attachment["title"])
182+
assert.Equal(test, "general", jsonRequest["channel"])
183+
}
184+
}
185+
137186
func TestBuildPayload(test *testing.T) {
138187
cases := []struct {
139188
parameters map[string]string

0 commit comments

Comments
 (0)