github.com/google/go-github/v50@v50.2.0/github/git_commits_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 "strings" 14 "testing" 15 "time" 16 17 "github.com/ProtonMail/go-crypto/openpgp" 18 "github.com/google/go-cmp/cmp" 19 ) 20 21 func TestCommit_Marshal(t *testing.T) { 22 testJSONMarshal(t, &Commit{}, "{}") 23 24 u := &Commit{ 25 SHA: String("s"), 26 Author: &CommitAuthor{ 27 Date: &Timestamp{referenceTime}, 28 Name: String("n"), 29 Email: String("e"), 30 Login: String("u"), 31 }, 32 Committer: &CommitAuthor{ 33 Date: &Timestamp{referenceTime}, 34 Name: String("n"), 35 Email: String("e"), 36 Login: String("u"), 37 }, 38 Message: String("m"), 39 Tree: &Tree{ 40 SHA: String("s"), 41 Entries: []*TreeEntry{{ 42 SHA: String("s"), 43 Path: String("p"), 44 Mode: String("m"), 45 Type: String("t"), 46 Size: Int(1), 47 Content: String("c"), 48 URL: String("u"), 49 }}, 50 Truncated: Bool(false), 51 }, 52 Parents: nil, 53 Stats: &CommitStats{ 54 Additions: Int(1), 55 Deletions: Int(1), 56 Total: Int(1), 57 }, 58 HTMLURL: String("h"), 59 URL: String("u"), 60 Verification: &SignatureVerification{ 61 Verified: Bool(false), 62 Reason: String("r"), 63 Signature: String("s"), 64 Payload: String("p"), 65 }, 66 NodeID: String("n"), 67 CommentCount: Int(1), 68 SigningKey: &openpgp.Entity{}, 69 } 70 71 want := `{ 72 "sha": "s", 73 "author": { 74 "date": ` + referenceTimeStr + `, 75 "name": "n", 76 "email": "e", 77 "username": "u" 78 }, 79 "committer": { 80 "date": ` + referenceTimeStr + `, 81 "name": "n", 82 "email": "e", 83 "username": "u" 84 }, 85 "message": "m", 86 "tree": { 87 "sha": "s", 88 "tree": [ 89 { 90 "sha": "s", 91 "path": "p", 92 "mode": "m", 93 "type": "t", 94 "size": 1, 95 "content": "c", 96 "url": "u" 97 } 98 ], 99 "truncated": false 100 }, 101 "stats": { 102 "additions": 1, 103 "deletions": 1, 104 "total": 1 105 }, 106 "html_url": "h", 107 "url": "u", 108 "verification": { 109 "verified": false, 110 "reason": "r", 111 "signature": "s", 112 "payload": "p" 113 }, 114 "node_id": "n", 115 "comment_count": 1 116 }` 117 118 testJSONMarshal(t, u, want) 119 } 120 121 func TestGitService_GetCommit(t *testing.T) { 122 client, mux, _, teardown := setup() 123 defer teardown() 124 125 mux.HandleFunc("/repos/o/r/git/commits/s", func(w http.ResponseWriter, r *http.Request) { 126 testMethod(t, r, "GET") 127 fmt.Fprint(w, `{"sha":"s","message":"Commit Message.","author":{"name":"n"}}`) 128 }) 129 130 ctx := context.Background() 131 commit, _, err := client.Git.GetCommit(ctx, "o", "r", "s") 132 if err != nil { 133 t.Errorf("Git.GetCommit returned error: %v", err) 134 } 135 136 want := &Commit{SHA: String("s"), Message: String("Commit Message."), Author: &CommitAuthor{Name: String("n")}} 137 if !cmp.Equal(commit, want) { 138 t.Errorf("Git.GetCommit returned %+v, want %+v", commit, want) 139 } 140 141 const methodName = "GetCommit" 142 testBadOptions(t, methodName, func() (err error) { 143 _, _, err = client.Git.GetCommit(ctx, "\n", "\n", "\n") 144 return err 145 }) 146 147 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 148 got, resp, err := client.Git.GetCommit(ctx, "o", "r", "s") 149 if got != nil { 150 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 151 } 152 return resp, err 153 }) 154 } 155 156 func TestGitService_GetCommit_invalidOwner(t *testing.T) { 157 client, _, _, teardown := setup() 158 defer teardown() 159 160 ctx := context.Background() 161 _, _, err := client.Git.GetCommit(ctx, "%", "%", "%") 162 testURLParseError(t, err) 163 } 164 165 func TestGitService_CreateCommit(t *testing.T) { 166 client, mux, _, teardown := setup() 167 defer teardown() 168 169 input := &Commit{ 170 Message: String("Commit Message."), 171 Tree: &Tree{SHA: String("t")}, 172 Parents: []*Commit{{SHA: String("p")}}, 173 } 174 175 mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { 176 v := new(createCommit) 177 json.NewDecoder(r.Body).Decode(v) 178 179 testMethod(t, r, "POST") 180 181 want := &createCommit{ 182 Message: input.Message, 183 Tree: String("t"), 184 Parents: []string{"p"}, 185 } 186 if !cmp.Equal(v, want) { 187 t.Errorf("Request body = %+v, want %+v", v, want) 188 } 189 fmt.Fprint(w, `{"sha":"s"}`) 190 }) 191 192 ctx := context.Background() 193 commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) 194 if err != nil { 195 t.Errorf("Git.CreateCommit returned error: %v", err) 196 } 197 198 want := &Commit{SHA: String("s")} 199 if !cmp.Equal(commit, want) { 200 t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) 201 } 202 203 const methodName = "CreateCommit" 204 testBadOptions(t, methodName, func() (err error) { 205 _, _, err = client.Git.CreateCommit(ctx, "\n", "\n", input) 206 return err 207 }) 208 209 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 210 got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input) 211 if got != nil { 212 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 213 } 214 return resp, err 215 }) 216 } 217 218 func TestGitService_CreateSignedCommit(t *testing.T) { 219 client, mux, _, teardown := setup() 220 defer teardown() 221 222 signature := "----- BEGIN PGP SIGNATURE -----\n\naaaa\naaaa\n----- END PGP SIGNATURE -----" 223 224 input := &Commit{ 225 Message: String("Commit Message."), 226 Tree: &Tree{SHA: String("t")}, 227 Parents: []*Commit{{SHA: String("p")}}, 228 Verification: &SignatureVerification{ 229 Signature: String(signature), 230 }, 231 } 232 233 mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { 234 v := new(createCommit) 235 json.NewDecoder(r.Body).Decode(v) 236 237 testMethod(t, r, "POST") 238 239 want := &createCommit{ 240 Message: input.Message, 241 Tree: String("t"), 242 Parents: []string{"p"}, 243 Signature: String(signature), 244 } 245 if !cmp.Equal(v, want) { 246 t.Errorf("Request body = %+v, want %+v", v, want) 247 } 248 fmt.Fprint(w, `{"sha":"commitSha"}`) 249 }) 250 251 ctx := context.Background() 252 commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) 253 if err != nil { 254 t.Errorf("Git.CreateCommit returned error: %v", err) 255 } 256 257 want := &Commit{SHA: String("commitSha")} 258 if !cmp.Equal(commit, want) { 259 t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) 260 } 261 262 const methodName = "CreateCommit" 263 testBadOptions(t, methodName, func() (err error) { 264 _, _, err = client.Git.CreateCommit(ctx, "\n", "\n", input) 265 return err 266 }) 267 268 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 269 got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input) 270 if got != nil { 271 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 272 } 273 return resp, err 274 }) 275 } 276 277 func TestGitService_CreateSignedCommitWithInvalidParams(t *testing.T) { 278 client, _, _, teardown := setup() 279 defer teardown() 280 281 input := &Commit{ 282 SigningKey: &openpgp.Entity{}, 283 } 284 285 ctx := context.Background() 286 _, _, err := client.Git.CreateCommit(ctx, "o", "r", input) 287 if err == nil { 288 t.Errorf("Expected error to be returned because invalid params were passed") 289 } 290 } 291 292 func TestGitService_CreateSignedCommitWithNilCommit(t *testing.T) { 293 client, _, _, teardown := setup() 294 defer teardown() 295 296 ctx := context.Background() 297 _, _, err := client.Git.CreateCommit(ctx, "o", "r", nil) 298 if err == nil { 299 t.Errorf("Expected error to be returned because commit=nil") 300 } 301 } 302 303 func TestGitService_CreateSignedCommitWithKey(t *testing.T) { 304 client, mux, _, teardown := setup() 305 defer teardown() 306 s := strings.NewReader(testGPGKey) 307 keyring, err := openpgp.ReadArmoredKeyRing(s) 308 if err != nil { 309 t.Errorf("Error reading keyring: %+v", err) 310 } 311 312 // Set the key lifetime to nil so we don't care about the example key expiring and making tests fail 313 keyring[0].Identities["go-github <go-github@github.com>"].SelfSignature.KeyLifetimeSecs = nil 314 315 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 316 author := CommitAuthor{ 317 Name: String("go-github"), 318 Email: String("go-github@github.com"), 319 Date: &Timestamp{date}, 320 } 321 input := &Commit{ 322 Message: String("Commit Message."), 323 Tree: &Tree{SHA: String("t")}, 324 Parents: []*Commit{{SHA: String("p")}}, 325 SigningKey: keyring[0], 326 Author: &author, 327 } 328 329 messageReader := strings.NewReader(`tree t 330 parent p 331 author go-github <go-github@github.com> 1493849023 +0200 332 committer go-github <go-github@github.com> 1493849023 +0200 333 334 Commit Message.`) 335 336 mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { 337 v := new(createCommit) 338 json.NewDecoder(r.Body).Decode(v) 339 340 testMethod(t, r, "POST") 341 342 want := &createCommit{ 343 Message: input.Message, 344 Tree: String("t"), 345 Parents: []string{"p"}, 346 Author: &author, 347 } 348 349 sigReader := strings.NewReader(*v.Signature) 350 signer, err := openpgp.CheckArmoredDetachedSignature(keyring, messageReader, sigReader, nil) 351 if err != nil { 352 t.Errorf("Error verifying signature: %+v", err) 353 } 354 if signer.Identities["go-github <go-github@github.com>"].Name != "go-github <go-github@github.com>" { 355 t.Errorf("Signer is incorrect. got: %+v, want %+v", signer.Identities["go-github <go-github@github.com>"].Name, "go-github <go-github@github.com>") 356 } 357 // Nullify Signature since we checked it above 358 v.Signature = nil 359 if !cmp.Equal(v, want) { 360 t.Errorf("Request body = %+v, want %+v", v, want) 361 } 362 fmt.Fprint(w, `{"sha":"commitSha"}`) 363 }) 364 365 ctx := context.Background() 366 commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) 367 if err != nil { 368 t.Errorf("Git.CreateCommit returned error: %v", err) 369 } 370 371 want := &Commit{SHA: String("commitSha")} 372 if !cmp.Equal(commit, want) { 373 t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) 374 } 375 } 376 377 func TestGitService_createSignature_nilSigningKey(t *testing.T) { 378 a := &createCommit{ 379 Message: String("Commit Message."), 380 Tree: String("t"), 381 Parents: []string{"p"}, 382 } 383 384 _, err := createSignature(nil, a) 385 386 if err == nil { 387 t.Errorf("Expected error to be returned because no author was passed") 388 } 389 } 390 391 func TestGitService_createSignature_nilCommit(t *testing.T) { 392 _, err := createSignature(&openpgp.Entity{}, nil) 393 394 if err == nil { 395 t.Errorf("Expected error to be returned because no author was passed") 396 } 397 } 398 399 func TestGitService_createSignature_noAuthor(t *testing.T) { 400 a := &createCommit{ 401 Message: String("Commit Message."), 402 Tree: String("t"), 403 Parents: []string{"p"}, 404 } 405 406 _, err := createSignature(&openpgp.Entity{}, a) 407 408 if err == nil { 409 t.Errorf("Expected error to be returned because no author was passed") 410 } 411 } 412 413 func TestGitService_createSignature_invalidKey(t *testing.T) { 414 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 415 authorName := "go-github" 416 authorEmail := "go-github@github.com" 417 418 signKey, _ := openpgp.NewEntity(authorName, "", authorEmail, nil) 419 _ = signKey.RevokeKey(0, "Invalidate key", nil) 420 421 _, err := createSignature(signKey, &createCommit{ 422 Message: String("Commit Message."), 423 Tree: String("t"), 424 Parents: []string{"p"}, 425 Author: &CommitAuthor{ 426 Name: String("go-github"), 427 Email: String("go-github@github.com"), 428 Date: &Timestamp{date}, 429 }, 430 }) 431 432 if err == nil { 433 t.Errorf("Expected error to be returned due to invalid key") 434 } 435 } 436 437 func TestGitService_createSignatureMessage_nilCommit(t *testing.T) { 438 _, err := createSignatureMessage(nil) 439 if err == nil { 440 t.Errorf("Expected error to be returned due to nil key") 441 } 442 } 443 444 func TestGitService_createSignatureMessage_nilMessage(t *testing.T) { 445 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 446 447 _, err := createSignatureMessage(&createCommit{ 448 Message: nil, 449 Parents: []string{"p"}, 450 Author: &CommitAuthor{ 451 Name: String("go-github"), 452 Email: String("go-github@github.com"), 453 Date: &Timestamp{date}, 454 }, 455 }) 456 if err == nil { 457 t.Errorf("Expected error to be returned due to nil key") 458 } 459 } 460 461 func TestGitService_createSignatureMessage_emptyMessage(t *testing.T) { 462 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 463 emptyString := "" 464 _, err := createSignatureMessage(&createCommit{ 465 Message: &emptyString, 466 Parents: []string{"p"}, 467 Author: &CommitAuthor{ 468 Name: String("go-github"), 469 Email: String("go-github@github.com"), 470 Date: &Timestamp{date}, 471 }, 472 }) 473 if err == nil { 474 t.Errorf("Expected error to be returned due to nil key") 475 } 476 } 477 478 func TestGitService_createSignatureMessage_nilAuthor(t *testing.T) { 479 _, err := createSignatureMessage(&createCommit{ 480 Message: String("Commit Message."), 481 Parents: []string{"p"}, 482 Author: nil, 483 }) 484 if err == nil { 485 t.Errorf("Expected error to be returned due to nil key") 486 } 487 } 488 489 func TestGitService_createSignatureMessage_withoutTree(t *testing.T) { 490 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 491 492 msg, _ := createSignatureMessage(&createCommit{ 493 Message: String("Commit Message."), 494 Parents: []string{"p"}, 495 Author: &CommitAuthor{ 496 Name: String("go-github"), 497 Email: String("go-github@github.com"), 498 Date: &Timestamp{date}, 499 }, 500 }) 501 expected := `parent p 502 author go-github <go-github@github.com> 1493849023 +0200 503 committer go-github <go-github@github.com> 1493849023 +0200 504 505 Commit Message.` 506 if msg != expected { 507 t.Errorf("Returned message incorrect. returned %s, want %s", msg, expected) 508 } 509 } 510 511 func TestGitService_createSignatureMessage_withoutCommitter(t *testing.T) { 512 date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") 513 514 msg, _ := createSignatureMessage(&createCommit{ 515 Message: String("Commit Message."), 516 Parents: []string{"p"}, 517 Author: &CommitAuthor{ 518 Name: String("go-github"), 519 Email: String("go-github@github.com"), 520 Date: &Timestamp{date}, 521 }, 522 Committer: &CommitAuthor{ 523 Name: String("foo"), 524 Email: String("foo@bar.com"), 525 Date: &Timestamp{date}, 526 }, 527 }) 528 expected := `parent p 529 author go-github <go-github@github.com> 1493849023 +0200 530 committer foo <foo@bar.com> 1493849023 +0200 531 532 Commit Message.` 533 if msg != expected { 534 t.Errorf("Returned message incorrect. returned %s, want %s", msg, expected) 535 } 536 } 537 538 func TestGitService_CreateCommit_invalidOwner(t *testing.T) { 539 client, _, _, teardown := setup() 540 defer teardown() 541 542 ctx := context.Background() 543 _, _, err := client.Git.CreateCommit(ctx, "%", "%", &Commit{}) 544 testURLParseError(t, err) 545 } 546 547 const testGPGKey = ` 548 -----BEGIN PGP PRIVATE KEY BLOCK----- 549 550 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 603 =VFSn 604 -----END PGP PRIVATE KEY BLOCK-----` 605 606 func TestSignatureVerification_Marshal(t *testing.T) { 607 testJSONMarshal(t, &SignatureVerification{}, "{}") 608 609 u := &SignatureVerification{ 610 Verified: Bool(true), 611 Reason: String("reason"), 612 Signature: String("sign"), 613 Payload: String("payload"), 614 } 615 616 want := `{ 617 "verified": true, 618 "reason": "reason", 619 "signature": "sign", 620 "payload": "payload" 621 }` 622 623 testJSONMarshal(t, u, want) 624 } 625 626 func TestCommitAuthor_Marshal(t *testing.T) { 627 testJSONMarshal(t, &CommitAuthor{}, "{}") 628 629 u := &CommitAuthor{ 630 Date: &Timestamp{referenceTime}, 631 Name: String("name"), 632 Email: String("email"), 633 Login: String("login"), 634 } 635 636 want := `{ 637 "date": ` + referenceTimeStr + `, 638 "name": "name", 639 "email": "email", 640 "username": "login" 641 }` 642 643 testJSONMarshal(t, u, want) 644 } 645 646 func TestCreateCommit_Marshal(t *testing.T) { 647 testJSONMarshal(t, &createCommit{}, "{}") 648 649 u := &createCommit{ 650 Author: &CommitAuthor{ 651 Date: &Timestamp{referenceTime}, 652 Name: String("name"), 653 Email: String("email"), 654 Login: String("login"), 655 }, 656 Committer: &CommitAuthor{ 657 Date: &Timestamp{referenceTime}, 658 Name: String("name"), 659 Email: String("email"), 660 Login: String("login"), 661 }, 662 Message: String("message"), 663 Tree: String("tree"), 664 Parents: []string{"p"}, 665 Signature: String("sign"), 666 } 667 668 want := `{ 669 "author": { 670 "date": ` + referenceTimeStr + `, 671 "name": "name", 672 "email": "email", 673 "username": "login" 674 }, 675 "committer": { 676 "date": ` + referenceTimeStr + `, 677 "name": "name", 678 "email": "email", 679 "username": "login" 680 }, 681 "message": "message", 682 "tree": "tree", 683 "parents": [ 684 "p" 685 ], 686 "signature": "sign" 687 }` 688 689 testJSONMarshal(t, u, want) 690 }