github.com/google/go-github/v42@v42.0.0/github/repos_hooks_deliveries_test.go (about) 1 // Copyright 2021 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "reflect" 14 "testing" 15 16 "github.com/google/go-cmp/cmp" 17 ) 18 19 func TestRepositoriesService_ListHookDeliveries(t *testing.T) { 20 client, mux, _, teardown := setup() 21 defer teardown() 22 23 mux.HandleFunc("/repos/o/r/hooks/1/deliveries", func(w http.ResponseWriter, r *http.Request) { 24 testMethod(t, r, "GET") 25 testFormValues(t, r, values{"cursor": "v1_12077215967"}) 26 fmt.Fprint(w, `[{"id":1}, {"id":2}]`) 27 }) 28 29 opt := &ListCursorOptions{Cursor: "v1_12077215967"} 30 31 ctx := context.Background() 32 hooks, _, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt) 33 if err != nil { 34 t.Errorf("Repositories.ListHookDeliveries returned error: %v", err) 35 } 36 37 want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}} 38 if d := cmp.Diff(hooks, want); d != "" { 39 t.Errorf("Repositories.ListHooks want (-), got (+):\n%s", d) 40 } 41 42 const methodName = "ListHookDeliveries" 43 testBadOptions(t, methodName, func() (err error) { 44 _, _, err = client.Repositories.ListHookDeliveries(ctx, "\n", "\n", -1, opt) 45 return err 46 }) 47 48 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 49 got, resp, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt) 50 if got != nil { 51 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 52 } 53 return resp, err 54 }) 55 } 56 57 func TestRepositoriesService_ListHookDeliveries_invalidOwner(t *testing.T) { 58 client, _, _, teardown := setup() 59 defer teardown() 60 61 ctx := context.Background() 62 _, _, err := client.Repositories.ListHookDeliveries(ctx, "%", "%", 1, nil) 63 testURLParseError(t, err) 64 } 65 66 func TestRepositoriesService_GetHookDelivery(t *testing.T) { 67 client, mux, _, teardown := setup() 68 defer teardown() 69 70 mux.HandleFunc("/repos/o/r/hooks/1/deliveries/1", func(w http.ResponseWriter, r *http.Request) { 71 testMethod(t, r, "GET") 72 fmt.Fprint(w, `{"id":1}`) 73 }) 74 75 ctx := context.Background() 76 hook, _, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1) 77 if err != nil { 78 t.Errorf("Repositories.GetHookDelivery returned error: %v", err) 79 } 80 81 want := &HookDelivery{ID: Int64(1)} 82 if !cmp.Equal(hook, want) { 83 t.Errorf("Repositories.GetHookDelivery returned %+v, want %+v", hook, want) 84 } 85 86 const methodName = "GetHookDelivery" 87 testBadOptions(t, methodName, func() (err error) { 88 _, _, err = client.Repositories.GetHookDelivery(ctx, "\n", "\n", -1, -1) 89 return err 90 }) 91 92 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 93 got, resp, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1) 94 if got != nil { 95 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 96 } 97 return resp, err 98 }) 99 } 100 101 func TestRepositoriesService_GetHookDelivery_invalidOwner(t *testing.T) { 102 client, _, _, teardown := setup() 103 defer teardown() 104 105 ctx := context.Background() 106 _, _, err := client.Repositories.GetHookDelivery(ctx, "%", "%", 1, 1) 107 testURLParseError(t, err) 108 } 109 110 var hookDeliveryPayloadTypeToStruct = map[string]interface{}{ 111 "check_run": &CheckRunEvent{}, 112 "check_suite": &CheckSuiteEvent{}, 113 "commit_comment": &CommitCommentEvent{}, 114 "content_reference": &ContentReferenceEvent{}, 115 "create": &CreateEvent{}, 116 "delete": &DeleteEvent{}, 117 "deploy_key": &DeployKeyEvent{}, 118 "deployment": &DeploymentEvent{}, 119 "deployment_status": &DeploymentStatusEvent{}, 120 "discussion": &DiscussionEvent{}, 121 "fork": &ForkEvent{}, 122 "github_app_authorization": &GitHubAppAuthorizationEvent{}, 123 "gollum": &GollumEvent{}, 124 "installation": &InstallationEvent{}, 125 "installation_repositories": &InstallationRepositoriesEvent{}, 126 "issue_comment": &IssueCommentEvent{}, 127 "issues": &IssuesEvent{}, 128 "label": &LabelEvent{}, 129 "marketplace_purchase": &MarketplacePurchaseEvent{}, 130 "member": &MemberEvent{}, 131 "membership": &MembershipEvent{}, 132 "meta": &MetaEvent{}, 133 "milestone": &MilestoneEvent{}, 134 "organization": &OrganizationEvent{}, 135 "org_block": &OrgBlockEvent{}, 136 "package": &PackageEvent{}, 137 "page_build": &PageBuildEvent{}, 138 "ping": &PingEvent{}, 139 "project": &ProjectEvent{}, 140 "project_card": &ProjectCardEvent{}, 141 "project_column": &ProjectColumnEvent{}, 142 "public": &PublicEvent{}, 143 "pull_request": &PullRequestEvent{}, 144 "pull_request_review": &PullRequestReviewEvent{}, 145 "pull_request_review_comment": &PullRequestReviewCommentEvent{}, 146 "pull_request_target": &PullRequestTargetEvent{}, 147 "push": &PushEvent{}, 148 "release": &ReleaseEvent{}, 149 "repository": &RepositoryEvent{}, 150 "repository_dispatch": &RepositoryDispatchEvent{}, 151 "repository_vulnerability_alert": &RepositoryVulnerabilityAlertEvent{}, 152 "star": &StarEvent{}, 153 "status": &StatusEvent{}, 154 "team": &TeamEvent{}, 155 "team_add": &TeamAddEvent{}, 156 "user": &UserEvent{}, 157 "watch": &WatchEvent{}, 158 "workflow_dispatch": &WorkflowDispatchEvent{}, 159 "workflow_job": &WorkflowJobEvent{}, 160 "workflow_run": &WorkflowRunEvent{}, 161 } 162 163 func TestHookDelivery_ParsePayload(t *testing.T) { 164 for evt, obj := range hookDeliveryPayloadTypeToStruct { 165 t.Run(evt, func(t *testing.T) { 166 bs, err := json.Marshal(obj) 167 if err != nil { 168 t.Fatal(err) 169 } 170 171 p := json.RawMessage(bs) 172 173 d := &HookDelivery{ 174 Event: String(evt), 175 Request: &HookRequest{ 176 RawPayload: &p, 177 }, 178 } 179 180 got, err := d.ParseRequestPayload() 181 if err != nil { 182 t.Error(err) 183 } 184 185 if !reflect.DeepEqual(obj, got) { 186 t.Errorf("want %T %v, got %T %v", obj, obj, got, got) 187 } 188 }) 189 } 190 } 191 192 func TestHookDelivery_ParsePayload_invalidEvent(t *testing.T) { 193 p := json.RawMessage(nil) 194 195 d := &HookDelivery{ 196 Event: String("some_invalid_event"), 197 Request: &HookRequest{ 198 RawPayload: &p, 199 }, 200 } 201 202 _, err := d.ParseRequestPayload() 203 if err == nil || err.Error() != `unsupported event type "some_invalid_event"` { 204 t.Errorf("unexpected error: %v", err) 205 } 206 } 207 208 func TestHookDelivery_ParsePayload_invalidPayload(t *testing.T) { 209 p := json.RawMessage([]byte(`{"check_run":{"id":"invalid"}}`)) 210 211 d := &HookDelivery{ 212 Event: String("check_run"), 213 Request: &HookRequest{ 214 RawPayload: &p, 215 }, 216 } 217 218 _, err := d.ParseRequestPayload() 219 if err == nil || err.Error() != "json: cannot unmarshal string into Go struct field CheckRun.check_run.id of type int64" { 220 t.Errorf("unexpected error: %v", err) 221 } 222 } 223 224 func TestHookRequest_Marshal(t *testing.T) { 225 testJSONMarshal(t, &HookRequest{}, "{}") 226 227 header := make(map[string]string) 228 header["key"] = "value" 229 230 jsonMsg, _ := json.Marshal(&header) 231 232 r := &HookRequest{ 233 Headers: header, 234 RawPayload: (*json.RawMessage)(&jsonMsg), 235 } 236 237 want := `{ 238 "headers": { 239 "key": "value" 240 }, 241 "payload": { 242 "key": "value" 243 } 244 }` 245 246 testJSONMarshal(t, r, want) 247 } 248 249 func TestHookResponse_Marshal(t *testing.T) { 250 testJSONMarshal(t, &HookResponse{}, "{}") 251 252 header := make(map[string]string) 253 header["key"] = "value" 254 255 jsonMsg, _ := json.Marshal(&header) 256 257 r := &HookResponse{ 258 Headers: header, 259 RawPayload: (*json.RawMessage)(&jsonMsg), 260 } 261 262 want := `{ 263 "headers": { 264 "key": "value" 265 }, 266 "payload": { 267 "key": "value" 268 } 269 }` 270 271 testJSONMarshal(t, r, want) 272 } 273 274 func TestHookDelivery_Marshal(t *testing.T) { 275 testJSONMarshal(t, &HookDelivery{}, "{}") 276 277 header := make(map[string]string) 278 header["key"] = "value" 279 280 jsonMsg, _ := json.Marshal(&header) 281 282 r := &HookDelivery{ 283 ID: Int64(1), 284 GUID: String("guid"), 285 DeliveredAt: &Timestamp{referenceTime}, 286 Redelivery: Bool(true), 287 Duration: Float64(1), 288 Status: String("guid"), 289 StatusCode: Int(1), 290 Event: String("guid"), 291 Action: String("guid"), 292 InstallationID: Int64(1), 293 RepositoryID: Int64(1), 294 Request: &HookRequest{ 295 Headers: header, 296 RawPayload: (*json.RawMessage)(&jsonMsg), 297 }, 298 Response: &HookResponse{ 299 Headers: header, 300 RawPayload: (*json.RawMessage)(&jsonMsg), 301 }, 302 } 303 304 want := `{ 305 "id": 1, 306 "guid": "guid", 307 "delivered_at": ` + referenceTimeStr + `, 308 "redelivery": true, 309 "duration": 1, 310 "status": "guid", 311 "status_code": 1, 312 "event": "guid", 313 "action": "guid", 314 "installation_id": 1, 315 "repository_id": 1, 316 "request": { 317 "headers": { 318 "key": "value" 319 }, 320 "payload": { 321 "key": "value" 322 } 323 }, 324 "response": { 325 "headers": { 326 "key": "value" 327 }, 328 "payload": { 329 "key": "value" 330 } 331 } 332 }` 333 334 testJSONMarshal(t, r, want) 335 }