github.com/google/go-github/v70@v70.0.0/github/gists_test.go (about) 1 // Copyright 2013 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 "testing" 14 "time" 15 16 "github.com/google/go-cmp/cmp" 17 ) 18 19 func TestGist_Marshal(t *testing.T) { 20 t.Parallel() 21 testJSONMarshal(t, &Gist{}, "{}") 22 23 createdAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC) 24 updatedAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC) 25 26 u := &Gist{ 27 ID: Ptr("i"), 28 Description: Ptr("description"), 29 Public: Ptr(true), 30 Owner: &User{ 31 Login: Ptr("ll"), 32 ID: Ptr(int64(123)), 33 AvatarURL: Ptr("a"), 34 GravatarID: Ptr("g"), 35 Name: Ptr("n"), 36 Company: Ptr("c"), 37 Blog: Ptr("b"), 38 Location: Ptr("l"), 39 Email: Ptr("e"), 40 Hireable: Ptr(true), 41 PublicRepos: Ptr(1), 42 Followers: Ptr(1), 43 Following: Ptr(1), 44 CreatedAt: &Timestamp{referenceTime}, 45 URL: Ptr("u"), 46 }, 47 Files: map[GistFilename]GistFile{ 48 "gistfile.py": { 49 Size: Ptr(167), 50 Filename: Ptr("gistfile.py"), 51 Language: Ptr("Python"), 52 Type: Ptr("application/x-python"), 53 RawURL: Ptr("raw-url"), 54 Content: Ptr("c"), 55 }, 56 }, 57 Comments: Ptr(1), 58 HTMLURL: Ptr("html-url"), 59 GitPullURL: Ptr("gitpull-url"), 60 GitPushURL: Ptr("gitpush-url"), 61 CreatedAt: &Timestamp{createdAt}, 62 UpdatedAt: &Timestamp{updatedAt}, 63 NodeID: Ptr("node"), 64 } 65 66 want := `{ 67 "id": "i", 68 "description": "description", 69 "public": true, 70 "owner": { 71 "login": "ll", 72 "id": 123, 73 "avatar_url": "a", 74 "gravatar_id": "g", 75 "name": "n", 76 "company": "c", 77 "blog": "b", 78 "location": "l", 79 "email": "e", 80 "hireable": true, 81 "public_repos": 1, 82 "followers": 1, 83 "following": 1, 84 "created_at": ` + referenceTimeStr + `, 85 "url": "u" 86 }, 87 "files": { 88 "gistfile.py": { 89 "size": 167, 90 "filename": "gistfile.py", 91 "language": "Python", 92 "type": "application/x-python", 93 "raw_url": "raw-url", 94 "content": "c" 95 } 96 }, 97 "comments": 1, 98 "html_url": "html-url", 99 "git_pull_url": "gitpull-url", 100 "git_push_url": "gitpush-url", 101 "created_at": "2010-02-10T10:10:00Z", 102 "updated_at": "2010-02-10T10:10:00Z", 103 "node_id": "node" 104 }` 105 106 testJSONMarshal(t, u, want) 107 } 108 109 func TestGistCommit_Marshal(t *testing.T) { 110 t.Parallel() 111 testJSONMarshal(t, &GistCommit{}, "{}") 112 113 u := &GistCommit{ 114 URL: Ptr("u"), 115 Version: Ptr("v"), 116 User: &User{ 117 Login: Ptr("ll"), 118 ID: Ptr(int64(123)), 119 AvatarURL: Ptr("a"), 120 GravatarID: Ptr("g"), 121 Name: Ptr("n"), 122 Company: Ptr("c"), 123 Blog: Ptr("b"), 124 Location: Ptr("l"), 125 Email: Ptr("e"), 126 Hireable: Ptr(true), 127 PublicRepos: Ptr(1), 128 Followers: Ptr(1), 129 Following: Ptr(1), 130 CreatedAt: &Timestamp{referenceTime}, 131 URL: Ptr("u"), 132 }, 133 ChangeStatus: &CommitStats{ 134 Additions: Ptr(1), 135 Deletions: Ptr(1), 136 Total: Ptr(2), 137 }, 138 CommittedAt: &Timestamp{referenceTime}, 139 NodeID: Ptr("node"), 140 } 141 142 want := `{ 143 "url": "u", 144 "version": "v", 145 "user": { 146 "login": "ll", 147 "id": 123, 148 "avatar_url": "a", 149 "gravatar_id": "g", 150 "name": "n", 151 "company": "c", 152 "blog": "b", 153 "location": "l", 154 "email": "e", 155 "hireable": true, 156 "public_repos": 1, 157 "followers": 1, 158 "following": 1, 159 "created_at": ` + referenceTimeStr + `, 160 "url": "u" 161 }, 162 "change_status": { 163 "additions": 1, 164 "deletions": 1, 165 "total": 2 166 }, 167 "committed_at": ` + referenceTimeStr + `, 168 "node_id": "node" 169 }` 170 171 testJSONMarshal(t, u, want) 172 } 173 174 func TestGistFork_Marshal(t *testing.T) { 175 t.Parallel() 176 testJSONMarshal(t, &GistFork{}, "{}") 177 178 u := &GistFork{ 179 URL: Ptr("u"), 180 User: &User{ 181 Login: Ptr("ll"), 182 ID: Ptr(int64(123)), 183 AvatarURL: Ptr("a"), 184 GravatarID: Ptr("g"), 185 Name: Ptr("n"), 186 Company: Ptr("c"), 187 Blog: Ptr("b"), 188 Location: Ptr("l"), 189 Email: Ptr("e"), 190 Hireable: Ptr(true), 191 PublicRepos: Ptr(1), 192 Followers: Ptr(1), 193 Following: Ptr(1), 194 CreatedAt: &Timestamp{referenceTime}, 195 URL: Ptr("u"), 196 }, 197 ID: Ptr("id"), 198 CreatedAt: &Timestamp{referenceTime}, 199 UpdatedAt: &Timestamp{referenceTime}, 200 NodeID: Ptr("node"), 201 } 202 203 want := `{ 204 "url": "u", 205 "user": { 206 "login": "ll", 207 "id": 123, 208 "avatar_url": "a", 209 "gravatar_id": "g", 210 "name": "n", 211 "company": "c", 212 "blog": "b", 213 "location": "l", 214 "email": "e", 215 "hireable": true, 216 "public_repos": 1, 217 "followers": 1, 218 "following": 1, 219 "created_at": ` + referenceTimeStr + `, 220 "url": "u" 221 }, 222 "id": "id", 223 "created_at": ` + referenceTimeStr + `, 224 "updated_at": ` + referenceTimeStr + `, 225 "node_id": "node" 226 }` 227 228 testJSONMarshal(t, u, want) 229 } 230 231 func TestGistsService_List_specifiedUser(t *testing.T) { 232 t.Parallel() 233 client, mux, _ := setup(t) 234 235 since := "2013-01-01T00:00:00Z" 236 237 mux.HandleFunc("/users/u/gists", func(w http.ResponseWriter, r *http.Request) { 238 testMethod(t, r, "GET") 239 testFormValues(t, r, values{ 240 "since": since, 241 }) 242 fmt.Fprint(w, `[{"id": "1"}]`) 243 }) 244 245 opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} 246 ctx := context.Background() 247 gists, _, err := client.Gists.List(ctx, "u", opt) 248 if err != nil { 249 t.Errorf("Gists.List returned error: %v", err) 250 } 251 252 want := []*Gist{{ID: Ptr("1")}} 253 if !cmp.Equal(gists, want) { 254 t.Errorf("Gists.List returned %+v, want %+v", gists, want) 255 } 256 257 const methodName = "List" 258 testBadOptions(t, methodName, func() (err error) { 259 _, _, err = client.Gists.List(ctx, "\n", opt) 260 return err 261 }) 262 263 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 264 got, resp, err := client.Gists.List(ctx, "u", opt) 265 if got != nil { 266 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 267 } 268 return resp, err 269 }) 270 } 271 272 func TestGistsService_List_authenticatedUser(t *testing.T) { 273 t.Parallel() 274 client, mux, _ := setup(t) 275 276 mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) { 277 testMethod(t, r, "GET") 278 fmt.Fprint(w, `[{"id": "1"}]`) 279 }) 280 281 ctx := context.Background() 282 gists, _, err := client.Gists.List(ctx, "", nil) 283 if err != nil { 284 t.Errorf("Gists.List returned error: %v", err) 285 } 286 287 want := []*Gist{{ID: Ptr("1")}} 288 if !cmp.Equal(gists, want) { 289 t.Errorf("Gists.List returned %+v, want %+v", gists, want) 290 } 291 292 const methodName = "List" 293 testBadOptions(t, methodName, func() (err error) { 294 _, _, err = client.Gists.List(ctx, "\n", nil) 295 return err 296 }) 297 298 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 299 got, resp, err := client.Gists.List(ctx, "", nil) 300 if got != nil { 301 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 302 } 303 return resp, err 304 }) 305 } 306 307 func TestGistsService_List_invalidUser(t *testing.T) { 308 t.Parallel() 309 client, _, _ := setup(t) 310 311 ctx := context.Background() 312 _, _, err := client.Gists.List(ctx, "%", nil) 313 testURLParseError(t, err) 314 } 315 316 func TestGistsService_ListAll(t *testing.T) { 317 t.Parallel() 318 client, mux, _ := setup(t) 319 320 since := "2013-01-01T00:00:00Z" 321 322 mux.HandleFunc("/gists/public", func(w http.ResponseWriter, r *http.Request) { 323 testMethod(t, r, "GET") 324 testFormValues(t, r, values{ 325 "since": since, 326 }) 327 fmt.Fprint(w, `[{"id": "1"}]`) 328 }) 329 330 opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} 331 ctx := context.Background() 332 gists, _, err := client.Gists.ListAll(ctx, opt) 333 if err != nil { 334 t.Errorf("Gists.ListAll returned error: %v", err) 335 } 336 337 want := []*Gist{{ID: Ptr("1")}} 338 if !cmp.Equal(gists, want) { 339 t.Errorf("Gists.ListAll returned %+v, want %+v", gists, want) 340 } 341 342 const methodName = "ListAll" 343 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 344 got, resp, err := client.Gists.ListAll(ctx, opt) 345 if got != nil { 346 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 347 } 348 return resp, err 349 }) 350 } 351 352 func TestGistsService_ListStarred(t *testing.T) { 353 t.Parallel() 354 client, mux, _ := setup(t) 355 356 since := "2013-01-01T00:00:00Z" 357 358 mux.HandleFunc("/gists/starred", func(w http.ResponseWriter, r *http.Request) { 359 testMethod(t, r, "GET") 360 testFormValues(t, r, values{ 361 "since": since, 362 }) 363 fmt.Fprint(w, `[{"id": "1"}]`) 364 }) 365 366 opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} 367 ctx := context.Background() 368 gists, _, err := client.Gists.ListStarred(ctx, opt) 369 if err != nil { 370 t.Errorf("Gists.ListStarred returned error: %v", err) 371 } 372 373 want := []*Gist{{ID: Ptr("1")}} 374 if !cmp.Equal(gists, want) { 375 t.Errorf("Gists.ListStarred returned %+v, want %+v", gists, want) 376 } 377 378 const methodName = "ListStarred" 379 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 380 got, resp, err := client.Gists.ListStarred(ctx, opt) 381 if got != nil { 382 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 383 } 384 return resp, err 385 }) 386 } 387 388 func TestGistsService_Get(t *testing.T) { 389 t.Parallel() 390 client, mux, _ := setup(t) 391 392 mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { 393 testMethod(t, r, "GET") 394 fmt.Fprint(w, `{"id": "1"}`) 395 }) 396 397 ctx := context.Background() 398 gist, _, err := client.Gists.Get(ctx, "1") 399 if err != nil { 400 t.Errorf("Gists.Get returned error: %v", err) 401 } 402 403 want := &Gist{ID: Ptr("1")} 404 if !cmp.Equal(gist, want) { 405 t.Errorf("Gists.Get returned %+v, want %+v", gist, want) 406 } 407 408 const methodName = "Get" 409 testBadOptions(t, methodName, func() (err error) { 410 _, _, err = client.Gists.Get(ctx, "\n") 411 return err 412 }) 413 414 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 415 got, resp, err := client.Gists.Get(ctx, "1") 416 if got != nil { 417 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 418 } 419 return resp, err 420 }) 421 } 422 423 func TestGistsService_Get_invalidID(t *testing.T) { 424 t.Parallel() 425 client, _, _ := setup(t) 426 427 ctx := context.Background() 428 _, _, err := client.Gists.Get(ctx, "%") 429 testURLParseError(t, err) 430 } 431 432 func TestGistsService_GetRevision(t *testing.T) { 433 t.Parallel() 434 client, mux, _ := setup(t) 435 436 mux.HandleFunc("/gists/1/s", func(w http.ResponseWriter, r *http.Request) { 437 testMethod(t, r, "GET") 438 fmt.Fprint(w, `{"id": "1"}`) 439 }) 440 441 ctx := context.Background() 442 gist, _, err := client.Gists.GetRevision(ctx, "1", "s") 443 if err != nil { 444 t.Errorf("Gists.Get returned error: %v", err) 445 } 446 447 want := &Gist{ID: Ptr("1")} 448 if !cmp.Equal(gist, want) { 449 t.Errorf("Gists.Get returned %+v, want %+v", gist, want) 450 } 451 452 const methodName = "GetRevision" 453 testBadOptions(t, methodName, func() (err error) { 454 _, _, err = client.Gists.GetRevision(ctx, "\n", "\n") 455 return err 456 }) 457 458 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 459 got, resp, err := client.Gists.GetRevision(ctx, "1", "s") 460 if got != nil { 461 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 462 } 463 return resp, err 464 }) 465 } 466 467 func TestGistsService_GetRevision_invalidID(t *testing.T) { 468 t.Parallel() 469 client, _, _ := setup(t) 470 471 ctx := context.Background() 472 _, _, err := client.Gists.GetRevision(ctx, "%", "%") 473 testURLParseError(t, err) 474 } 475 476 func TestGistsService_Create(t *testing.T) { 477 t.Parallel() 478 client, mux, _ := setup(t) 479 480 input := &Gist{ 481 Description: Ptr("Gist description"), 482 Public: Ptr(false), 483 Files: map[GistFilename]GistFile{ 484 "test.txt": {Content: Ptr("Gist file content")}, 485 }, 486 } 487 488 mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) { 489 v := new(Gist) 490 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 491 492 testMethod(t, r, "POST") 493 if !cmp.Equal(v, input) { 494 t.Errorf("Request body = %+v, want %+v", v, input) 495 } 496 497 fmt.Fprint(w, 498 ` 499 { 500 "id": "1", 501 "description": "Gist description", 502 "public": false, 503 "files": { 504 "test.txt": { 505 "filename": "test.txt" 506 } 507 } 508 }`) 509 }) 510 511 ctx := context.Background() 512 gist, _, err := client.Gists.Create(ctx, input) 513 if err != nil { 514 t.Errorf("Gists.Create returned error: %v", err) 515 } 516 517 want := &Gist{ 518 ID: Ptr("1"), 519 Description: Ptr("Gist description"), 520 Public: Ptr(false), 521 Files: map[GistFilename]GistFile{ 522 "test.txt": {Filename: Ptr("test.txt")}, 523 }, 524 } 525 if !cmp.Equal(gist, want) { 526 t.Errorf("Gists.Create returned %+v, want %+v", gist, want) 527 } 528 529 const methodName = "Create" 530 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 531 got, resp, err := client.Gists.Create(ctx, input) 532 if got != nil { 533 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 534 } 535 return resp, err 536 }) 537 } 538 539 func TestGistsService_Edit(t *testing.T) { 540 t.Parallel() 541 client, mux, _ := setup(t) 542 543 input := &Gist{ 544 Description: Ptr("New description"), 545 Files: map[GistFilename]GistFile{ 546 "new.txt": {Content: Ptr("new file content")}, 547 }, 548 } 549 550 mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { 551 v := new(Gist) 552 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 553 554 testMethod(t, r, "PATCH") 555 if !cmp.Equal(v, input) { 556 t.Errorf("Request body = %+v, want %+v", v, input) 557 } 558 559 fmt.Fprint(w, 560 ` 561 { 562 "id": "1", 563 "description": "new description", 564 "public": false, 565 "files": { 566 "test.txt": { 567 "filename": "test.txt" 568 }, 569 "new.txt": { 570 "filename": "new.txt" 571 } 572 } 573 }`) 574 }) 575 576 ctx := context.Background() 577 gist, _, err := client.Gists.Edit(ctx, "1", input) 578 if err != nil { 579 t.Errorf("Gists.Edit returned error: %v", err) 580 } 581 582 want := &Gist{ 583 ID: Ptr("1"), 584 Description: Ptr("new description"), 585 Public: Ptr(false), 586 Files: map[GistFilename]GistFile{ 587 "test.txt": {Filename: Ptr("test.txt")}, 588 "new.txt": {Filename: Ptr("new.txt")}, 589 }, 590 } 591 if !cmp.Equal(gist, want) { 592 t.Errorf("Gists.Edit returned %+v, want %+v", gist, want) 593 } 594 595 const methodName = "Edit" 596 testBadOptions(t, methodName, func() (err error) { 597 _, _, err = client.Gists.Edit(ctx, "\n", input) 598 return err 599 }) 600 601 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 602 got, resp, err := client.Gists.Edit(ctx, "1", input) 603 if got != nil { 604 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 605 } 606 return resp, err 607 }) 608 } 609 610 func TestGistsService_Edit_invalidID(t *testing.T) { 611 t.Parallel() 612 client, _, _ := setup(t) 613 614 ctx := context.Background() 615 _, _, err := client.Gists.Edit(ctx, "%", nil) 616 testURLParseError(t, err) 617 } 618 619 func TestGistsService_ListCommits(t *testing.T) { 620 t.Parallel() 621 client, mux, _ := setup(t) 622 623 mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) { 624 testMethod(t, r, "GET") 625 testFormValues(t, r, nil) 626 fmt.Fprint(w, ` 627 [ 628 { 629 "url": "https://api.github.com/gists/1/1", 630 "version": "1", 631 "user": { 632 "id": 1 633 }, 634 "change_status": { 635 "deletions": 0, 636 "additions": 180, 637 "total": 180 638 }, 639 "committed_at": "2010-01-01T00:00:00Z" 640 } 641 ] 642 `) 643 }) 644 645 ctx := context.Background() 646 gistCommits, _, err := client.Gists.ListCommits(ctx, "1", nil) 647 if err != nil { 648 t.Errorf("Gists.ListCommits returned error: %v", err) 649 } 650 651 want := []*GistCommit{{ 652 URL: Ptr("https://api.github.com/gists/1/1"), 653 Version: Ptr("1"), 654 User: &User{ID: Ptr(int64(1))}, 655 CommittedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)}, 656 ChangeStatus: &CommitStats{ 657 Additions: Ptr(180), 658 Deletions: Ptr(0), 659 Total: Ptr(180), 660 }}} 661 662 if !cmp.Equal(gistCommits, want) { 663 t.Errorf("Gists.ListCommits returned %+v, want %+v", gistCommits, want) 664 } 665 666 const methodName = "ListCommits" 667 testBadOptions(t, methodName, func() (err error) { 668 _, _, err = client.Gists.ListCommits(ctx, "\n", nil) 669 return err 670 }) 671 672 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 673 got, resp, err := client.Gists.ListCommits(ctx, "1", nil) 674 if got != nil { 675 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 676 } 677 return resp, err 678 }) 679 } 680 681 func TestGistsService_ListCommits_withOptions(t *testing.T) { 682 t.Parallel() 683 client, mux, _ := setup(t) 684 685 mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) { 686 testMethod(t, r, "GET") 687 testFormValues(t, r, values{ 688 "page": "2", 689 }) 690 fmt.Fprint(w, `[]`) 691 }) 692 693 ctx := context.Background() 694 _, _, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2}) 695 if err != nil { 696 t.Errorf("Gists.ListCommits returned error: %v", err) 697 } 698 699 const methodName = "ListCommits" 700 testBadOptions(t, methodName, func() (err error) { 701 _, _, err = client.Gists.ListCommits(ctx, "\n", &ListOptions{Page: 2}) 702 return err 703 }) 704 705 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 706 got, resp, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2}) 707 if got != nil { 708 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 709 } 710 return resp, err 711 }) 712 } 713 714 func TestGistsService_ListCommits_invalidID(t *testing.T) { 715 t.Parallel() 716 client, _, _ := setup(t) 717 718 ctx := context.Background() 719 _, _, err := client.Gists.ListCommits(ctx, "%", nil) 720 testURLParseError(t, err) 721 } 722 723 func TestGistsService_Delete(t *testing.T) { 724 t.Parallel() 725 client, mux, _ := setup(t) 726 727 mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { 728 testMethod(t, r, "DELETE") 729 }) 730 731 ctx := context.Background() 732 _, err := client.Gists.Delete(ctx, "1") 733 if err != nil { 734 t.Errorf("Gists.Delete returned error: %v", err) 735 } 736 737 const methodName = "Delete" 738 testBadOptions(t, methodName, func() (err error) { 739 _, err = client.Gists.Delete(ctx, "\n") 740 return err 741 }) 742 743 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 744 return client.Gists.Delete(ctx, "1") 745 }) 746 } 747 748 func TestGistsService_Delete_invalidID(t *testing.T) { 749 t.Parallel() 750 client, _, _ := setup(t) 751 752 ctx := context.Background() 753 _, err := client.Gists.Delete(ctx, "%") 754 testURLParseError(t, err) 755 } 756 757 func TestGistsService_Star(t *testing.T) { 758 t.Parallel() 759 client, mux, _ := setup(t) 760 761 mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { 762 testMethod(t, r, "PUT") 763 }) 764 765 ctx := context.Background() 766 _, err := client.Gists.Star(ctx, "1") 767 if err != nil { 768 t.Errorf("Gists.Star returned error: %v", err) 769 } 770 771 const methodName = "Star" 772 testBadOptions(t, methodName, func() (err error) { 773 _, err = client.Gists.Star(ctx, "\n") 774 return err 775 }) 776 777 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 778 return client.Gists.Star(ctx, "1") 779 }) 780 } 781 782 func TestGistsService_Star_invalidID(t *testing.T) { 783 t.Parallel() 784 client, _, _ := setup(t) 785 786 ctx := context.Background() 787 _, err := client.Gists.Star(ctx, "%") 788 testURLParseError(t, err) 789 } 790 791 func TestGistsService_Unstar(t *testing.T) { 792 t.Parallel() 793 client, mux, _ := setup(t) 794 795 mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { 796 testMethod(t, r, "DELETE") 797 }) 798 799 ctx := context.Background() 800 _, err := client.Gists.Unstar(ctx, "1") 801 if err != nil { 802 t.Errorf("Gists.Unstar returned error: %v", err) 803 } 804 805 const methodName = "Unstar" 806 testBadOptions(t, methodName, func() (err error) { 807 _, err = client.Gists.Unstar(ctx, "\n") 808 return err 809 }) 810 811 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 812 return client.Gists.Unstar(ctx, "1") 813 }) 814 } 815 816 func TestGistsService_Unstar_invalidID(t *testing.T) { 817 t.Parallel() 818 client, _, _ := setup(t) 819 820 ctx := context.Background() 821 _, err := client.Gists.Unstar(ctx, "%") 822 testURLParseError(t, err) 823 } 824 825 func TestGistsService_IsStarred_hasStar(t *testing.T) { 826 t.Parallel() 827 client, mux, _ := setup(t) 828 829 mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { 830 testMethod(t, r, "GET") 831 w.WriteHeader(http.StatusNoContent) 832 }) 833 834 ctx := context.Background() 835 star, _, err := client.Gists.IsStarred(ctx, "1") 836 if err != nil { 837 t.Errorf("Gists.Starred returned error: %v", err) 838 } 839 if want := true; star != want { 840 t.Errorf("Gists.Starred returned %+v, want %+v", star, want) 841 } 842 843 const methodName = "IsStarred" 844 testBadOptions(t, methodName, func() (err error) { 845 _, _, err = client.Gists.IsStarred(ctx, "\n") 846 return err 847 }) 848 849 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 850 got, resp, err := client.Gists.IsStarred(ctx, "1") 851 if got { 852 t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) 853 } 854 return resp, err 855 }) 856 } 857 858 func TestGistsService_IsStarred_noStar(t *testing.T) { 859 t.Parallel() 860 client, mux, _ := setup(t) 861 862 mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { 863 testMethod(t, r, "GET") 864 w.WriteHeader(http.StatusNotFound) 865 }) 866 867 ctx := context.Background() 868 star, _, err := client.Gists.IsStarred(ctx, "1") 869 if err != nil { 870 t.Errorf("Gists.Starred returned error: %v", err) 871 } 872 if want := false; star != want { 873 t.Errorf("Gists.Starred returned %+v, want %+v", star, want) 874 } 875 876 const methodName = "IsStarred" 877 testBadOptions(t, methodName, func() (err error) { 878 _, _, err = client.Gists.IsStarred(ctx, "\n") 879 return err 880 }) 881 882 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 883 got, resp, err := client.Gists.IsStarred(ctx, "1") 884 if got { 885 t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) 886 } 887 return resp, err 888 }) 889 } 890 891 func TestGistsService_IsStarred_invalidID(t *testing.T) { 892 t.Parallel() 893 client, _, _ := setup(t) 894 895 ctx := context.Background() 896 _, _, err := client.Gists.IsStarred(ctx, "%") 897 testURLParseError(t, err) 898 } 899 900 func TestGistsService_Fork(t *testing.T) { 901 t.Parallel() 902 client, mux, _ := setup(t) 903 904 mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { 905 testMethod(t, r, "POST") 906 fmt.Fprint(w, `{"id": "2"}`) 907 }) 908 909 ctx := context.Background() 910 gist, _, err := client.Gists.Fork(ctx, "1") 911 if err != nil { 912 t.Errorf("Gists.Fork returned error: %v", err) 913 } 914 915 want := &Gist{ID: Ptr("2")} 916 if !cmp.Equal(gist, want) { 917 t.Errorf("Gists.Fork returned %+v, want %+v", gist, want) 918 } 919 920 const methodName = "Fork" 921 testBadOptions(t, methodName, func() (err error) { 922 _, _, err = client.Gists.Fork(ctx, "\n") 923 return err 924 }) 925 926 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 927 got, resp, err := client.Gists.Fork(ctx, "1") 928 if got != nil { 929 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 930 } 931 return resp, err 932 }) 933 } 934 935 func TestGistsService_ListForks(t *testing.T) { 936 t.Parallel() 937 client, mux, _ := setup(t) 938 939 mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { 940 testMethod(t, r, "GET") 941 testFormValues(t, r, nil) 942 fmt.Fprint(w, ` 943 [ 944 {"url": "https://api.github.com/gists/1", 945 "user": {"id": 1}, 946 "id": "1", 947 "created_at": "2010-01-01T00:00:00Z", 948 "updated_at": "2013-01-01T00:00:00Z" 949 } 950 ] 951 `) 952 }) 953 954 ctx := context.Background() 955 gistForks, _, err := client.Gists.ListForks(ctx, "1", nil) 956 if err != nil { 957 t.Errorf("Gists.ListForks returned error: %v", err) 958 } 959 960 want := []*GistFork{{ 961 URL: Ptr("https://api.github.com/gists/1"), 962 ID: Ptr("1"), 963 User: &User{ID: Ptr(int64(1))}, 964 CreatedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)}, 965 UpdatedAt: &Timestamp{time.Date(2013, time.January, 1, 00, 00, 00, 0, time.UTC)}}} 966 967 if !cmp.Equal(gistForks, want) { 968 t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want) 969 } 970 971 const methodName = "ListForks" 972 testBadOptions(t, methodName, func() (err error) { 973 _, _, err = client.Gists.ListForks(ctx, "\n", nil) 974 return err 975 }) 976 977 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 978 got, resp, err := client.Gists.ListForks(ctx, "1", nil) 979 if got != nil { 980 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 981 } 982 return resp, err 983 }) 984 } 985 986 func TestGistsService_ListForks_withOptions(t *testing.T) { 987 t.Parallel() 988 client, mux, _ := setup(t) 989 990 mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { 991 testMethod(t, r, "GET") 992 testFormValues(t, r, values{ 993 "page": "2", 994 }) 995 fmt.Fprint(w, `[]`) 996 }) 997 998 ctx := context.Background() 999 gistForks, _, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2}) 1000 if err != nil { 1001 t.Errorf("Gists.ListForks returned error: %v", err) 1002 } 1003 1004 want := []*GistFork{} 1005 if !cmp.Equal(gistForks, want) { 1006 t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want) 1007 } 1008 1009 const methodName = "ListForks" 1010 testBadOptions(t, methodName, func() (err error) { 1011 _, _, err = client.Gists.ListForks(ctx, "\n", &ListOptions{Page: 2}) 1012 return err 1013 }) 1014 1015 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1016 got, resp, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2}) 1017 if got != nil { 1018 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1019 } 1020 return resp, err 1021 }) 1022 } 1023 1024 func TestGistFile_Marshal(t *testing.T) { 1025 t.Parallel() 1026 testJSONMarshal(t, &GistFile{}, "{}") 1027 1028 u := &GistFile{ 1029 Size: Ptr(1), 1030 Filename: Ptr("fn"), 1031 Language: Ptr("lan"), 1032 Type: Ptr("type"), 1033 RawURL: Ptr("rurl"), 1034 Content: Ptr("con"), 1035 } 1036 1037 want := `{ 1038 "size": 1, 1039 "filename": "fn", 1040 "language": "lan", 1041 "type": "type", 1042 "raw_url": "rurl", 1043 "content": "con" 1044 }` 1045 1046 testJSONMarshal(t, u, want) 1047 }