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  }