github.com/google/go-github/v70@v70.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 CreatedAt: &Timestamp{referenceTime}, 694 UpdatedAt: &Timestamp{referenceTime}, 695 Namespace: Ptr("n"), 696 Description: Ptr("d"), 697 Ecosystem: Ptr("e"), 698 PackageVersion: &PackageVersion{ 699 ID: Ptr(int64(1)), 700 Version: Ptr("ver"), 701 Summary: Ptr("sum"), 702 Body: json.RawMessage(`"body"`), 703 BodyHTML: Ptr("btnhtml"), 704 Release: &PackageRelease{ 705 URL: Ptr("url"), 706 HTMLURL: Ptr("hurl"), 707 ID: Ptr(int64(1)), 708 TagName: Ptr("tn"), 709 TargetCommitish: Ptr("tcs"), 710 Name: Ptr("name"), 711 Draft: Ptr(true), 712 Author: &User{ 713 Login: Ptr("l"), 714 ID: Ptr(int64(1)), 715 URL: Ptr("u"), 716 AvatarURL: Ptr("a"), 717 GravatarID: Ptr("g"), 718 Name: Ptr("n"), 719 Company: Ptr("c"), 720 Blog: Ptr("b"), 721 Location: Ptr("l"), 722 Email: Ptr("e"), 723 Hireable: Ptr(true), 724 Bio: Ptr("b"), 725 TwitterUsername: Ptr("t"), 726 PublicRepos: Ptr(1), 727 Followers: Ptr(1), 728 Following: Ptr(1), 729 CreatedAt: &Timestamp{referenceTime}, 730 SuspendedAt: &Timestamp{referenceTime}, 731 }, 732 Prerelease: Ptr(true), 733 CreatedAt: &Timestamp{referenceTime}, 734 PublishedAt: &Timestamp{referenceTime}, 735 }, 736 Manifest: Ptr("mani"), 737 HTMLURL: Ptr("hurl"), 738 TagName: Ptr("tn"), 739 TargetCommitish: Ptr("tcs"), 740 TargetOID: Ptr("tid"), 741 Draft: Ptr(true), 742 Prerelease: Ptr(true), 743 CreatedAt: &Timestamp{referenceTime}, 744 UpdatedAt: &Timestamp{referenceTime}, 745 PackageFiles: []*PackageFile{ 746 { 747 DownloadURL: Ptr("durl"), 748 ID: Ptr(int64(1)), 749 Name: Ptr("name"), 750 SHA256: Ptr("sha256"), 751 SHA1: Ptr("sha1"), 752 MD5: Ptr("md5"), 753 ContentType: Ptr("ct"), 754 State: Ptr("state"), 755 Author: &User{ 756 Login: Ptr("l"), 757 ID: Ptr(int64(1)), 758 URL: Ptr("u"), 759 AvatarURL: Ptr("a"), 760 GravatarID: Ptr("g"), 761 Name: Ptr("n"), 762 Company: Ptr("c"), 763 Blog: Ptr("b"), 764 Location: Ptr("l"), 765 Email: Ptr("e"), 766 Hireable: Ptr(true), 767 Bio: Ptr("b"), 768 TwitterUsername: Ptr("t"), 769 PublicRepos: Ptr(1), 770 Followers: Ptr(1), 771 Following: Ptr(1), 772 CreatedAt: &Timestamp{referenceTime}, 773 SuspendedAt: &Timestamp{referenceTime}, 774 }, 775 Size: Ptr(int64(1)), 776 CreatedAt: &Timestamp{referenceTime}, 777 UpdatedAt: &Timestamp{referenceTime}, 778 }, 779 }, 780 Author: &User{ 781 Login: Ptr("l"), 782 ID: Ptr(int64(1)), 783 URL: Ptr("u"), 784 AvatarURL: Ptr("a"), 785 GravatarID: Ptr("g"), 786 Name: Ptr("n"), 787 Company: Ptr("c"), 788 Blog: Ptr("b"), 789 Location: Ptr("l"), 790 Email: Ptr("e"), 791 Hireable: Ptr(true), 792 Bio: Ptr("b"), 793 TwitterUsername: Ptr("t"), 794 PublicRepos: Ptr(1), 795 Followers: Ptr(1), 796 Following: Ptr(1), 797 CreatedAt: &Timestamp{referenceTime}, 798 SuspendedAt: &Timestamp{referenceTime}, 799 }, 800 InstallationCommand: Ptr("ic"), 801 }, 802 Registry: &PackageRegistry{ 803 AboutURL: Ptr("aurl"), 804 Name: Ptr("name"), 805 Type: Ptr("type"), 806 URL: Ptr("url"), 807 Vendor: Ptr("vendor"), 808 }, 809 URL: Ptr("url"), 810 VersionCount: Ptr(int64(1)), 811 } 812 813 want := `{ 814 "id": 1, 815 "name": "name", 816 "package_type": "pt", 817 "html_url": "hurl", 818 "visibility": "private", 819 "owner": { 820 "login": "l", 821 "id": 1, 822 "avatar_url": "a", 823 "gravatar_id": "g", 824 "name": "n", 825 "company": "c", 826 "blog": "b", 827 "location": "l", 828 "email": "e", 829 "hireable": true, 830 "bio": "b", 831 "twitter_username": "t", 832 "public_repos": 1, 833 "followers": 1, 834 "following": 1, 835 "created_at": ` + referenceTimeStr + `, 836 "suspended_at": ` + referenceTimeStr + `, 837 "url": "u" 838 }, 839 "created_at": ` + referenceTimeStr + `, 840 "updated_at": ` + referenceTimeStr + `, 841 "namespace": "n", 842 "description": "d", 843 "ecosystem": "e", 844 "package_version": { 845 "id": 1, 846 "version": "ver", 847 "summary": "sum", 848 "body": "body", 849 "body_html": "btnhtml", 850 "release": { 851 "url": "url", 852 "html_url": "hurl", 853 "id": 1, 854 "tag_name": "tn", 855 "target_commitish": "tcs", 856 "name": "name", 857 "draft": true, 858 "author": { 859 "login": "l", 860 "id": 1, 861 "avatar_url": "a", 862 "gravatar_id": "g", 863 "name": "n", 864 "company": "c", 865 "blog": "b", 866 "location": "l", 867 "email": "e", 868 "hireable": true, 869 "bio": "b", 870 "twitter_username": "t", 871 "public_repos": 1, 872 "followers": 1, 873 "following": 1, 874 "created_at": ` + referenceTimeStr + `, 875 "suspended_at": ` + referenceTimeStr + `, 876 "url": "u" 877 }, 878 "prerelease": true, 879 "created_at": ` + referenceTimeStr + `, 880 "published_at": ` + referenceTimeStr + ` 881 }, 882 "manifest": "mani", 883 "html_url": "hurl", 884 "tag_name": "tn", 885 "target_commitish": "tcs", 886 "target_oid": "tid", 887 "draft": true, 888 "prerelease": true, 889 "created_at": ` + referenceTimeStr + `, 890 "updated_at": ` + referenceTimeStr + `, 891 "package_files": [ 892 { 893 "download_url": "durl", 894 "id": 1, 895 "name": "name", 896 "sha256": "sha256", 897 "sha1": "sha1", 898 "md5": "md5", 899 "content_type": "ct", 900 "state": "state", 901 "author": { 902 "login": "l", 903 "id": 1, 904 "avatar_url": "a", 905 "gravatar_id": "g", 906 "name": "n", 907 "company": "c", 908 "blog": "b", 909 "location": "l", 910 "email": "e", 911 "hireable": true, 912 "bio": "b", 913 "twitter_username": "t", 914 "public_repos": 1, 915 "followers": 1, 916 "following": 1, 917 "created_at": ` + referenceTimeStr + `, 918 "suspended_at": ` + referenceTimeStr + `, 919 "url": "u" 920 }, 921 "size": 1, 922 "created_at": ` + referenceTimeStr + `, 923 "updated_at": ` + referenceTimeStr + ` 924 } 925 ], 926 "author": { 927 "login": "l", 928 "id": 1, 929 "avatar_url": "a", 930 "gravatar_id": "g", 931 "name": "n", 932 "company": "c", 933 "blog": "b", 934 "location": "l", 935 "email": "e", 936 "hireable": true, 937 "bio": "b", 938 "twitter_username": "t", 939 "public_repos": 1, 940 "followers": 1, 941 "following": 1, 942 "created_at": ` + referenceTimeStr + `, 943 "suspended_at": ` + referenceTimeStr + `, 944 "url": "u" 945 }, 946 "installation_command": "ic" 947 }, 948 "registry": { 949 "about_url": "aurl", 950 "name": "name", 951 "type": "type", 952 "url": "url", 953 "vendor": "vendor" 954 }, 955 "url": "url", 956 "version_count": 1 957 }` 958 959 testJSONMarshal(t, o, want) 960 } 961 962 func TestPackageMetadata_Marshal(t *testing.T) { 963 t.Parallel() 964 testJSONMarshal(t, &PackageMetadata{}, "{}") 965 966 o := &PackageMetadata{ 967 PackageType: Ptr("pt"), 968 Container: Ptr(PackageContainerMetadata{ 969 Tags: []string{"a"}, 970 }), 971 } 972 973 want := `{ 974 "package_type": "pt", 975 "container": { 976 "tags": ["a"] 977 } 978 }` 979 980 testJSONMarshal(t, o, want) 981 } 982 983 func TestPackageContainerMetadata_Marshal(t *testing.T) { 984 t.Parallel() 985 testJSONMarshal(t, &PackageContainerMetadata{}, "{}") 986 987 o := &PackageContainerMetadata{ 988 Tags: []string{"a", "b"}, 989 } 990 991 want := `{ 992 "tags": ["a","b"] 993 }` 994 995 testJSONMarshal(t, o, want) 996 } 997 998 func TestPackageVersionBody_Marshal(t *testing.T) { 999 t.Parallel() 1000 testJSONMarshal(t, &PackageVersionBody{}, "{}") 1001 1002 o := &PackageVersionBody{ 1003 Repo: Ptr(Repository{ 1004 ID: Ptr(int64(1)), 1005 }), 1006 Info: Ptr(PackageVersionBodyInfo{ 1007 Type: Ptr("t"), 1008 }), 1009 } 1010 1011 want := `{ 1012 "repository": { 1013 "id": 1 1014 }, 1015 "info": { 1016 "type": "t" 1017 } 1018 }` 1019 1020 testJSONMarshal(t, o, want) 1021 } 1022 1023 func TestPackageVersionBodyInfo_Marshal(t *testing.T) { 1024 t.Parallel() 1025 testJSONMarshal(t, &PackageVersionBodyInfo{}, "{}") 1026 1027 o := &PackageVersionBodyInfo{ 1028 Type: Ptr("t"), 1029 OID: Ptr("o"), 1030 Mode: Ptr(int64(1)), 1031 Name: Ptr("n"), 1032 Path: Ptr("p"), 1033 Size: Ptr(int64(1)), 1034 Collection: Ptr(true), 1035 } 1036 1037 want := `{ 1038 "type": "t", 1039 "oid": "o", 1040 "mode": 1, 1041 "name": "n", 1042 "path": "p", 1043 "size": 1, 1044 "collection": true 1045 }` 1046 1047 testJSONMarshal(t, o, want) 1048 } 1049 1050 func TestPackageEventContainerMetadata_Marshal(t *testing.T) { 1051 t.Parallel() 1052 testJSONMarshal(t, &PackageContainerMetadata{}, "{}") 1053 1054 o := &PackageEventContainerMetadata{ 1055 Labels: map[string]any{ 1056 "k": "v", 1057 }, 1058 Manifest: map[string]any{ 1059 "k": 1, 1060 }, 1061 Tag: &PackageEventContainerMetadataTag{ 1062 Name: Ptr("n"), 1063 Digest: Ptr("d"), 1064 }, 1065 } 1066 1067 want := `{ 1068 "labels": { 1069 "k": "v" 1070 }, 1071 "manifest": { 1072 "k": 1 1073 }, 1074 "tag": { 1075 "name": "n", 1076 "digest": "d" 1077 } 1078 }` 1079 1080 testJSONMarshal(t, o, want) 1081 } 1082 1083 func TestPackageEventContainerMetadataTag_Marshal(t *testing.T) { 1084 t.Parallel() 1085 1086 testJSONMarshal(t, &PackageEventContainerMetadataTag{}, "{}") 1087 1088 o := &PackageEventContainerMetadataTag{ 1089 Name: Ptr("n"), 1090 Digest: Ptr("d"), 1091 } 1092 1093 want := `{ 1094 "name": "n", 1095 "digest": "d" 1096 }` 1097 1098 testJSONMarshal(t, o, want) 1099 } 1100 1101 func TestPackageNugetMetadata_Marshal(t *testing.T) { 1102 t.Parallel() 1103 1104 o, _ := json.Marshal(map[string]string{ 1105 "k1": "v1", 1106 "k2": "v2", 1107 }) 1108 1109 tests := map[string]struct { 1110 input *PackageNugetMetadata 1111 want string 1112 }{ 1113 "zero": { 1114 input: &PackageNugetMetadata{}, 1115 want: "{}", 1116 }, 1117 "string": { 1118 input: &PackageNugetMetadata{ 1119 ID: json.RawMessage(`1`), 1120 Name: Ptr("n"), 1121 Value: json.RawMessage(`"s"`), 1122 }, 1123 want: `{ 1124 "id": 1, 1125 "name": "n", 1126 "value": "s" 1127 }`, 1128 }, 1129 "int": { 1130 input: &PackageNugetMetadata{ 1131 ID: json.RawMessage(`1`), 1132 Name: Ptr("n"), 1133 Value: json.RawMessage(`1`), 1134 }, 1135 want: `{ 1136 "id": 1, 1137 "name": "n", 1138 "value": 1 1139 }`, 1140 }, 1141 "object": { 1142 input: &PackageNugetMetadata{ 1143 ID: json.RawMessage(`1`), 1144 Name: Ptr("n"), 1145 Value: o, 1146 }, 1147 want: `{ 1148 "id": 1, 1149 "name": "n", 1150 "value": { 1151 "k1": "v1", 1152 "k2": "v2" 1153 } 1154 }`, 1155 }, 1156 } 1157 1158 for name, test := range tests { 1159 t.Run(name, func(t *testing.T) { 1160 t.Parallel() 1161 testJSONMarshal(t, test.input, test.want) 1162 }) 1163 } 1164 } 1165 1166 func TestPackageNPMMetadata_Marshal(t *testing.T) { 1167 t.Parallel() 1168 1169 tests := map[string]struct { 1170 input *PackageNPMMetadata 1171 want string 1172 }{ 1173 "zero": { 1174 input: &PackageNPMMetadata{}, 1175 want: "{}", 1176 }, 1177 "string": { 1178 input: &PackageNPMMetadata{ 1179 Name: Ptr("n"), 1180 Version: Ptr("v"), 1181 NPMUser: Ptr("nu"), 1182 Description: Ptr("d"), 1183 GitHead: Ptr("gh"), 1184 Homepage: Ptr("h"), 1185 License: Ptr("l"), 1186 Main: Ptr("m"), 1187 ID: Ptr("id"), 1188 NodeVersion: Ptr("nv"), 1189 NPMVersion: Ptr("npmv"), 1190 Readme: Ptr("r"), 1191 InstallationCommand: Ptr("ic"), 1192 CommitOID: Ptr("coid"), 1193 HasShrinkwrap: Ptr(true), 1194 PublishedViaActions: Ptr(true), 1195 ReleaseID: Ptr(int64(1)), 1196 DeletedByID: Ptr(int64(1)), 1197 Author: map[string]string{"k1": "v1"}, 1198 Bugs: map[string]string{"k1": "v1"}, 1199 Dependencies: map[string]string{"k1": "v1"}, 1200 DevDependencies: map[string]string{"k1": "v1"}, 1201 PeerDependencies: map[string]string{"k1": "v1"}, 1202 OptionalDependencies: map[string]string{"k1": "v1"}, 1203 Dist: map[string]string{"k1": "v1"}, 1204 Repository: map[string]string{"k1": "v1"}, 1205 Engines: map[string]string{"k1": "v1"}, 1206 Directories: map[string]string{"k1": "v1"}, 1207 Scripts: map[string]interface{}{"k1": 1}, 1208 Bin: map[string]interface{}{"k1": true}, 1209 Man: map[string]interface{}{"k1": "v1"}, 1210 Keywords: []string{"kw1", "kw2"}, 1211 Files: []string{"f1", "f2"}, 1212 OS: []string{"os1", "os2"}, 1213 CPU: []string{"cpu1", "cpu2"}, 1214 Maintainers: []interface{}{"m1", "m2"}, 1215 Contributors: []interface{}{"c1", "c2"}, 1216 }, 1217 want: `{ 1218 "name": "n", 1219 "version": "v", 1220 "npm_user": "nu", 1221 "description": "d", 1222 "git_head": "gh", 1223 "homepage": "h", 1224 "license": "l", 1225 "main": "m", 1226 "ID": "id", 1227 "node_version": "nv", 1228 "npm_version": "npmv", 1229 "readme": "r", 1230 "installation_command": "ic", 1231 "commit_oid": "coid", 1232 "has_shrinkwrap": true, 1233 "published_via_actions": true, 1234 "release_id": 1, 1235 "deleted_by_id": 1, 1236 "author": { 1237 "k1": "v1" 1238 }, 1239 "bugs": { 1240 "k1": "v1" 1241 }, 1242 "dependencies": { 1243 "k1": "v1" 1244 }, 1245 "dev_dependencies": { 1246 "k1": "v1" 1247 }, 1248 "peer_dependencies": { 1249 "k1": "v1" 1250 }, 1251 "optional_dependencies": { 1252 "k1": "v1" 1253 }, 1254 "dist": { 1255 "k1": "v1" 1256 }, 1257 "repository": { 1258 "k1": "v1" 1259 }, 1260 "engines": { 1261 "k1": "v1" 1262 }, 1263 "directories": { 1264 "k1": "v1" 1265 }, 1266 "scripts": { 1267 "k1": 1 1268 }, 1269 "bin": { 1270 "k1": true 1271 }, 1272 "man": { 1273 "k1": "v1" 1274 }, 1275 "keywords": ["kw1", "kw2"], 1276 "files": ["f1", "f2"], 1277 "os": ["os1", "os2"], 1278 "cpu": ["cpu1", "cpu2"], 1279 "maintainers": ["m1", "m2"], 1280 "contributors": ["c1", "c2"] 1281 }`, 1282 }, 1283 } 1284 1285 for name, test := range tests { 1286 t.Run(name, func(t *testing.T) { 1287 t.Parallel() 1288 testJSONMarshal(t, test.input, test.want) 1289 }) 1290 } 1291 }