github.com/google/go-github/v48@v48.2.0/github/actions_workflow_runs_test.go (about) 1 // Copyright 2020 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 "net/url" 14 "testing" 15 "time" 16 17 "github.com/google/go-cmp/cmp" 18 ) 19 20 func TestActionsService_ListWorkflowRunsByID(t *testing.T) { 21 client, mux, _, teardown := setup() 22 defer teardown() 23 24 mux.HandleFunc("/repos/o/r/actions/workflows/29679449/runs", func(w http.ResponseWriter, r *http.Request) { 25 testMethod(t, r, "GET") 26 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 27 fmt.Fprint(w, `{"total_count":4,"workflow_runs":[{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) 28 }) 29 30 opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} 31 ctx := context.Background() 32 runs, _, err := client.Actions.ListWorkflowRunsByID(ctx, "o", "r", 29679449, opts) 33 if err != nil { 34 t.Errorf("Actions.ListWorkFlowRunsByID returned error: %v", err) 35 } 36 37 want := &WorkflowRuns{ 38 TotalCount: Int(4), 39 WorkflowRuns: []*WorkflowRun{ 40 {ID: Int64(399444496), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 41 {ID: Int64(399444497), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 42 }, 43 } 44 if !cmp.Equal(runs, want) { 45 t.Errorf("Actions.ListWorkflowRunsByID returned %+v, want %+v", runs, want) 46 } 47 48 const methodName = "ListWorkflowRunsByID" 49 testBadOptions(t, methodName, func() (err error) { 50 _, _, err = client.Actions.ListWorkflowRunsByID(ctx, "\n", "\n", 29679449, opts) 51 return err 52 }) 53 54 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 55 got, resp, err := client.Actions.ListWorkflowRunsByID(ctx, "o", "r", 29679449, opts) 56 if got != nil { 57 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 58 } 59 return resp, err 60 }) 61 } 62 63 func TestActionsService_ListWorkflowRunsFileName(t *testing.T) { 64 client, mux, _, teardown := setup() 65 defer teardown() 66 67 mux.HandleFunc("/repos/o/r/actions/workflows/29679449/runs", func(w http.ResponseWriter, r *http.Request) { 68 testMethod(t, r, "GET") 69 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 70 fmt.Fprint(w, `{"total_count":4,"workflow_runs":[{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) 71 }) 72 73 opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} 74 ctx := context.Background() 75 runs, _, err := client.Actions.ListWorkflowRunsByFileName(ctx, "o", "r", "29679449", opts) 76 if err != nil { 77 t.Errorf("Actions.ListWorkFlowRunsByFileName returned error: %v", err) 78 } 79 80 want := &WorkflowRuns{ 81 TotalCount: Int(4), 82 WorkflowRuns: []*WorkflowRun{ 83 {ID: Int64(399444496), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 84 {ID: Int64(399444497), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 85 }, 86 } 87 if !cmp.Equal(runs, want) { 88 t.Errorf("Actions.ListWorkflowRunsByFileName returned %+v, want %+v", runs, want) 89 } 90 91 const methodName = "ListWorkflowRunsByFileName" 92 testBadOptions(t, methodName, func() (err error) { 93 _, _, err = client.Actions.ListWorkflowRunsByFileName(ctx, "\n", "\n", "29679449", opts) 94 return err 95 }) 96 97 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 98 got, resp, err := client.Actions.ListWorkflowRunsByFileName(ctx, "o", "r", "29679449", opts) 99 if got != nil { 100 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 101 } 102 return resp, err 103 }) 104 } 105 106 func TestActionsService_GetWorkflowRunByID(t *testing.T) { 107 client, mux, _, teardown := setup() 108 defer teardown() 109 110 mux.HandleFunc("/repos/o/r/actions/runs/29679449", func(w http.ResponseWriter, r *http.Request) { 111 testMethod(t, r, "GET") 112 fmt.Fprint(w, `{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}}`) 113 }) 114 115 ctx := context.Background() 116 runs, _, err := client.Actions.GetWorkflowRunByID(ctx, "o", "r", 29679449) 117 if err != nil { 118 t.Errorf("Actions.GetWorkflowRunByID returned error: %v", err) 119 } 120 121 want := &WorkflowRun{ 122 ID: Int64(399444496), 123 RunNumber: Int(296), 124 CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, 125 UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, 126 } 127 128 if !cmp.Equal(runs, want) { 129 t.Errorf("Actions.GetWorkflowRunByID returned %+v, want %+v", runs, want) 130 } 131 132 const methodName = "GetWorkflowRunByID" 133 testBadOptions(t, methodName, func() (err error) { 134 _, _, err = client.Actions.GetWorkflowRunByID(ctx, "\n", "\n", 29679449) 135 return err 136 }) 137 138 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 139 got, resp, err := client.Actions.GetWorkflowRunByID(ctx, "o", "r", 29679449) 140 if got != nil { 141 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 142 } 143 return resp, err 144 }) 145 } 146 147 func TestActionsService_GetWorkflowRunAttempt(t *testing.T) { 148 client, mux, _, teardown := setup() 149 defer teardown() 150 151 mux.HandleFunc("/repos/o/r/actions/runs/29679449/attempts/3", func(w http.ResponseWriter, r *http.Request) { 152 testMethod(t, r, "GET") 153 testFormValues(t, r, values{"exclude_pull_requests": "true"}) 154 fmt.Fprint(w, `{"id":399444496,"run_number":296,"run_attempt":3,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}}`) 155 }) 156 157 opts := &WorkflowRunAttemptOptions{ExcludePullRequests: Bool(true)} 158 ctx := context.Background() 159 runs, _, err := client.Actions.GetWorkflowRunAttempt(ctx, "o", "r", 29679449, 3, opts) 160 if err != nil { 161 t.Errorf("Actions.GetWorkflowRunAttempt returned error: %v", err) 162 } 163 164 want := &WorkflowRun{ 165 ID: Int64(399444496), 166 RunNumber: Int(296), 167 RunAttempt: Int(3), 168 CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, 169 UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, 170 } 171 172 if !cmp.Equal(runs, want) { 173 t.Errorf("Actions.GetWorkflowRunAttempt returned %+v, want %+v", runs, want) 174 } 175 176 const methodName = "GetWorkflowRunAttempt" 177 testBadOptions(t, methodName, func() (err error) { 178 _, _, err = client.Actions.GetWorkflowRunAttempt(ctx, "\n", "\n", 29679449, 3, opts) 179 return err 180 }) 181 182 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 183 got, resp, err := client.Actions.GetWorkflowRunAttempt(ctx, "o", "r", 29679449, 3, opts) 184 if got != nil { 185 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 186 } 187 return resp, err 188 }) 189 } 190 191 func TestActionsService_RerunWorkflowRunByID(t *testing.T) { 192 client, mux, _, teardown := setup() 193 defer teardown() 194 195 mux.HandleFunc("/repos/o/r/actions/runs/3434/rerun", func(w http.ResponseWriter, r *http.Request) { 196 testMethod(t, r, "POST") 197 w.WriteHeader(http.StatusCreated) 198 }) 199 200 ctx := context.Background() 201 resp, err := client.Actions.RerunWorkflowByID(ctx, "o", "r", 3434) 202 if err != nil { 203 t.Errorf("Actions.RerunWorkflowByID returned error: %v", err) 204 } 205 if resp.StatusCode != http.StatusCreated { 206 t.Errorf("Actions.RerunWorkflowRunByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) 207 } 208 209 const methodName = "RerunWorkflowByID" 210 testBadOptions(t, methodName, func() (err error) { 211 _, err = client.Actions.RerunWorkflowByID(ctx, "\n", "\n", 3434) 212 return err 213 }) 214 215 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 216 return client.Actions.RerunWorkflowByID(ctx, "o", "r", 3434) 217 }) 218 } 219 220 func TestActionsService_RerunFailedJobsByID(t *testing.T) { 221 client, mux, _, teardown := setup() 222 defer teardown() 223 224 mux.HandleFunc("/repos/o/r/actions/runs/3434/rerun-failed-jobs", func(w http.ResponseWriter, r *http.Request) { 225 testMethod(t, r, "POST") 226 w.WriteHeader(http.StatusCreated) 227 }) 228 229 ctx := context.Background() 230 resp, err := client.Actions.RerunFailedJobsByID(ctx, "o", "r", 3434) 231 if err != nil { 232 t.Errorf("Actions.RerunFailedJobsByID returned error: %v", err) 233 } 234 if resp.StatusCode != http.StatusCreated { 235 t.Errorf("Actions.RerunFailedJobsByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) 236 } 237 238 const methodName = "RerunFailedJobsByID" 239 testBadOptions(t, methodName, func() (err error) { 240 _, err = client.Actions.RerunFailedJobsByID(ctx, "\n", "\n", 3434) 241 return err 242 }) 243 244 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 245 return client.Actions.RerunFailedJobsByID(ctx, "o", "r", 3434) 246 }) 247 } 248 249 func TestActionsService_RerunJobByID(t *testing.T) { 250 client, mux, _, teardown := setup() 251 defer teardown() 252 253 mux.HandleFunc("/repos/o/r/actions/jobs/3434/rerun", func(w http.ResponseWriter, r *http.Request) { 254 testMethod(t, r, "POST") 255 w.WriteHeader(http.StatusCreated) 256 }) 257 258 ctx := context.Background() 259 resp, err := client.Actions.RerunJobByID(ctx, "o", "r", 3434) 260 if err != nil { 261 t.Errorf("Actions.RerunJobByID returned error: %v", err) 262 } 263 if resp.StatusCode != http.StatusCreated { 264 t.Errorf("Actions.RerunJobByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) 265 } 266 267 const methodName = "RerunJobByID" 268 testBadOptions(t, methodName, func() (err error) { 269 _, err = client.Actions.RerunJobByID(ctx, "\n", "\n", 3434) 270 return err 271 }) 272 273 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 274 return client.Actions.RerunJobByID(ctx, "o", "r", 3434) 275 }) 276 } 277 278 func TestActionsService_CancelWorkflowRunByID(t *testing.T) { 279 client, mux, _, teardown := setup() 280 defer teardown() 281 282 mux.HandleFunc("/repos/o/r/actions/runs/3434/cancel", func(w http.ResponseWriter, r *http.Request) { 283 testMethod(t, r, "POST") 284 w.WriteHeader(http.StatusAccepted) 285 }) 286 287 ctx := context.Background() 288 resp, err := client.Actions.CancelWorkflowRunByID(ctx, "o", "r", 3434) 289 if _, ok := err.(*AcceptedError); !ok { 290 t.Errorf("Actions.CancelWorkflowRunByID returned error: %v (want AcceptedError)", err) 291 } 292 if resp.StatusCode != http.StatusAccepted { 293 t.Errorf("Actions.CancelWorkflowRunByID returned status: %d, want %d", resp.StatusCode, http.StatusAccepted) 294 } 295 296 const methodName = "CancelWorkflowRunByID" 297 testBadOptions(t, methodName, func() (err error) { 298 _, err = client.Actions.CancelWorkflowRunByID(ctx, "\n", "\n", 3434) 299 return err 300 }) 301 302 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 303 return client.Actions.CancelWorkflowRunByID(ctx, "o", "r", 3434) 304 }) 305 } 306 307 func TestActionsService_GetWorkflowRunLogs(t *testing.T) { 308 client, mux, _, teardown := setup() 309 defer teardown() 310 311 mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { 312 testMethod(t, r, "GET") 313 http.Redirect(w, r, "http://github.com/a", http.StatusFound) 314 }) 315 316 ctx := context.Background() 317 url, resp, err := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, true) 318 if err != nil { 319 t.Errorf("Actions.GetWorkflowRunLogs returned error: %v", err) 320 } 321 if resp.StatusCode != http.StatusFound { 322 t.Errorf("Actions.GetWorkflowRunLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) 323 } 324 want := "http://github.com/a" 325 if url.String() != want { 326 t.Errorf("Actions.GetWorkflowRunLogs returned %+v, want %+v", url.String(), want) 327 } 328 329 const methodName = "GetWorkflowRunLogs" 330 testBadOptions(t, methodName, func() (err error) { 331 _, _, err = client.Actions.GetWorkflowRunLogs(ctx, "\n", "\n", 399444496, true) 332 return err 333 }) 334 } 335 336 func TestActionsService_GetWorkflowRunLogs_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { 337 client, mux, _, teardown := setup() 338 defer teardown() 339 340 mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { 341 testMethod(t, r, "GET") 342 http.Redirect(w, r, "http://github.com/a", http.StatusMovedPermanently) 343 }) 344 345 ctx := context.Background() 346 _, resp, _ := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, false) 347 if resp.StatusCode != http.StatusMovedPermanently { 348 t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently) 349 } 350 } 351 352 func TestActionsService_GetWorkflowRunLogs_StatusMovedPermanently_followRedirects(t *testing.T) { 353 client, mux, serverURL, teardown := setup() 354 defer teardown() 355 356 // Mock a redirect link, which leads to an archive link 357 mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { 358 testMethod(t, r, "GET") 359 redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect") 360 http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) 361 }) 362 363 mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { 364 testMethod(t, r, "GET") 365 http.Redirect(w, r, "http://github.com/a", http.StatusFound) 366 }) 367 368 ctx := context.Background() 369 url, resp, err := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, true) 370 if err != nil { 371 t.Errorf("Actions.GetWorkflowJobLogs returned error: %v", err) 372 } 373 374 if resp.StatusCode != http.StatusFound { 375 t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) 376 } 377 378 want := "http://github.com/a" 379 if url.String() != want { 380 t.Errorf("Actions.GetWorkflowJobLogs returned %+v, want %+v", url.String(), want) 381 } 382 383 const methodName = "GetWorkflowRunLogs" 384 testBadOptions(t, methodName, func() (err error) { 385 _, _, err = client.Actions.GetWorkflowRunLogs(ctx, "\n", "\n", 399444496, true) 386 return err 387 }) 388 } 389 390 func TestActionService_ListRepositoryWorkflowRuns(t *testing.T) { 391 client, mux, _, teardown := setup() 392 defer teardown() 393 394 mux.HandleFunc("/repos/o/r/actions/runs", func(w http.ResponseWriter, r *http.Request) { 395 testMethod(t, r, "GET") 396 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 397 fmt.Fprint(w, `{"total_count":2, 398 "workflow_runs":[ 399 {"id":298499444,"run_number":301,"created_at":"2020-04-11T11:14:54Z","updated_at":"2020-04-11T11:14:54Z"}, 400 {"id":298499445,"run_number":302,"created_at":"2020-04-11T11:14:54Z","updated_at":"2020-04-11T11:14:54Z"}]}`) 401 }) 402 403 opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} 404 ctx := context.Background() 405 runs, _, err := client.Actions.ListRepositoryWorkflowRuns(ctx, "o", "r", opts) 406 407 if err != nil { 408 t.Errorf("Actions.ListRepositoryWorkflowRuns returned error: %v", err) 409 } 410 411 expected := &WorkflowRuns{ 412 TotalCount: Int(2), 413 WorkflowRuns: []*WorkflowRun{ 414 {ID: Int64(298499444), RunNumber: Int(301), CreatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}}, 415 {ID: Int64(298499445), RunNumber: Int(302), CreatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}}, 416 }, 417 } 418 419 if !cmp.Equal(runs, expected) { 420 t.Errorf("Actions.ListRepositoryWorkflowRuns returned %+v, want %+v", runs, expected) 421 } 422 423 const methodName = "ListRepositoryWorkflowRuns" 424 testBadOptions(t, methodName, func() (err error) { 425 _, _, err = client.Actions.ListRepositoryWorkflowRuns(ctx, "\n", "\n", opts) 426 427 return err 428 }) 429 430 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 431 got, resp, err := client.Actions.ListRepositoryWorkflowRuns(ctx, "o", "r", opts) 432 433 if got != nil { 434 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 435 } 436 return resp, err 437 }) 438 } 439 440 func TestActionService_DeleteWorkflowRun(t *testing.T) { 441 client, mux, _, teardown := setup() 442 defer teardown() 443 444 mux.HandleFunc("/repos/o/r/actions/runs/399444496", func(w http.ResponseWriter, r *http.Request) { 445 testMethod(t, r, "DELETE") 446 447 w.WriteHeader(http.StatusNoContent) 448 }) 449 450 ctx := context.Background() 451 if _, err := client.Actions.DeleteWorkflowRun(ctx, "o", "r", 399444496); err != nil { 452 t.Errorf("DeleteWorkflowRun returned error: %v", err) 453 } 454 455 const methodName = "DeleteWorkflowRun" 456 testBadOptions(t, methodName, func() (err error) { 457 _, err = client.Actions.DeleteWorkflowRun(ctx, "\n", "\n", 399444496) 458 return err 459 }) 460 461 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 462 return client.Actions.DeleteWorkflowRun(ctx, "o", "r", 399444496) 463 }) 464 } 465 466 func TestActionService_DeleteWorkflowRunLogs(t *testing.T) { 467 client, mux, _, teardown := setup() 468 defer teardown() 469 470 mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { 471 testMethod(t, r, "DELETE") 472 473 w.WriteHeader(http.StatusNoContent) 474 }) 475 476 ctx := context.Background() 477 if _, err := client.Actions.DeleteWorkflowRunLogs(ctx, "o", "r", 399444496); err != nil { 478 t.Errorf("DeleteWorkflowRunLogs returned error: %v", err) 479 } 480 481 const methodName = "DeleteWorkflowRunLogs" 482 testBadOptions(t, methodName, func() (err error) { 483 _, err = client.Actions.DeleteWorkflowRunLogs(ctx, "\n", "\n", 399444496) 484 return err 485 }) 486 487 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 488 return client.Actions.DeleteWorkflowRunLogs(ctx, "o", "r", 399444496) 489 }) 490 } 491 492 func TestActionsService_GetWorkflowRunUsageByID(t *testing.T) { 493 client, mux, _, teardown := setup() 494 defer teardown() 495 496 mux.HandleFunc("/repos/o/r/actions/runs/29679449/timing", func(w http.ResponseWriter, r *http.Request) { 497 testMethod(t, r, "GET") 498 fmt.Fprint(w, `{"billable":{"UBUNTU":{"total_ms":180000,"jobs":1,"job_runs":[{"job_id":1,"duration_ms":60000}]},"MACOS":{"total_ms":240000,"jobs":2,"job_runs":[{"job_id":2,"duration_ms":30000},{"job_id":3,"duration_ms":10000}]},"WINDOWS":{"total_ms":300000,"jobs":2}},"run_duration_ms":500000}`) 499 }) 500 501 ctx := context.Background() 502 workflowRunUsage, _, err := client.Actions.GetWorkflowRunUsageByID(ctx, "o", "r", 29679449) 503 if err != nil { 504 t.Errorf("Actions.GetWorkflowRunUsageByID returned error: %v", err) 505 } 506 507 want := &WorkflowRunUsage{ 508 Billable: &WorkflowRunEnvironment{ 509 Ubuntu: &WorkflowRunBill{ 510 TotalMS: Int64(180000), 511 Jobs: Int(1), 512 JobRuns: []*WorkflowRunJobRun{ 513 { 514 JobID: Int(1), 515 DurationMS: Int64(60000), 516 }, 517 }, 518 }, 519 MacOS: &WorkflowRunBill{ 520 TotalMS: Int64(240000), 521 Jobs: Int(2), 522 JobRuns: []*WorkflowRunJobRun{ 523 { 524 JobID: Int(2), 525 DurationMS: Int64(30000), 526 }, 527 { 528 JobID: Int(3), 529 DurationMS: Int64(10000), 530 }, 531 }, 532 }, 533 Windows: &WorkflowRunBill{ 534 TotalMS: Int64(300000), 535 Jobs: Int(2), 536 }, 537 }, 538 RunDurationMS: Int64(500000), 539 } 540 541 if !cmp.Equal(workflowRunUsage, want) { 542 t.Errorf("Actions.GetWorkflowRunUsageByID returned %+v, want %+v", workflowRunUsage, want) 543 } 544 545 const methodName = "GetWorkflowRunUsageByID" 546 testBadOptions(t, methodName, func() (err error) { 547 _, _, err = client.Actions.GetWorkflowRunUsageByID(ctx, "\n", "\n", 29679449) 548 return err 549 }) 550 551 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 552 got, resp, err := client.Actions.GetWorkflowRunUsageByID(ctx, "o", "r", 29679449) 553 if got != nil { 554 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 555 } 556 return resp, err 557 }) 558 } 559 560 func TestWorkflowRun_Marshal(t *testing.T) { 561 testJSONMarshal(t, &WorkflowRun{}, "{}") 562 563 u := &WorkflowRun{ 564 ID: Int64(1), 565 Name: String("n"), 566 NodeID: String("nid"), 567 HeadBranch: String("hb"), 568 HeadSHA: String("hs"), 569 RunNumber: Int(1), 570 RunAttempt: Int(1), 571 Event: String("e"), 572 Status: String("s"), 573 Conclusion: String("c"), 574 WorkflowID: Int64(1), 575 URL: String("u"), 576 HTMLURL: String("h"), 577 PullRequests: []*PullRequest{ 578 { 579 URL: String("u"), 580 ID: Int64(1), 581 Number: Int(1), 582 Head: &PullRequestBranch{ 583 Ref: String("r"), 584 SHA: String("s"), 585 Repo: &Repository{ 586 ID: Int64(1), 587 URL: String("s"), 588 Name: String("n"), 589 }, 590 }, 591 Base: &PullRequestBranch{ 592 Ref: String("r"), 593 SHA: String("s"), 594 Repo: &Repository{ 595 ID: Int64(1), 596 URL: String("u"), 597 Name: String("n"), 598 }, 599 }, 600 }, 601 }, 602 CreatedAt: &Timestamp{referenceTime}, 603 UpdatedAt: &Timestamp{referenceTime}, 604 RunStartedAt: &Timestamp{referenceTime}, 605 JobsURL: String("j"), 606 LogsURL: String("l"), 607 CheckSuiteURL: String("c"), 608 ArtifactsURL: String("a"), 609 CancelURL: String("c"), 610 RerunURL: String("r"), 611 PreviousAttemptURL: String("p"), 612 HeadCommit: &HeadCommit{ 613 Message: String("m"), 614 Author: &CommitAuthor{ 615 Name: String("n"), 616 Email: String("e"), 617 Login: String("l"), 618 }, 619 URL: String("u"), 620 Distinct: Bool(false), 621 SHA: String("s"), 622 ID: String("i"), 623 TreeID: String("tid"), 624 Timestamp: &Timestamp{referenceTime}, 625 Committer: &CommitAuthor{ 626 Name: String("n"), 627 Email: String("e"), 628 Login: String("l"), 629 }, 630 }, 631 WorkflowURL: String("w"), 632 Repository: &Repository{ 633 ID: Int64(1), 634 URL: String("u"), 635 Name: String("n"), 636 }, 637 HeadRepository: &Repository{ 638 ID: Int64(1), 639 URL: String("u"), 640 Name: String("n"), 641 }, 642 Actor: &User{ 643 Login: String("l"), 644 ID: Int64(1), 645 AvatarURL: String("a"), 646 GravatarID: String("g"), 647 Name: String("n"), 648 Company: String("c"), 649 Blog: String("b"), 650 Location: String("l"), 651 Email: String("e"), 652 Hireable: Bool(true), 653 Bio: String("b"), 654 TwitterUsername: String("t"), 655 PublicRepos: Int(1), 656 Followers: Int(1), 657 Following: Int(1), 658 CreatedAt: &Timestamp{referenceTime}, 659 SuspendedAt: &Timestamp{referenceTime}, 660 URL: String("u"), 661 }, 662 } 663 664 want := `{ 665 "id": 1, 666 "name": "n", 667 "node_id": "nid", 668 "head_branch": "hb", 669 "head_sha": "hs", 670 "run_number": 1, 671 "run_attempt": 1, 672 "event": "e", 673 "status": "s", 674 "conclusion": "c", 675 "workflow_id": 1, 676 "url": "u", 677 "html_url": "h", 678 "pull_requests": [ 679 { 680 "id":1, 681 "number":1, 682 "url":"u", 683 "head":{ 684 "ref":"r", 685 "sha":"s", 686 "repo": { 687 "id":1, 688 "name":"n", 689 "url":"s" 690 } 691 }, 692 "base": { 693 "ref":"r", 694 "sha":"s", 695 "repo": { 696 "id":1, 697 "name":"n", 698 "url":"u" 699 } 700 } 701 } 702 ], 703 "created_at": ` + referenceTimeStr + `, 704 "updated_at": ` + referenceTimeStr + `, 705 "run_started_at": ` + referenceTimeStr + `, 706 "jobs_url": "j", 707 "logs_url": "l", 708 "check_suite_url": "c", 709 "artifacts_url": "a", 710 "cancel_url": "c", 711 "rerun_url": "r", 712 "previous_attempt_url": "p", 713 "head_commit": { 714 "message": "m", 715 "author": { 716 "name": "n", 717 "email": "e", 718 "username": "l" 719 }, 720 "url": "u", 721 "distinct": false, 722 "sha": "s", 723 "id": "i", 724 "tree_id": "tid", 725 "timestamp": ` + referenceTimeStr + `, 726 "committer": { 727 "name": "n", 728 "email": "e", 729 "username": "l" 730 } 731 }, 732 "workflow_url": "w", 733 "repository": { 734 "id": 1, 735 "url": "u", 736 "name": "n" 737 }, 738 "head_repository": { 739 "id": 1, 740 "url": "u", 741 "name": "n" 742 }, 743 "actor": { 744 "login": "l", 745 "id": 1, 746 "avatar_url": "a", 747 "gravatar_id": "g", 748 "name": "n", 749 "company": "c", 750 "blog": "b", 751 "location": "l", 752 "email": "e", 753 "hireable": true, 754 "bio": "b", 755 "twitter_username": "t", 756 "public_repos": 1, 757 "followers": 1, 758 "following": 1, 759 "created_at": ` + referenceTimeStr + `, 760 "suspended_at": ` + referenceTimeStr + `, 761 "url": "u" 762 } 763 }` 764 765 testJSONMarshal(t, u, want) 766 } 767 768 func TestWorkflowRuns_Marshal(t *testing.T) { 769 testJSONMarshal(t, &WorkflowRuns{}, "{}") 770 771 u := &WorkflowRuns{ 772 TotalCount: Int(1), 773 WorkflowRuns: []*WorkflowRun{ 774 { 775 ID: Int64(1), 776 Name: String("n"), 777 NodeID: String("nid"), 778 HeadBranch: String("hb"), 779 HeadSHA: String("hs"), 780 RunNumber: Int(1), 781 RunAttempt: Int(1), 782 Event: String("e"), 783 Status: String("s"), 784 Conclusion: String("c"), 785 WorkflowID: Int64(1), 786 URL: String("u"), 787 HTMLURL: String("h"), 788 PullRequests: []*PullRequest{ 789 { 790 URL: String("u"), 791 ID: Int64(1), 792 Number: Int(1), 793 Head: &PullRequestBranch{ 794 Ref: String("r"), 795 SHA: String("s"), 796 Repo: &Repository{ 797 ID: Int64(1), 798 URL: String("s"), 799 Name: String("n"), 800 }, 801 }, 802 Base: &PullRequestBranch{ 803 Ref: String("r"), 804 SHA: String("s"), 805 Repo: &Repository{ 806 ID: Int64(1), 807 URL: String("u"), 808 Name: String("n"), 809 }, 810 }, 811 }, 812 }, 813 CreatedAt: &Timestamp{referenceTime}, 814 UpdatedAt: &Timestamp{referenceTime}, 815 RunStartedAt: &Timestamp{referenceTime}, 816 JobsURL: String("j"), 817 LogsURL: String("l"), 818 CheckSuiteURL: String("c"), 819 ArtifactsURL: String("a"), 820 CancelURL: String("c"), 821 RerunURL: String("r"), 822 PreviousAttemptURL: String("p"), 823 HeadCommit: &HeadCommit{ 824 Message: String("m"), 825 Author: &CommitAuthor{ 826 Name: String("n"), 827 Email: String("e"), 828 Login: String("l"), 829 }, 830 URL: String("u"), 831 Distinct: Bool(false), 832 SHA: String("s"), 833 ID: String("i"), 834 TreeID: String("tid"), 835 Timestamp: &Timestamp{referenceTime}, 836 Committer: &CommitAuthor{ 837 Name: String("n"), 838 Email: String("e"), 839 Login: String("l"), 840 }, 841 }, 842 WorkflowURL: String("w"), 843 Repository: &Repository{ 844 ID: Int64(1), 845 URL: String("u"), 846 Name: String("n"), 847 }, 848 HeadRepository: &Repository{ 849 ID: Int64(1), 850 URL: String("u"), 851 Name: String("n"), 852 }, 853 Actor: &User{ 854 Login: String("l"), 855 ID: Int64(1), 856 AvatarURL: String("a"), 857 GravatarID: String("g"), 858 Name: String("n"), 859 Company: String("c"), 860 Blog: String("b"), 861 Location: String("l"), 862 Email: String("e"), 863 Hireable: Bool(true), 864 Bio: String("b"), 865 TwitterUsername: String("t"), 866 PublicRepos: Int(1), 867 Followers: Int(1), 868 Following: Int(1), 869 CreatedAt: &Timestamp{referenceTime}, 870 SuspendedAt: &Timestamp{referenceTime}, 871 URL: String("u"), 872 }, 873 }, 874 }, 875 } 876 877 want := `{ 878 "total_count": 1, 879 "workflow_runs": [ 880 { 881 "id": 1, 882 "name": "n", 883 "node_id": "nid", 884 "head_branch": "hb", 885 "head_sha": "hs", 886 "run_number": 1, 887 "run_attempt": 1, 888 "event": "e", 889 "status": "s", 890 "conclusion": "c", 891 "workflow_id": 1, 892 "url": "u", 893 "html_url": "h", 894 "pull_requests": [ 895 { 896 "id":1, 897 "number":1, 898 "url":"u", 899 "head":{ 900 "ref":"r", 901 "sha":"s", 902 "repo": { 903 "id":1, 904 "name":"n", 905 "url":"s" 906 } 907 }, 908 "base": { 909 "ref":"r", 910 "sha":"s", 911 "repo": { 912 "id":1, 913 "name":"n", 914 "url":"u" 915 } 916 } 917 } 918 ], 919 "created_at": ` + referenceTimeStr + `, 920 "updated_at": ` + referenceTimeStr + `, 921 "run_started_at": ` + referenceTimeStr + `, 922 "jobs_url": "j", 923 "logs_url": "l", 924 "check_suite_url": "c", 925 "artifacts_url": "a", 926 "cancel_url": "c", 927 "rerun_url": "r", 928 "previous_attempt_url": "p", 929 "head_commit": { 930 "message": "m", 931 "author": { 932 "name": "n", 933 "email": "e", 934 "username": "l" 935 }, 936 "url": "u", 937 "distinct": false, 938 "sha": "s", 939 "id": "i", 940 "tree_id": "tid", 941 "timestamp": ` + referenceTimeStr + `, 942 "committer": { 943 "name": "n", 944 "email": "e", 945 "username": "l" 946 } 947 }, 948 "workflow_url": "w", 949 "repository": { 950 "id": 1, 951 "url": "u", 952 "name": "n" 953 }, 954 "head_repository": { 955 "id": 1, 956 "url": "u", 957 "name": "n" 958 }, 959 "actor": { 960 "login": "l", 961 "id": 1, 962 "avatar_url": "a", 963 "gravatar_id": "g", 964 "name": "n", 965 "company": "c", 966 "blog": "b", 967 "location": "l", 968 "email": "e", 969 "hireable": true, 970 "bio": "b", 971 "twitter_username": "t", 972 "public_repos": 1, 973 "followers": 1, 974 "following": 1, 975 "created_at": ` + referenceTimeStr + `, 976 "suspended_at": ` + referenceTimeStr + `, 977 "url": "u" 978 } 979 } 980 ] 981 }` 982 983 testJSONMarshal(t, u, want) 984 } 985 986 func TestWorkflowRunBill_Marshal(t *testing.T) { 987 testJSONMarshal(t, &WorkflowRunBill{}, "{}") 988 989 u := &WorkflowRunBill{ 990 TotalMS: Int64(1), 991 Jobs: Int(1), 992 } 993 994 want := `{ 995 "total_ms": 1, 996 "jobs": 1 997 }` 998 999 testJSONMarshal(t, u, want) 1000 } 1001 1002 func TestWorkflowRunEnvironment_Marshal(t *testing.T) { 1003 testJSONMarshal(t, &WorkflowRunEnvironment{}, "{}") 1004 1005 u := &WorkflowRunEnvironment{ 1006 Ubuntu: &WorkflowRunBill{ 1007 TotalMS: Int64(1), 1008 Jobs: Int(1), 1009 }, 1010 MacOS: &WorkflowRunBill{ 1011 TotalMS: Int64(1), 1012 Jobs: Int(1), 1013 }, 1014 Windows: &WorkflowRunBill{ 1015 TotalMS: Int64(1), 1016 Jobs: Int(1), 1017 }, 1018 } 1019 1020 want := `{ 1021 "UBUNTU": { 1022 "total_ms": 1, 1023 "jobs": 1 1024 }, 1025 "MACOS": { 1026 "total_ms": 1, 1027 "jobs": 1 1028 }, 1029 "WINDOWS": { 1030 "total_ms": 1, 1031 "jobs": 1 1032 } 1033 }` 1034 1035 testJSONMarshal(t, u, want) 1036 } 1037 1038 func TestWorkflowRunUsage_Marshal(t *testing.T) { 1039 testJSONMarshal(t, &WorkflowRunUsage{}, "{}") 1040 1041 u := &WorkflowRunUsage{ 1042 Billable: &WorkflowRunEnvironment{ 1043 Ubuntu: &WorkflowRunBill{ 1044 TotalMS: Int64(1), 1045 Jobs: Int(1), 1046 }, 1047 MacOS: &WorkflowRunBill{ 1048 TotalMS: Int64(1), 1049 Jobs: Int(1), 1050 }, 1051 Windows: &WorkflowRunBill{ 1052 TotalMS: Int64(1), 1053 Jobs: Int(1), 1054 }, 1055 }, 1056 RunDurationMS: Int64(1), 1057 } 1058 1059 want := `{ 1060 "billable": { 1061 "UBUNTU": { 1062 "total_ms": 1, 1063 "jobs": 1 1064 }, 1065 "MACOS": { 1066 "total_ms": 1, 1067 "jobs": 1 1068 }, 1069 "WINDOWS": { 1070 "total_ms": 1, 1071 "jobs": 1 1072 } 1073 }, 1074 "run_duration_ms": 1 1075 }` 1076 1077 testJSONMarshal(t, u, want) 1078 } 1079 1080 func TestActionService_PendingDeployments(t *testing.T) { 1081 client, mux, _, teardown := setup() 1082 defer teardown() 1083 1084 input := &PendingDeploymentsRequest{EnvironmentIDs: []int64{3, 4}, State: "approved", Comment: ""} 1085 1086 mux.HandleFunc("/repos/o/r/actions/runs/399444496/pending_deployments", func(w http.ResponseWriter, r *http.Request) { 1087 v := new(PendingDeploymentsRequest) 1088 json.NewDecoder(r.Body).Decode(v) 1089 1090 testMethod(t, r, "POST") 1091 if !cmp.Equal(v, input) { 1092 t.Errorf("Request body = %+v, want %+v", v, input) 1093 } 1094 1095 fmt.Fprint(w, `[{"id":1}, {"id":2}]`) 1096 }) 1097 1098 ctx := context.Background() 1099 deployments, _, err := client.Actions.PendingDeployments(ctx, "o", "r", 399444496, input) 1100 if err != nil { 1101 t.Errorf("Actions.PendingDeployments returned error: %v", err) 1102 } 1103 1104 want := []*Deployment{{ID: Int64(1)}, {ID: Int64(2)}} 1105 if !cmp.Equal(deployments, want) { 1106 t.Errorf("Actions.PendingDeployments returned %+v, want %+v", deployments, want) 1107 } 1108 1109 const methodName = "PendingDeployments" 1110 testBadOptions(t, methodName, func() (err error) { 1111 _, _, err = client.Actions.PendingDeployments(ctx, "\n", "\n", 399444496, input) 1112 return err 1113 }) 1114 1115 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1116 got, resp, err := client.Actions.PendingDeployments(ctx, "o", "r", 399444496, input) 1117 if got != nil { 1118 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1119 } 1120 return resp, err 1121 }) 1122 }