Skip to content

Commit cd70db9

Browse files
authored
Merge pull request #107 from zrochler/gitlab-job-hook-build-payload
Add handling for job hooks with build payloads
2 parents b3a37b9 + a8ff1e8 commit cd70db9

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

gitlab/gitlab.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const (
3838
objectPush string = "push"
3939
objectTag string = "tag_push"
4040
objectMergeRequest string = "merge_request"
41+
objectBuild string = "build"
4142
)
4243

4344
// Option is a configuration option for the webhook
@@ -173,9 +174,15 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
173174
err := json.Unmarshal([]byte(payload), &pl)
174175
return pl, err
175176
case JobEvents:
176-
var p1 JobEventPayload
177-
err := json.Unmarshal([]byte(payload), &p1)
178-
return p1, err
177+
var pl JobEventPayload
178+
err := json.Unmarshal([]byte(payload), &pl)
179+
if err != nil {
180+
return nil, err
181+
}
182+
if pl.ObjectKind == objectBuild {
183+
return eventParsing(BuildEvents, events, payload)
184+
}
185+
return pl, nil
179186

180187
case SystemHookEvents:
181188
var pl SystemHookPayload

gitlab/gitlab_test.go

+54-2
Original file line numberDiff line numberDiff line change
@@ -231,15 +231,67 @@ func TestWebhooks(t *testing.T) {
231231
"X-Gitlab-Event": []string{"Build Hook"},
232232
},
233233
},
234+
}
235+
236+
for _, tt := range tests {
237+
tc := tt
238+
client := &http.Client{}
239+
t.Run(tt.name, func(t *testing.T) {
240+
t.Parallel()
241+
payload, err := os.Open(tc.filename)
242+
assert.NoError(err)
243+
defer func() {
244+
_ = payload.Close()
245+
}()
246+
247+
var parseError error
248+
var results interface{}
249+
server := newServer(func(w http.ResponseWriter, r *http.Request) {
250+
results, parseError = hook.Parse(r, tc.event)
251+
})
252+
defer server.Close()
253+
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
254+
assert.NoError(err)
255+
req.Header = tc.headers
256+
req.Header.Set("Content-Type", "application/json")
257+
req.Header.Set("X-Gitlab-Token", "sampleToken!")
258+
259+
resp, err := client.Do(req)
260+
assert.NoError(err)
261+
assert.Equal(http.StatusOK, resp.StatusCode)
262+
assert.NoError(parseError)
263+
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
264+
})
265+
}
266+
}
267+
268+
func TestJobHooks(t *testing.T) {
269+
assert := require.New(t)
270+
tests := []struct {
271+
name string
272+
events []Event
273+
typ interface{}
274+
filename string
275+
headers http.Header
276+
}{
234277
{
235278
name: "JobEvent",
236-
event: JobEvents,
279+
events: []Event{JobEvents},
237280
typ: JobEventPayload{},
238281
filename: "../testdata/gitlab/job-event.json",
239282
headers: http.Header{
240283
"X-Gitlab-Event": []string{"Job Hook"},
241284
},
242285
},
286+
{
287+
name: "JobEvent",
288+
events: []Event{JobEvents, BuildEvents},
289+
typ: BuildEventPayload{},
290+
filename: "../testdata/gitlab/build-event.json",
291+
headers: http.Header{
292+
"X-Gitlab-Event": []string{"Job Hook"},
293+
},
294+
},
243295
}
244296

245297
for _, tt := range tests {
@@ -256,7 +308,7 @@ func TestWebhooks(t *testing.T) {
256308
var parseError error
257309
var results interface{}
258310
server := newServer(func(w http.ResponseWriter, r *http.Request) {
259-
results, parseError = hook.Parse(r, tc.event)
311+
results, parseError = hook.Parse(r, tc.events...)
260312
})
261313
defer server.Close()
262314
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)

0 commit comments

Comments
 (0)