github.com/google/go-github/v71@v71.0.0/github/packages_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 "encoding/json" 10 "reflect" 11 "testing" 12 ) 13 14 func TestPackageRegistry_Marshal(t *testing.T) { 15 t.Parallel() 16 testJSONMarshal(t, &PackageRegistry{}, "{}") 17 18 o := &PackageRegistry{ 19 AboutURL: Ptr("aurl"), 20 Name: Ptr("name"), 21 Type: Ptr("type"), 22 URL: Ptr("url"), 23 Vendor: Ptr("vendor"), 24 } 25 want := `{ 26 "about_url": "aurl", 27 "name": "name", 28 "type": "type", 29 "url": "url", 30 "vendor": "vendor" 31 }` 32 33 testJSONMarshal(t, o, want) 34 } 35 36 func TestPackageFile_Marshal(t *testing.T) { 37 t.Parallel() 38 testJSONMarshal(t, &PackageFile{}, "{}") 39 40 o := &PackageFile{ 41 DownloadURL: Ptr("durl"), 42 ID: Ptr(int64(1)), 43 Name: Ptr("name"), 44 SHA256: Ptr("sha256"), 45 SHA1: Ptr("sha1"), 46 MD5: Ptr("md5"), 47 ContentType: Ptr("ct"), 48 State: Ptr("state"), 49 Author: &User{ 50 Login: Ptr("l"), 51 ID: Ptr(int64(1)), 52 URL: Ptr("u"), 53 AvatarURL: Ptr("a"), 54 GravatarID: Ptr("g"), 55 Name: Ptr("n"), 56 Company: Ptr("c"), 57 Blog: Ptr("b"), 58 Location: Ptr("l"), 59 Email: Ptr("e"), 60 Hireable: Ptr(true), 61 Bio: Ptr("b"), 62 TwitterUsername: Ptr("t"), 63 PublicRepos: Ptr(1), 64 Followers: Ptr(1), 65 Following: Ptr(1), 66 CreatedAt: &Timestamp{referenceTime}, 67 SuspendedAt: &Timestamp{referenceTime}, 68 }, 69 Size: Ptr(int64(1)), 70 CreatedAt: &Timestamp{referenceTime}, 71 UpdatedAt: &Timestamp{referenceTime}, 72 } 73 74 want := `{ 75 "download_url": "durl", 76 "id": 1, 77 "name": "name", 78 "sha256": "sha256", 79 "sha1": "sha1", 80 "md5": "md5", 81 "content_type": "ct", 82 "state": "state", 83 "author": { 84 "login": "l", 85 "id": 1, 86 "avatar_url": "a", 87 "gravatar_id": "g", 88 "name": "n", 89 "company": "c", 90 "blog": "b", 91 "location": "l", 92 "email": "e", 93 "hireable": true, 94 "bio": "b", 95 "twitter_username": "t", 96 "public_repos": 1, 97 "followers": 1, 98 "following": 1, 99 "created_at": ` + referenceTimeStr + `, 100 "suspended_at": ` + referenceTimeStr + `, 101 "url": "u" 102 }, 103 "size": 1, 104 "created_at": ` + referenceTimeStr + `, 105 "updated_at": ` + referenceTimeStr + ` 106 }` 107 108 testJSONMarshal(t, o, want) 109 } 110 111 func TestPackageRelease_Marshal(t *testing.T) { 112 t.Parallel() 113 testJSONMarshal(t, &PackageRelease{}, "{}") 114 115 o := &PackageRelease{ 116 URL: Ptr("url"), 117 HTMLURL: Ptr("hurl"), 118 ID: Ptr(int64(1)), 119 TagName: Ptr("tn"), 120 TargetCommitish: Ptr("tcs"), 121 Name: Ptr("name"), 122 Draft: Ptr(true), 123 Author: &User{ 124 Login: Ptr("l"), 125 ID: Ptr(int64(1)), 126 URL: Ptr("u"), 127 AvatarURL: Ptr("a"), 128 GravatarID: Ptr("g"), 129 Name: Ptr("n"), 130 Company: Ptr("c"), 131 Blog: Ptr("b"), 132 Location: Ptr("l"), 133 Email: Ptr("e"), 134 Hireable: Ptr(true), 135 Bio: Ptr("b"), 136 TwitterUsername: Ptr("t"), 137 PublicRepos: Ptr(1), 138 Followers: Ptr(1), 139 Following: Ptr(1), 140 CreatedAt: &Timestamp{referenceTime}, 141 SuspendedAt: &Timestamp{referenceTime}, 142 }, 143 Prerelease: Ptr(true), 144 CreatedAt: &Timestamp{referenceTime}, 145 PublishedAt: &Timestamp{referenceTime}, 146 } 147 148 want := `{ 149 "url": "url", 150 "html_url": "hurl", 151 "id": 1, 152 "tag_name": "tn", 153 "target_commitish": "tcs", 154 "name": "name", 155 "draft": true, 156 "author": { 157 "login": "l", 158 "id": 1, 159 "avatar_url": "a", 160 "gravatar_id": "g", 161 "name": "n", 162 "company": "c", 163 "blog": "b", 164 "location": "l", 165 "email": "e", 166 "hireable": true, 167 "bio": "b", 168 "twitter_username": "t", 169 "public_repos": 1, 170 "followers": 1, 171 "following": 1, 172 "created_at": ` + referenceTimeStr + `, 173 "suspended_at": ` + referenceTimeStr + `, 174 "url": "u" 175 }, 176 "prerelease": true, 177 "created_at": ` + referenceTimeStr + `, 178 "published_at": ` + referenceTimeStr + ` 179 }` 180 181 testJSONMarshal(t, o, want) 182 } 183 184 func TestPackageVersion_Marshal(t *testing.T) { 185 t.Parallel() 186 testJSONMarshal(t, &PackageVersion{}, "{}") 187 188 metadata, _ := json.Marshal([]string{"a", "b"}) 189 190 o := &PackageVersion{ 191 ID: Ptr(int64(1)), 192 Name: Ptr("n"), 193 URL: Ptr("url"), 194 PackageHTMLURL: Ptr("phurl"), 195 License: Ptr("l"), 196 Description: Ptr("d"), 197 CreatedAt: &Timestamp{referenceTime}, 198 UpdatedAt: &Timestamp{referenceTime}, 199 Metadata: metadata, 200 Version: Ptr("ver"), 201 Summary: Ptr("sum"), 202 Body: json.RawMessage(`"body"`), 203 BodyHTML: Ptr("btnhtml"), 204 Release: &PackageRelease{ 205 URL: Ptr("url"), 206 HTMLURL: Ptr("hurl"), 207 ID: Ptr(int64(1)), 208 TagName: Ptr("tn"), 209 TargetCommitish: Ptr("tcs"), 210 Name: Ptr("name"), 211 Draft: Ptr(true), 212 Author: &User{ 213 Login: Ptr("l"), 214 ID: Ptr(int64(1)), 215 URL: Ptr("u"), 216 AvatarURL: Ptr("a"), 217 GravatarID: Ptr("g"), 218 Name: Ptr("n"), 219 Company: Ptr("c"), 220 Blog: Ptr("b"), 221 Location: Ptr("l"), 222 Email: Ptr("e"), 223 Hireable: Ptr(true), 224 Bio: Ptr("b"), 225 TwitterUsername: Ptr("t"), 226 PublicRepos: Ptr(1), 227 Followers: Ptr(1), 228 Following: Ptr(1), 229 CreatedAt: &Timestamp{referenceTime}, 230 SuspendedAt: &Timestamp{referenceTime}, 231 }, 232 Prerelease: Ptr(true), 233 CreatedAt: &Timestamp{referenceTime}, 234 PublishedAt: &Timestamp{referenceTime}, 235 }, 236 Manifest: Ptr("mani"), 237 HTMLURL: Ptr("hurl"), 238 TagName: Ptr("tn"), 239 TargetCommitish: Ptr("tcs"), 240 TargetOID: Ptr("tid"), 241 Draft: Ptr(true), 242 Prerelease: Ptr(true), 243 ContainerMetadata: &PackageEventContainerMetadata{ 244 Labels: map[string]any{"l1": true, "l2": "a"}, 245 }, 246 DockerMetadata: []interface{}{"a", "b"}, 247 NPMMetadata: Ptr(PackageNPMMetadata{ 248 Name: Ptr("n"), 249 }), 250 NugetMetadata: []*PackageNugetMetadata{ 251 {Name: Ptr("n")}, 252 }, 253 RubyMetadata: map[string]any{"k1": "v1", "k2": "v2"}, 254 PackageFiles: []*PackageFile{ 255 { 256 DownloadURL: Ptr("durl"), 257 ID: Ptr(int64(1)), 258 Name: Ptr("name"), 259 SHA256: Ptr("sha256"), 260 SHA1: Ptr("sha1"), 261 MD5: Ptr("md5"), 262 ContentType: Ptr("ct"), 263 State: Ptr("state"), 264 Author: &User{ 265 Login: Ptr("l"), 266 ID: Ptr(int64(1)), 267 URL: Ptr("u"), 268 AvatarURL: Ptr("a"), 269 GravatarID: Ptr("g"), 270 Name: Ptr("n"), 271 Company: Ptr("c"), 272 Blog: Ptr("b"), 273 Location: Ptr("l"), 274 Email: Ptr("e"), 275 Hireable: Ptr(true), 276 Bio: Ptr("b"), 277 TwitterUsername: Ptr("t"), 278 PublicRepos: Ptr(1), 279 Followers: Ptr(1), 280 Following: Ptr(1), 281 CreatedAt: &Timestamp{referenceTime}, 282 SuspendedAt: &Timestamp{referenceTime}, 283 }, 284 Size: Ptr(int64(1)), 285 CreatedAt: &Timestamp{referenceTime}, 286 UpdatedAt: &Timestamp{referenceTime}, 287 }, 288 }, 289 PackageURL: Ptr("purl"), 290 Author: &User{ 291 Login: Ptr("l"), 292 ID: Ptr(int64(1)), 293 URL: Ptr("u"), 294 AvatarURL: Ptr("a"), 295 GravatarID: Ptr("g"), 296 Name: Ptr("n"), 297 Company: Ptr("c"), 298 Blog: Ptr("b"), 299 Location: Ptr("l"), 300 Email: Ptr("e"), 301 Hireable: Ptr(true), 302 Bio: Ptr("b"), 303 TwitterUsername: Ptr("t"), 304 PublicRepos: Ptr(1), 305 Followers: Ptr(1), 306 Following: Ptr(1), 307 CreatedAt: &Timestamp{referenceTime}, 308 SuspendedAt: &Timestamp{referenceTime}, 309 }, 310 SourceURL: Ptr("surl"), 311 InstallationCommand: Ptr("ic"), 312 DeletedAt: &Timestamp{referenceTime}, 313 } 314 315 want := `{ 316 "id": 1, 317 "name": "n", 318 "url": "url", 319 "package_html_url": "phurl", 320 "license": "l", 321 "description": "d", 322 "created_at": ` + referenceTimeStr + `, 323 "updated_at": ` + referenceTimeStr + `, 324 "metadata": ["a", "b"], 325 "version": "ver", 326 "summary": "sum", 327 "body": "body", 328 "body_html": "btnhtml", 329 "release": { 330 "url": "url", 331 "html_url": "hurl", 332 "id": 1, 333 "tag_name": "tn", 334 "target_commitish": "tcs", 335 "name": "name", 336 "draft": true, 337 "author": { 338 "login": "l", 339 "id": 1, 340 "avatar_url": "a", 341 "gravatar_id": "g", 342 "name": "n", 343 "company": "c", 344 "blog": "b", 345 "location": "l", 346 "email": "e", 347 "hireable": true, 348 "bio": "b", 349 "twitter_username": "t", 350 "public_repos": 1, 351 "followers": 1, 352 "following": 1, 353 "created_at": ` + referenceTimeStr + `, 354 "suspended_at": ` + referenceTimeStr + `, 355 "url": "u" 356 }, 357 "prerelease": true, 358 "created_at": ` + referenceTimeStr + `, 359 "published_at": ` + referenceTimeStr + ` 360 }, 361 "manifest": "mani", 362 "html_url": "hurl", 363 "tag_name": "tn", 364 "target_commitish": "tcs", 365 "target_oid": "tid", 366 "draft": true, 367 "prerelease": true, 368 "container_metadata": { 369 "labels": { 370 "l1": true, 371 "l2": "a" 372 } 373 }, 374 "docker_metadata": ["a", "b"], 375 "npm_metadata": { 376 "name": "n" 377 }, 378 "nuget_metadata": [{"name": "n"}], 379 "ruby_metadata": { 380 "k1": "v1", 381 "k2": "v2" 382 }, 383 "package_files": [ 384 { 385 "download_url": "durl", 386 "id": 1, 387 "name": "name", 388 "sha256": "sha256", 389 "sha1": "sha1", 390 "md5": "md5", 391 "content_type": "ct", 392 "state": "state", 393 "author": { 394 "login": "l", 395 "id": 1, 396 "avatar_url": "a", 397 "gravatar_id": "g", 398 "name": "n", 399 "company": "c", 400 "blog": "b", 401 "location": "l", 402 "email": "e", 403 "hireable": true, 404 "bio": "b", 405 "twitter_username": "t", 406 "public_repos": 1, 407 "followers": 1, 408 "following": 1, 409 "created_at": ` + referenceTimeStr + `, 410 "suspended_at": ` + referenceTimeStr + `, 411 "url": "u" 412 }, 413 "size": 1, 414 "created_at": ` + referenceTimeStr + `, 415 "updated_at": ` + referenceTimeStr + ` 416 } 417 ], 418 "package_url": "purl", 419 "author": { 420 "login": "l", 421 "id": 1, 422 "avatar_url": "a", 423 "gravatar_id": "g", 424 "name": "n", 425 "company": "c", 426 "blog": "b", 427 "location": "l", 428 "email": "e", 429 "hireable": true, 430 "bio": "b", 431 "twitter_username": "t", 432 "public_repos": 1, 433 "followers": 1, 434 "following": 1, 435 "created_at": ` + referenceTimeStr + `, 436 "suspended_at": ` + referenceTimeStr + `, 437 "url": "u" 438 }, 439 "source_url": "surl", 440 "installation_command": "ic", 441 "deleted_at": ` + referenceTimeStr + ` 442 }` 443 444 testJSONMarshal(t, o, want) 445 } 446 447 func TestPackageVersion_GetBody(t *testing.T) { 448 t.Parallel() 449 450 tests := map[string]struct { 451 pv *PackageVersion 452 wantValue string 453 wantOk bool 454 }{ 455 "pv nil": { 456 pv: nil, 457 wantValue: "", 458 wantOk: false, 459 }, 460 "body nil": { 461 pv: &PackageVersion{ 462 Body: nil, 463 }, 464 wantValue: "", 465 wantOk: false, 466 }, 467 "invalid body": { 468 pv: &PackageVersion{ 469 Body: json.RawMessage(`{ 470 "repository": { 471 "name": "n" 472 }, 473 "info": { 474 "type": "t" 475 } 476 }`), 477 }, 478 wantValue: "", 479 wantOk: false, 480 }, 481 "valid body": { 482 pv: &PackageVersion{ 483 Body: json.RawMessage(`"body"`), 484 }, 485 wantValue: "body", 486 wantOk: true, 487 }, 488 } 489 490 for name, test := range tests { 491 t.Run(name, func(t *testing.T) { 492 t.Parallel() 493 494 resValue, resOk := test.pv.GetBody() 495 496 if resValue != test.wantValue || resOk != test.wantOk { 497 t.Errorf("PackageVersion.GetBody() - got: %v, %v; want: %v, %v", resValue, resOk, test.wantValue, test.wantOk) 498 } 499 }) 500 } 501 } 502 503 func TestPackageVersion_GetBodyAsPackageVersionBody(t *testing.T) { 504 t.Parallel() 505 506 tests := map[string]struct { 507 pv *PackageVersion 508 wantValue *PackageVersionBody 509 wantOk bool 510 }{ 511 "pv nil": { 512 pv: nil, 513 wantValue: nil, 514 wantOk: false, 515 }, 516 "body nil": { 517 pv: &PackageVersion{ 518 Body: nil, 519 }, 520 wantValue: nil, 521 wantOk: false, 522 }, 523 "invalid body": { 524 pv: &PackageVersion{ 525 Body: json.RawMessage(`"body"`), 526 }, 527 wantValue: nil, 528 wantOk: false, 529 }, 530 "valid body": { 531 pv: &PackageVersion{ 532 Body: json.RawMessage(`{ 533 "repository": { 534 "name": "n" 535 }, 536 "info": { 537 "type": "t" 538 } 539 }`), 540 }, 541 wantValue: &PackageVersionBody{ 542 Repo: &Repository{ 543 Name: Ptr("n"), 544 }, 545 Info: &PackageVersionBodyInfo{ 546 Type: Ptr("t"), 547 }, 548 }, 549 wantOk: true, 550 }, 551 } 552 553 for name, test := range tests { 554 t.Run(name, func(t *testing.T) { 555 t.Parallel() 556 557 resValue, resOk := test.pv.GetBodyAsPackageVersionBody() 558 559 if !reflect.DeepEqual(resValue, test.wantValue) || resOk != test.wantOk { 560 t.Errorf("PackageVersion.GetBodyAsPackageVersionBody() - got: %v, %v; want: %v, %v", resValue, resOk, test.wantValue, test.wantOk) 561 } 562 }) 563 } 564 } 565 566 func TestPackageVersion_GetMetadata(t *testing.T) { 567 t.Parallel() 568 569 tests := map[string]struct { 570 pv *PackageVersion 571 wantValue *PackageMetadata 572 wantOk bool 573 }{ 574 "pv nil": { 575 pv: nil, 576 wantValue: nil, 577 wantOk: false, 578 }, 579 "metadata nil": { 580 pv: &PackageVersion{ 581 Metadata: nil, 582 }, 583 wantValue: nil, 584 wantOk: false, 585 }, 586 "invalid metadata": { 587 pv: &PackageVersion{ 588 Metadata: json.RawMessage(`[]`), 589 }, 590 wantValue: nil, 591 wantOk: false, 592 }, 593 "valid metadata": { 594 pv: &PackageVersion{ 595 Metadata: json.RawMessage(`{ 596 "package_type": "container", 597 "container": { 598 "tags": ["a"] 599 } 600 }`), 601 }, 602 wantValue: &PackageMetadata{ 603 PackageType: Ptr("container"), 604 Container: &PackageContainerMetadata{ 605 Tags: []string{"a"}, 606 }, 607 }, 608 wantOk: true, 609 }, 610 } 611 612 for name, test := range tests { 613 t.Run(name, func(t *testing.T) { 614 t.Parallel() 615 616 resValue, resOk := test.pv.GetMetadata() 617 618 if !reflect.DeepEqual(resValue, test.wantValue) || resOk != test.wantOk { 619 t.Errorf("PackageVersion.GetMetadata() - got: %v, %v; want: %v, %v", resValue, resOk, test.wantValue, test.wantOk) 620 } 621 }) 622 } 623 } 624 625 func TestPackageVersion_GetRawMetadata(t *testing.T) { 626 t.Parallel() 627 628 tests := map[string]struct { 629 pv *PackageVersion 630 want json.RawMessage 631 }{ 632 "pv nil": { 633 pv: nil, 634 want: nil, 635 }, 636 "metadata nil": { 637 pv: &PackageVersion{ 638 Metadata: nil, 639 }, 640 want: json.RawMessage{}, 641 }, 642 "valid metadata": { 643 pv: &PackageVersion{ 644 Metadata: json.RawMessage(`"a"`), 645 }, 646 want: json.RawMessage(`"a"`), 647 }, 648 } 649 650 for name, test := range tests { 651 t.Run(name, func(t *testing.T) { 652 t.Parallel() 653 654 res := test.pv.GetRawMetadata() 655 656 if string(res) != string(test.want) { 657 t.Errorf("PackageVersion.GetRawMetadata() - got: %v; want: %v", res, test.want) 658 } 659 }) 660 } 661 } 662 663 func TestPackage_Marshal(t *testing.T) { 664 t.Parallel() 665 testJSONMarshal(t, &Package{}, "{}") 666 667 o := &Package{ 668 ID: Ptr(int64(1)), 669 Name: Ptr("name"), 670 PackageType: Ptr("pt"), 671 HTMLURL: Ptr("hurl"), 672 Visibility: Ptr("private"), 673 Owner: &User{ 674 Login: Ptr("l"), 675 ID: Ptr(int64(1)), 676 URL: Ptr("u"), 677 AvatarURL: Ptr("a"), 678 GravatarID: Ptr("g"), 679 Name: Ptr("n"), 680 Company: Ptr("c"), 681 Blog: Ptr("b"), 682 Location: Ptr("l"), 683 Email: Ptr("e"), 684 Hireable: Ptr(true), 685 Bio: Ptr("b"), 686 TwitterUsername: Ptr("t"), 687 PublicRepos: Ptr(1), 688 Followers: Ptr(1), 689 Following: Ptr(1), 690 CreatedAt: &Timestamp{referenceTime}, 691 SuspendedAt: &Timestamp{referenceTime}, 692 }, 693 Repository: &Repository{ID: Ptr(int64(1))}, 694 CreatedAt: &Timestamp{referenceTime}, 695 UpdatedAt: &Timestamp{referenceTime}, 696 Namespace: Ptr("n"), 697 Description: Ptr("d"), 698 Ecosystem: Ptr("e"), 699 PackageVersion: &PackageVersion{ 700 ID: Ptr(int64(1)), 701 Version: Ptr("ver"), 702 Summary: Ptr("sum"), 703 Body: json.RawMessage(`"body"`), 704 BodyHTML: Ptr("btnhtml"), 705 Release: &PackageRelease{ 706 URL: Ptr("url"), 707 HTMLURL: Ptr("hurl"), 708 ID: Ptr(int64(1)), 709 TagName: Ptr("tn"), 710 TargetCommitish: Ptr("tcs"), 711 Name: Ptr("name"), 712 Draft: Ptr(true), 713 Author: &User{ 714 Login: Ptr("l"), 715 ID: Ptr(int64(1)), 716 URL: Ptr("u"), 717 AvatarURL: Ptr("a"), 718 GravatarID: Ptr("g"), 719 Name: Ptr("n"), 720 Company: Ptr("c"), 721 Blog: Ptr("b"), 722 Location: Ptr("l"), 723 Email: Ptr("e"), 724 Hireable: Ptr(true), 725 Bio: Ptr("b"), 726 TwitterUsername: Ptr("t"), 727 PublicRepos: Ptr(1), 728 Followers: Ptr(1), 729 Following: Ptr(1), 730 CreatedAt: &Timestamp{referenceTime}, 731 SuspendedAt: &Timestamp{referenceTime}, 732 }, 733 Prerelease: Ptr(true), 734 CreatedAt: &Timestamp{referenceTime}, 735 PublishedAt: &Timestamp{referenceTime}, 736 }, 737 Manifest: Ptr("mani"), 738 HTMLURL: Ptr("hurl"), 739 TagName: Ptr("tn"), 740 TargetCommitish: Ptr("tcs"), 741 TargetOID: Ptr("tid"), 742 Draft: Ptr(true), 743 Prerelease: Ptr(true), 744 CreatedAt: &Timestamp{referenceTime}, 745 UpdatedAt: &Timestamp{referenceTime}, 746 PackageFiles: []*PackageFile{ 747 { 748 DownloadURL: Ptr("durl"), 749 ID: Ptr(int64(1)), 750 Name: Ptr("name"), 751 SHA256: Ptr("sha256"), 752 SHA1: Ptr("sha1"), 753 MD5: Ptr("md5"), 754 ContentType: Ptr("ct"), 755 State: Ptr("state"), 756 Author: &User{ 757 Login: Ptr("l"), 758 ID: Ptr(int64(1)), 759 URL: Ptr("u"), 760 AvatarURL: Ptr("a"), 761 GravatarID: Ptr("g"), 762 Name: Ptr("n"), 763 Company: Ptr("c"), 764 Blog: Ptr("b"), 765 Location: Ptr("l"), 766 Email: Ptr("e"), 767 Hireable: Ptr(true), 768 Bio: Ptr("b"), 769 TwitterUsername: Ptr("t"), 770 PublicRepos: Ptr(1), 771 Followers: Ptr(1), 772 Following: Ptr(1), 773 CreatedAt: &Timestamp{referenceTime}, 774 SuspendedAt: &Timestamp{referenceTime}, 775 }, 776 Size: Ptr(int64(1)), 777 CreatedAt: &Timestamp{referenceTime}, 778 UpdatedAt: &Timestamp{referenceTime}, 779 }, 780 }, 781 Author: &User{ 782 Login: Ptr("l"), 783 ID: Ptr(int64(1)), 784 URL: Ptr("u"), 785 AvatarURL: Ptr("a"), 786 GravatarID: Ptr("g"), 787 Name: Ptr("n"), 788 Company: Ptr("c"), 789 Blog: Ptr("b"), 790 Location: Ptr("l"), 791 Email: Ptr("e"), 792 Hireable: Ptr(true), 793 Bio: Ptr("b"), 794 TwitterUsername: Ptr("t"), 795 PublicRepos: Ptr(1), 796 Followers: Ptr(1), 797 Following: Ptr(1), 798 CreatedAt: &Timestamp{referenceTime}, 799 SuspendedAt: &Timestamp{referenceTime}, 800 }, 801 InstallationCommand: Ptr("ic"), 802 }, 803 Registry: &PackageRegistry{ 804 AboutURL: Ptr("aurl"), 805 Name: Ptr("name"), 806 Type: Ptr("type"), 807 URL: Ptr("url"), 808 Vendor: Ptr("vendor"), 809 }, 810 URL: Ptr("url"), 811 VersionCount: Ptr(int64(1)), 812 } 813 814 want := `{ 815 "id": 1, 816 "name": "name", 817 "package_type": "pt", 818 "html_url": "hurl", 819 "visibility": "private", 820 "owner": { 821 "login": "l", 822 "id": 1, 823 "avatar_url": "a", 824 "gravatar_id": "g", 825 "name": "n", 826 "company": "c", 827 "blog": "b", 828 "location": "l", 829 "email": "e", 830 "hireable": true, 831 "bio": "b", 832 "twitter_username": "t", 833 "public_repos": 1, 834 "followers": 1, 835 "following": 1, 836 "created_at": ` + referenceTimeStr + `, 837 "suspended_at": ` + referenceTimeStr + `, 838 "url": "u" 839 }, 840 "repository": { 841 "id": 1 842 }, 843 "created_at": ` + referenceTimeStr + `, 844 "updated_at": ` + referenceTimeStr + `, 845 "namespace": "n", 846 "description": "d", 847 "ecosystem": "e", 848 "package_version": { 849 "id": 1, 850 "version": "ver", 851 "summary": "sum", 852 "body": "body", 853 "body_html": "btnhtml", 854 "release": { 855 "url": "url", 856 "html_url": "hurl", 857 "id": 1, 858 "tag_name": "tn", 859 "target_commitish": "tcs", 860 "name": "name", 861 "draft": true, 862 "author": { 863 "login": "l", 864 "id": 1, 865 "avatar_url": "a", 866 "gravatar_id": "g", 867 "name": "n", 868 "company": "c", 869 "blog": "b", 870 "location": "l", 871 "email": "e", 872 "hireable": true, 873 "bio": "b", 874 "twitter_username": "t", 875 "public_repos": 1, 876 "followers": 1, 877 "following": 1, 878 "created_at": ` + referenceTimeStr + `, 879 "suspended_at": ` + referenceTimeStr + `, 880 "url": "u" 881 }, 882 "prerelease": true, 883 "created_at": ` + referenceTimeStr + `, 884 "published_at": ` + referenceTimeStr + ` 885 }, 886 "manifest": "mani", 887 "html_url": "hurl", 888 "tag_name": "tn", 889 "target_commitish": "tcs", 890 "target_oid": "tid", 891 "draft": true, 892 "prerelease": true, 893 "created_at": ` + referenceTimeStr + `, 894 "updated_at": ` + referenceTimeStr + `, 895 "package_files": [ 896 { 897 "download_url": "durl", 898 "id": 1, 899 "name": "name", 900 "sha256": "sha256", 901 "sha1": "sha1", 902 "md5": "md5", 903 "content_type": "ct", 904 "state": "state", 905 "author": { 906 "login": "l", 907 "id": 1, 908 "avatar_url": "a", 909 "gravatar_id": "g", 910 "name": "n", 911 "company": "c", 912 "blog": "b", 913 "location": "l", 914 "email": "e", 915 "hireable": true, 916 "bio": "b", 917 "twitter_username": "t", 918 "public_repos": 1, 919 "followers": 1, 920 "following": 1, 921 "created_at": ` + referenceTimeStr + `, 922 "suspended_at": ` + referenceTimeStr + `, 923 "url": "u" 924 }, 925 "size": 1, 926 "created_at": ` + referenceTimeStr + `, 927 "updated_at": ` + referenceTimeStr + ` 928 } 929 ], 930 "author": { 931 "login": "l", 932 "id": 1, 933 "avatar_url": "a", 934 "gravatar_id": "g", 935 "name": "n", 936 "company": "c", 937 "blog": "b", 938 "location": "l", 939 "email": "e", 940 "hireable": true, 941 "bio": "b", 942 "twitter_username": "t", 943 "public_repos": 1, 944 "followers": 1, 945 "following": 1, 946 "created_at": ` + referenceTimeStr + `, 947 "suspended_at": ` + referenceTimeStr + `, 948 "url": "u" 949 }, 950 "installation_command": "ic" 951 }, 952 "registry": { 953 "about_url": "aurl", 954 "name": "name", 955 "type": "type", 956 "url": "url", 957 "vendor": "vendor" 958 }, 959 "url": "url", 960 "version_count": 1 961 }` 962 963 testJSONMarshal(t, o, want) 964 } 965 966 func TestPackageMetadata_Marshal(t *testing.T) { 967 t.Parallel() 968 testJSONMarshal(t, &PackageMetadata{}, "{}") 969 970 o := &PackageMetadata{ 971 PackageType: Ptr("pt"), 972 Container: Ptr(PackageContainerMetadata{ 973 Tags: []string{"a"}, 974 }), 975 } 976 977 want := `{ 978 "package_type": "pt", 979 "container": { 980 "tags": ["a"] 981 } 982 }` 983 984 testJSONMarshal(t, o, want) 985 } 986 987 func TestPackageContainerMetadata_Marshal(t *testing.T) { 988 t.Parallel() 989 testJSONMarshal(t, &PackageContainerMetadata{}, "{}") 990 991 o := &PackageContainerMetadata{ 992 Tags: []string{"a", "b"}, 993 } 994 995 want := `{ 996 "tags": ["a","b"] 997 }` 998 999 testJSONMarshal(t, o, want) 1000 } 1001 1002 func TestPackageVersionBody_Marshal(t *testing.T) { 1003 t.Parallel() 1004 testJSONMarshal(t, &PackageVersionBody{}, "{}") 1005 1006 o := &PackageVersionBody{ 1007 Repo: Ptr(Repository{ 1008 ID: Ptr(int64(1)), 1009 }), 1010 Info: Ptr(PackageVersionBodyInfo{ 1011 Type: Ptr("t"), 1012 }), 1013 } 1014 1015 want := `{ 1016 "repository": { 1017 "id": 1 1018 }, 1019 "info": { 1020 "type": "t" 1021 } 1022 }` 1023 1024 testJSONMarshal(t, o, want) 1025 } 1026 1027 func TestPackageVersionBodyInfo_Marshal(t *testing.T) { 1028 t.Parallel() 1029 testJSONMarshal(t, &PackageVersionBodyInfo{}, "{}") 1030 1031 o := &PackageVersionBodyInfo{ 1032 Type: Ptr("t"), 1033 OID: Ptr("o"), 1034 Mode: Ptr(int64(1)), 1035 Name: Ptr("n"), 1036 Path: Ptr("p"), 1037 Size: Ptr(int64(1)), 1038 Collection: Ptr(true), 1039 } 1040 1041 want := `{ 1042 "type": "t", 1043 "oid": "o", 1044 "mode": 1, 1045 "name": "n", 1046 "path": "p", 1047 "size": 1, 1048 "collection": true 1049 }` 1050 1051 testJSONMarshal(t, o, want) 1052 } 1053 1054 func TestPackageEventContainerMetadata_Marshal(t *testing.T) { 1055 t.Parallel() 1056 testJSONMarshal(t, &PackageContainerMetadata{}, "{}") 1057 1058 o := &PackageEventContainerMetadata{ 1059 Labels: map[string]any{ 1060 "k": "v", 1061 }, 1062 Manifest: map[string]any{ 1063 "k": 1, 1064 }, 1065 Tag: &PackageEventContainerMetadataTag{ 1066 Name: Ptr("n"), 1067 Digest: Ptr("d"), 1068 }, 1069 } 1070 1071 want := `{ 1072 "labels": { 1073 "k": "v" 1074 }, 1075 "manifest": { 1076 "k": 1 1077 }, 1078 "tag": { 1079 "name": "n", 1080 "digest": "d" 1081 } 1082 }` 1083 1084 testJSONMarshal(t, o, want) 1085 } 1086 1087 func TestPackageEventContainerMetadataTag_Marshal(t *testing.T) { 1088 t.Parallel() 1089 1090 testJSONMarshal(t, &PackageEventContainerMetadataTag{}, "{}") 1091 1092 o := &PackageEventContainerMetadataTag{ 1093 Name: Ptr("n"), 1094 Digest: Ptr("d"), 1095 } 1096 1097 want := `{ 1098 "name": "n", 1099 "digest": "d" 1100 }` 1101 1102 testJSONMarshal(t, o, want) 1103 } 1104 1105 func TestPackageNugetMetadata_Marshal(t *testing.T) { 1106 t.Parallel() 1107 1108 o, _ := json.Marshal(map[string]string{ 1109 "k1": "v1", 1110 "k2": "v2", 1111 }) 1112 1113 tests := map[string]struct { 1114 input *PackageNugetMetadata 1115 want string 1116 }{ 1117 "zero": { 1118 input: &PackageNugetMetadata{}, 1119 want: "{}", 1120 }, 1121 "string": { 1122 input: &PackageNugetMetadata{ 1123 ID: json.RawMessage(`1`), 1124 Name: Ptr("n"), 1125 Value: json.RawMessage(`"s"`), 1126 }, 1127 want: `{ 1128 "id": 1, 1129 "name": "n", 1130 "value": "s" 1131 }`, 1132 }, 1133 "int": { 1134 input: &PackageNugetMetadata{ 1135 ID: json.RawMessage(`1`), 1136 Name: Ptr("n"), 1137 Value: json.RawMessage(`1`), 1138 }, 1139 want: `{ 1140 "id": 1, 1141 "name": "n", 1142 "value": 1 1143 }`, 1144 }, 1145 "object": { 1146 input: &PackageNugetMetadata{ 1147 ID: json.RawMessage(`1`), 1148 Name: Ptr("n"), 1149 Value: o, 1150 }, 1151 want: `{ 1152 "id": 1, 1153 "name": "n", 1154 "value": { 1155 "k1": "v1", 1156 "k2": "v2" 1157 } 1158 }`, 1159 }, 1160 } 1161 1162 for name, test := range tests { 1163 t.Run(name, func(t *testing.T) { 1164 t.Parallel() 1165 testJSONMarshal(t, test.input, test.want) 1166 }) 1167 } 1168 } 1169 1170 func TestPackageNPMMetadata_Marshal(t *testing.T) { 1171 t.Parallel() 1172 1173 tests := map[string]struct { 1174 input *PackageNPMMetadata 1175 want string 1176 }{ 1177 "zero": { 1178 input: &PackageNPMMetadata{}, 1179 want: "{}", 1180 }, 1181 "string": { 1182 input: &PackageNPMMetadata{ 1183 Name: Ptr("n"), 1184 Version: Ptr("v"), 1185 NPMUser: Ptr("nu"), 1186 Description: Ptr("d"), 1187 GitHead: Ptr("gh"), 1188 Homepage: Ptr("h"), 1189 License: Ptr("l"), 1190 Main: Ptr("m"), 1191 ID: Ptr("id"), 1192 NodeVersion: Ptr("nv"), 1193 NPMVersion: Ptr("npmv"), 1194 Readme: Ptr("r"), 1195 InstallationCommand: Ptr("ic"), 1196 CommitOID: Ptr("coid"), 1197 HasShrinkwrap: Ptr(true), 1198 PublishedViaActions: Ptr(true), 1199 ReleaseID: Ptr(int64(1)), 1200 DeletedByID: Ptr(int64(1)), 1201 Author: map[string]string{"k1": "v1"}, 1202 Bugs: map[string]string{"k1": "v1"}, 1203 Dependencies: map[string]string{"k1": "v1"}, 1204 DevDependencies: map[string]string{"k1": "v1"}, 1205 PeerDependencies: map[string]string{"k1": "v1"}, 1206 OptionalDependencies: map[string]string{"k1": "v1"}, 1207 Dist: map[string]string{"k1": "v1"}, 1208 Repository: map[string]string{"k1": "v1"}, 1209 Engines: map[string]string{"k1": "v1"}, 1210 Directories: map[string]string{"k1": "v1"}, 1211 Scripts: map[string]interface{}{"k1": 1}, 1212 Bin: map[string]interface{}{"k1": true}, 1213 Man: map[string]interface{}{"k1": "v1"}, 1214 Keywords: []string{"kw1", "kw2"}, 1215 Files: []string{"f1", "f2"}, 1216 OS: []string{"os1", "os2"}, 1217 CPU: []string{"cpu1", "cpu2"}, 1218 Maintainers: []interface{}{"m1", "m2"}, 1219 Contributors: []interface{}{"c1", "c2"}, 1220 }, 1221 want: `{ 1222 "name": "n", 1223 "version": "v", 1224 "npm_user": "nu", 1225 "description": "d", 1226 "git_head": "gh", 1227 "homepage": "h", 1228 "license": "l", 1229 "main": "m", 1230 "ID": "id", 1231 "node_version": "nv", 1232 "npm_version": "npmv", 1233 "readme": "r", 1234 "installation_command": "ic", 1235 "commit_oid": "coid", 1236 "has_shrinkwrap": true, 1237 "published_via_actions": true, 1238 "release_id": 1, 1239 "deleted_by_id": 1, 1240 "author": { 1241 "k1": "v1" 1242 }, 1243 "bugs": { 1244 "k1": "v1" 1245 }, 1246 "dependencies": { 1247 "k1": "v1" 1248 }, 1249 "dev_dependencies": { 1250 "k1": "v1" 1251 }, 1252 "peer_dependencies": { 1253 "k1": "v1" 1254 }, 1255 "optional_dependencies": { 1256 "k1": "v1" 1257 }, 1258 "dist": { 1259 "k1": "v1" 1260 }, 1261 "repository": { 1262 "k1": "v1" 1263 }, 1264 "engines": { 1265 "k1": "v1" 1266 }, 1267 "directories": { 1268 "k1": "v1" 1269 }, 1270 "scripts": { 1271 "k1": 1 1272 }, 1273 "bin": { 1274 "k1": true 1275 }, 1276 "man": { 1277 "k1": "v1" 1278 }, 1279 "keywords": ["kw1", "kw2"], 1280 "files": ["f1", "f2"], 1281 "os": ["os1", "os2"], 1282 "cpu": ["cpu1", "cpu2"], 1283 "maintainers": ["m1", "m2"], 1284 "contributors": ["c1", "c2"] 1285 }`, 1286 }, 1287 } 1288 1289 for name, test := range tests { 1290 t.Run(name, func(t *testing.T) { 1291 t.Parallel() 1292 testJSONMarshal(t, test.input, test.want) 1293 }) 1294 } 1295 }