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  }