...

Source file src/github.com/google/go-github/v55/github/apps_test.go

Documentation: github.com/google/go-github/v55/github

     1  // Copyright 2016 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"context"
    10  	"encoding/json"
    11  	"fmt"
    12  	"net/http"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/google/go-cmp/cmp"
    17  )
    18  
    19  func TestAppsService_Get_authenticatedApp(t *testing.T) {
    20  	client, mux, _, teardown := setup()
    21  	defer teardown()
    22  
    23  	mux.HandleFunc("/app", func(w http.ResponseWriter, r *http.Request) {
    24  		testMethod(t, r, "GET")
    25  		fmt.Fprint(w, `{"id":1}`)
    26  	})
    27  
    28  	ctx := context.Background()
    29  	app, _, err := client.Apps.Get(ctx, "")
    30  	if err != nil {
    31  		t.Errorf("Apps.Get returned error: %v", err)
    32  	}
    33  
    34  	want := &App{ID: Int64(1)}
    35  	if !cmp.Equal(app, want) {
    36  		t.Errorf("Apps.Get returned %+v, want %+v", app, want)
    37  	}
    38  
    39  	const methodName = "Get"
    40  	testBadOptions(t, methodName, func() (err error) {
    41  		_, _, err = client.Apps.Get(ctx, "\n")
    42  		return err
    43  	})
    44  
    45  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    46  		got, resp, err := client.Apps.Get(ctx, "")
    47  		if got != nil {
    48  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    49  		}
    50  		return resp, err
    51  	})
    52  }
    53  
    54  func TestAppsService_Get_specifiedApp(t *testing.T) {
    55  	client, mux, _, teardown := setup()
    56  	defer teardown()
    57  
    58  	mux.HandleFunc("/apps/a", func(w http.ResponseWriter, r *http.Request) {
    59  		testMethod(t, r, "GET")
    60  		fmt.Fprint(w, `{"html_url":"https://github.com/apps/a"}`)
    61  	})
    62  
    63  	ctx := context.Background()
    64  	app, _, err := client.Apps.Get(ctx, "a")
    65  	if err != nil {
    66  		t.Errorf("Apps.Get returned error: %v", err)
    67  	}
    68  
    69  	want := &App{HTMLURL: String("https://github.com/apps/a")}
    70  	if !cmp.Equal(app, want) {
    71  		t.Errorf("Apps.Get returned %+v, want %+v", *app.HTMLURL, *want.HTMLURL)
    72  	}
    73  }
    74  
    75  func TestAppsService_ListInstallations(t *testing.T) {
    76  	client, mux, _, teardown := setup()
    77  	defer teardown()
    78  
    79  	mux.HandleFunc("/app/installations", func(w http.ResponseWriter, r *http.Request) {
    80  		testMethod(t, r, "GET")
    81  		testFormValues(t, r, values{
    82  			"page":     "1",
    83  			"per_page": "2",
    84  		})
    85  		fmt.Fprint(w, `[{
    86                                     "id":1,
    87                                     "app_id":1,
    88                                     "target_id":1,
    89                                     "target_type": "Organization",
    90                                     "permissions": {
    91                                         "actions": "read",
    92                                         "administration": "read",
    93                                         "checks": "read",
    94                                         "contents": "read",
    95                                         "content_references": "read",
    96                                         "deployments": "read",
    97                                         "environments": "read",
    98                                         "issues": "write",
    99                                         "metadata": "read",
   100                                         "members": "read",
   101                                         "organization_administration": "write",
   102                                         "organization_custom_roles": "write",
   103                                         "organization_hooks": "write",
   104                                         "organization_packages": "write",
   105                                         "organization_plan": "read",
   106                                         "organization_pre_receive_hooks": "write",
   107                                         "organization_projects": "read",
   108                                         "organization_secrets": "read",
   109                                         "organization_self_hosted_runners": "read",
   110                                         "organization_user_blocking": "write",
   111                                         "packages": "read",
   112                                         "pages": "read",
   113                                         "pull_requests": "write",
   114                                         "repository_hooks": "write",
   115                                         "repository_projects": "read",
   116                                         "repository_pre_receive_hooks": "read",
   117                                         "secrets": "read",
   118                                         "secret_scanning_alerts": "read",
   119                                         "security_events": "read",
   120                                         "single_file": "write",
   121                                         "statuses": "write",
   122                                         "team_discussions": "read",
   123                                         "vulnerability_alerts": "read",
   124                                         "workflows": "write"
   125                                     },
   126                                    "events": [
   127                                        "push",
   128                                        "pull_request"
   129                                    ],
   130                                   "single_file_name": "config.yml",
   131                                   "repository_selection": "selected",
   132                                   "created_at": "2018-01-01T00:00:00Z",
   133                                   "updated_at": "2018-01-01T00:00:00Z"}]`,
   134  		)
   135  	})
   136  
   137  	opt := &ListOptions{Page: 1, PerPage: 2}
   138  	ctx := context.Background()
   139  	installations, _, err := client.Apps.ListInstallations(ctx, opt)
   140  	if err != nil {
   141  		t.Errorf("Apps.ListInstallations returned error: %v", err)
   142  	}
   143  
   144  	date := Timestamp{Time: time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}
   145  	want := []*Installation{{
   146  		ID:                  Int64(1),
   147  		AppID:               Int64(1),
   148  		TargetID:            Int64(1),
   149  		TargetType:          String("Organization"),
   150  		SingleFileName:      String("config.yml"),
   151  		RepositorySelection: String("selected"),
   152  		Permissions: &InstallationPermissions{
   153  			Actions:                       String("read"),
   154  			Administration:                String("read"),
   155  			Checks:                        String("read"),
   156  			Contents:                      String("read"),
   157  			ContentReferences:             String("read"),
   158  			Deployments:                   String("read"),
   159  			Environments:                  String("read"),
   160  			Issues:                        String("write"),
   161  			Metadata:                      String("read"),
   162  			Members:                       String("read"),
   163  			OrganizationAdministration:    String("write"),
   164  			OrganizationCustomRoles:       String("write"),
   165  			OrganizationHooks:             String("write"),
   166  			OrganizationPackages:          String("write"),
   167  			OrganizationPlan:              String("read"),
   168  			OrganizationPreReceiveHooks:   String("write"),
   169  			OrganizationProjects:          String("read"),
   170  			OrganizationSecrets:           String("read"),
   171  			OrganizationSelfHostedRunners: String("read"),
   172  			OrganizationUserBlocking:      String("write"),
   173  			Packages:                      String("read"),
   174  			Pages:                         String("read"),
   175  			PullRequests:                  String("write"),
   176  			RepositoryHooks:               String("write"),
   177  			RepositoryProjects:            String("read"),
   178  			RepositoryPreReceiveHooks:     String("read"),
   179  			Secrets:                       String("read"),
   180  			SecretScanningAlerts:          String("read"),
   181  			SecurityEvents:                String("read"),
   182  			SingleFile:                    String("write"),
   183  			Statuses:                      String("write"),
   184  			TeamDiscussions:               String("read"),
   185  			VulnerabilityAlerts:           String("read"),
   186  			Workflows:                     String("write")},
   187  		Events:    []string{"push", "pull_request"},
   188  		CreatedAt: &date,
   189  		UpdatedAt: &date,
   190  	}}
   191  	if !cmp.Equal(installations, want) {
   192  		t.Errorf("Apps.ListInstallations returned %+v, want %+v", installations, want)
   193  	}
   194  
   195  	const methodName = "ListInstallations"
   196  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   197  		got, resp, err := client.Apps.ListInstallations(ctx, opt)
   198  		if got != nil {
   199  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   200  		}
   201  		return resp, err
   202  	})
   203  }
   204  
   205  func TestAppsService_GetInstallation(t *testing.T) {
   206  	client, mux, _, teardown := setup()
   207  	defer teardown()
   208  
   209  	mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) {
   210  		testMethod(t, r, "GET")
   211  		fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`)
   212  	})
   213  
   214  	ctx := context.Background()
   215  	installation, _, err := client.Apps.GetInstallation(ctx, 1)
   216  	if err != nil {
   217  		t.Errorf("Apps.GetInstallation returned error: %v", err)
   218  	}
   219  
   220  	want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}
   221  	if !cmp.Equal(installation, want) {
   222  		t.Errorf("Apps.GetInstallation returned %+v, want %+v", installation, want)
   223  	}
   224  
   225  	const methodName = "GetInstallation"
   226  	testBadOptions(t, methodName, func() (err error) {
   227  		_, _, err = client.Apps.GetInstallation(ctx, -1)
   228  		return err
   229  	})
   230  
   231  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   232  		got, resp, err := client.Apps.GetInstallation(ctx, 1)
   233  		if got != nil {
   234  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   235  		}
   236  		return resp, err
   237  	})
   238  }
   239  
   240  func TestAppsService_ListUserInstallations(t *testing.T) {
   241  	client, mux, _, teardown := setup()
   242  	defer teardown()
   243  
   244  	mux.HandleFunc("/user/installations", func(w http.ResponseWriter, r *http.Request) {
   245  		testMethod(t, r, "GET")
   246  		testFormValues(t, r, values{
   247  			"page":     "1",
   248  			"per_page": "2",
   249  		})
   250  		fmt.Fprint(w, `{"installations":[{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}]}`)
   251  	})
   252  
   253  	opt := &ListOptions{Page: 1, PerPage: 2}
   254  	ctx := context.Background()
   255  	installations, _, err := client.Apps.ListUserInstallations(ctx, opt)
   256  	if err != nil {
   257  		t.Errorf("Apps.ListUserInstallations returned error: %v", err)
   258  	}
   259  
   260  	want := []*Installation{{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}}
   261  	if !cmp.Equal(installations, want) {
   262  		t.Errorf("Apps.ListUserInstallations returned %+v, want %+v", installations, want)
   263  	}
   264  
   265  	const methodName = "ListUserInstallations"
   266  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   267  		got, resp, err := client.Apps.ListUserInstallations(ctx, opt)
   268  		if got != nil {
   269  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   270  		}
   271  		return resp, err
   272  	})
   273  }
   274  
   275  func TestAppsService_SuspendInstallation(t *testing.T) {
   276  	client, mux, _, teardown := setup()
   277  	defer teardown()
   278  
   279  	mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) {
   280  		testMethod(t, r, "PUT")
   281  
   282  		w.WriteHeader(http.StatusNoContent)
   283  	})
   284  
   285  	ctx := context.Background()
   286  	if _, err := client.Apps.SuspendInstallation(ctx, 1); err != nil {
   287  		t.Errorf("Apps.SuspendInstallation returned error: %v", err)
   288  	}
   289  
   290  	const methodName = "SuspendInstallation"
   291  	testBadOptions(t, methodName, func() (err error) {
   292  		_, err = client.Apps.SuspendInstallation(ctx, -1)
   293  		return err
   294  	})
   295  
   296  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   297  		return client.Apps.SuspendInstallation(ctx, 1)
   298  	})
   299  }
   300  
   301  func TestAppsService_UnsuspendInstallation(t *testing.T) {
   302  	client, mux, _, teardown := setup()
   303  	defer teardown()
   304  
   305  	mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) {
   306  		testMethod(t, r, "DELETE")
   307  
   308  		w.WriteHeader(http.StatusNoContent)
   309  	})
   310  
   311  	ctx := context.Background()
   312  	if _, err := client.Apps.UnsuspendInstallation(ctx, 1); err != nil {
   313  		t.Errorf("Apps.UnsuspendInstallation returned error: %v", err)
   314  	}
   315  
   316  	const methodName = "UnsuspendInstallation"
   317  	testBadOptions(t, methodName, func() (err error) {
   318  		_, err = client.Apps.UnsuspendInstallation(ctx, -1)
   319  		return err
   320  	})
   321  
   322  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   323  		return client.Apps.UnsuspendInstallation(ctx, 1)
   324  	})
   325  }
   326  
   327  func TestAppsService_DeleteInstallation(t *testing.T) {
   328  	client, mux, _, teardown := setup()
   329  	defer teardown()
   330  
   331  	mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) {
   332  		testMethod(t, r, "DELETE")
   333  		w.WriteHeader(http.StatusNoContent)
   334  	})
   335  
   336  	ctx := context.Background()
   337  	_, err := client.Apps.DeleteInstallation(ctx, 1)
   338  	if err != nil {
   339  		t.Errorf("Apps.DeleteInstallation returned error: %v", err)
   340  	}
   341  
   342  	const methodName = "DeleteInstallation"
   343  	testBadOptions(t, methodName, func() (err error) {
   344  		_, err = client.Apps.DeleteInstallation(ctx, -1)
   345  		return err
   346  	})
   347  
   348  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   349  		return client.Apps.DeleteInstallation(ctx, 1)
   350  	})
   351  }
   352  
   353  func TestAppsService_CreateInstallationToken(t *testing.T) {
   354  	client, mux, _, teardown := setup()
   355  	defer teardown()
   356  
   357  	mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) {
   358  		testMethod(t, r, "POST")
   359  		fmt.Fprint(w, `{"token":"t"}`)
   360  	})
   361  
   362  	ctx := context.Background()
   363  	token, _, err := client.Apps.CreateInstallationToken(ctx, 1, nil)
   364  	if err != nil {
   365  		t.Errorf("Apps.CreateInstallationToken returned error: %v", err)
   366  	}
   367  
   368  	want := &InstallationToken{Token: String("t")}
   369  	if !cmp.Equal(token, want) {
   370  		t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want)
   371  	}
   372  
   373  	const methodName = "CreateInstallationToken"
   374  	testBadOptions(t, methodName, func() (err error) {
   375  		_, _, err = client.Apps.CreateInstallationToken(ctx, -1, nil)
   376  		return err
   377  	})
   378  
   379  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   380  		got, resp, err := client.Apps.CreateInstallationToken(ctx, 1, nil)
   381  		if got != nil {
   382  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   383  		}
   384  		return resp, err
   385  	})
   386  }
   387  
   388  func TestAppsService_CreateInstallationTokenWithOptions(t *testing.T) {
   389  	client, mux, _, teardown := setup()
   390  	defer teardown()
   391  
   392  	installationTokenOptions := &InstallationTokenOptions{
   393  		RepositoryIDs: []int64{1234},
   394  		Repositories:  []string{"foo"},
   395  		Permissions: &InstallationPermissions{
   396  			Contents: String("write"),
   397  			Issues:   String("read"),
   398  		},
   399  	}
   400  
   401  	mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) {
   402  		v := new(InstallationTokenOptions)
   403  		json.NewDecoder(r.Body).Decode(v)
   404  
   405  		if !cmp.Equal(v, installationTokenOptions) {
   406  			t.Errorf("request sent %+v, want %+v", v, installationTokenOptions)
   407  		}
   408  
   409  		testMethod(t, r, "POST")
   410  		fmt.Fprint(w, `{"token":"t"}`)
   411  	})
   412  
   413  	ctx := context.Background()
   414  	token, _, err := client.Apps.CreateInstallationToken(ctx, 1, installationTokenOptions)
   415  	if err != nil {
   416  		t.Errorf("Apps.CreateInstallationToken returned error: %v", err)
   417  	}
   418  
   419  	want := &InstallationToken{Token: String("t")}
   420  	if !cmp.Equal(token, want) {
   421  		t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want)
   422  	}
   423  }
   424  
   425  func TestAppsService_CreateAttachement(t *testing.T) {
   426  	client, mux, _, teardown := setup()
   427  	defer teardown()
   428  
   429  	mux.HandleFunc("/content_references/11/attachments", func(w http.ResponseWriter, r *http.Request) {
   430  		testMethod(t, r, "POST")
   431  		testHeader(t, r, "Accept", mediaTypeContentAttachmentsPreview)
   432  
   433  		w.WriteHeader(http.StatusOK)
   434  		w.Write([]byte(`{"id":1,"title":"title1","body":"body1"}`))
   435  	})
   436  
   437  	ctx := context.Background()
   438  	got, _, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1")
   439  	if err != nil {
   440  		t.Errorf("CreateAttachment returned error: %v", err)
   441  	}
   442  
   443  	want := &Attachment{ID: Int64(1), Title: String("title1"), Body: String("body1")}
   444  	if !cmp.Equal(got, want) {
   445  		t.Errorf("CreateAttachment = %+v, want %+v", got, want)
   446  	}
   447  
   448  	const methodName = "CreateAttachment"
   449  	testBadOptions(t, methodName, func() (err error) {
   450  		_, _, err = client.Apps.CreateAttachment(ctx, -11, "\n", "\n")
   451  		return err
   452  	})
   453  
   454  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   455  		got, resp, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1")
   456  		if got != nil {
   457  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   458  		}
   459  		return resp, err
   460  	})
   461  }
   462  
   463  func TestAppsService_FindOrganizationInstallation(t *testing.T) {
   464  	client, mux, _, teardown := setup()
   465  	defer teardown()
   466  
   467  	mux.HandleFunc("/orgs/o/installation", func(w http.ResponseWriter, r *http.Request) {
   468  		testMethod(t, r, "GET")
   469  		fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`)
   470  	})
   471  
   472  	ctx := context.Background()
   473  	installation, _, err := client.Apps.FindOrganizationInstallation(ctx, "o")
   474  	if err != nil {
   475  		t.Errorf("Apps.FindOrganizationInstallation returned error: %v", err)
   476  	}
   477  
   478  	want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}
   479  	if !cmp.Equal(installation, want) {
   480  		t.Errorf("Apps.FindOrganizationInstallation returned %+v, want %+v", installation, want)
   481  	}
   482  
   483  	const methodName = "FindOrganizationInstallation"
   484  	testBadOptions(t, methodName, func() (err error) {
   485  		_, _, err = client.Apps.FindOrganizationInstallation(ctx, "\n")
   486  		return err
   487  	})
   488  
   489  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   490  		got, resp, err := client.Apps.FindOrganizationInstallation(ctx, "o")
   491  		if got != nil {
   492  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   493  		}
   494  		return resp, err
   495  	})
   496  }
   497  
   498  func TestAppsService_FindRepositoryInstallation(t *testing.T) {
   499  	client, mux, _, teardown := setup()
   500  	defer teardown()
   501  
   502  	mux.HandleFunc("/repos/o/r/installation", func(w http.ResponseWriter, r *http.Request) {
   503  		testMethod(t, r, "GET")
   504  		fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`)
   505  	})
   506  
   507  	ctx := context.Background()
   508  	installation, _, err := client.Apps.FindRepositoryInstallation(ctx, "o", "r")
   509  	if err != nil {
   510  		t.Errorf("Apps.FindRepositoryInstallation returned error: %v", err)
   511  	}
   512  
   513  	want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}
   514  	if !cmp.Equal(installation, want) {
   515  		t.Errorf("Apps.FindRepositoryInstallation returned %+v, want %+v", installation, want)
   516  	}
   517  
   518  	const methodName = "FindRepositoryInstallation"
   519  	testBadOptions(t, methodName, func() (err error) {
   520  		_, _, err = client.Apps.FindRepositoryInstallation(ctx, "\n", "\n")
   521  		return err
   522  	})
   523  
   524  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   525  		got, resp, err := client.Apps.FindRepositoryInstallation(ctx, "o", "r")
   526  		if got != nil {
   527  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   528  		}
   529  		return resp, err
   530  	})
   531  }
   532  
   533  func TestAppsService_FindRepositoryInstallationByID(t *testing.T) {
   534  	client, mux, _, teardown := setup()
   535  	defer teardown()
   536  
   537  	mux.HandleFunc("/repositories/1/installation", func(w http.ResponseWriter, r *http.Request) {
   538  		testMethod(t, r, "GET")
   539  		fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`)
   540  	})
   541  
   542  	ctx := context.Background()
   543  	installation, _, err := client.Apps.FindRepositoryInstallationByID(ctx, 1)
   544  	if err != nil {
   545  		t.Errorf("Apps.FindRepositoryInstallationByID returned error: %v", err)
   546  	}
   547  
   548  	want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}
   549  	if !cmp.Equal(installation, want) {
   550  		t.Errorf("Apps.FindRepositoryInstallationByID returned %+v, want %+v", installation, want)
   551  	}
   552  
   553  	const methodName = "FindRepositoryInstallationByID"
   554  	testBadOptions(t, methodName, func() (err error) {
   555  		_, _, err = client.Apps.FindRepositoryInstallationByID(ctx, -1)
   556  		return err
   557  	})
   558  
   559  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   560  		got, resp, err := client.Apps.FindRepositoryInstallationByID(ctx, 1)
   561  		if got != nil {
   562  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   563  		}
   564  		return resp, err
   565  	})
   566  }
   567  
   568  func TestAppsService_FindUserInstallation(t *testing.T) {
   569  	client, mux, _, teardown := setup()
   570  	defer teardown()
   571  
   572  	mux.HandleFunc("/users/u/installation", func(w http.ResponseWriter, r *http.Request) {
   573  		testMethod(t, r, "GET")
   574  		fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "User"}`)
   575  	})
   576  
   577  	ctx := context.Background()
   578  	installation, _, err := client.Apps.FindUserInstallation(ctx, "u")
   579  	if err != nil {
   580  		t.Errorf("Apps.FindUserInstallation returned error: %v", err)
   581  	}
   582  
   583  	want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("User")}
   584  	if !cmp.Equal(installation, want) {
   585  		t.Errorf("Apps.FindUserInstallation returned %+v, want %+v", installation, want)
   586  	}
   587  
   588  	const methodName = "FindUserInstallation"
   589  	testBadOptions(t, methodName, func() (err error) {
   590  		_, _, err = client.Apps.FindUserInstallation(ctx, "\n")
   591  		return err
   592  	})
   593  
   594  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   595  		got, resp, err := client.Apps.FindUserInstallation(ctx, "u")
   596  		if got != nil {
   597  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   598  		}
   599  		return resp, err
   600  	})
   601  }
   602  
   603  func TestContentReference_Marshal(t *testing.T) {
   604  	testJSONMarshal(t, &ContentReference{}, "{}")
   605  
   606  	u := &ContentReference{
   607  		ID:        Int64(1),
   608  		NodeID:    String("nid"),
   609  		Reference: String("r"),
   610  	}
   611  
   612  	want := `{
   613  		"id": 1,
   614  		"node_id": "nid",
   615  		"reference": "r"
   616  	}`
   617  
   618  	testJSONMarshal(t, u, want)
   619  }
   620  
   621  func TestAttachment_Marshal(t *testing.T) {
   622  	testJSONMarshal(t, &Attachment{}, "{}")
   623  
   624  	u := &Attachment{
   625  		ID:    Int64(1),
   626  		Title: String("t"),
   627  		Body:  String("b"),
   628  	}
   629  
   630  	want := `{
   631  		"id": 1,
   632  		"title": "t",
   633  		"body": "b"
   634  	}`
   635  
   636  	testJSONMarshal(t, u, want)
   637  }
   638  
   639  func TestInstallationPermissions_Marshal(t *testing.T) {
   640  	testJSONMarshal(t, &InstallationPermissions{}, "{}")
   641  
   642  	u := &InstallationPermissions{
   643  		Actions:                       String("a"),
   644  		Administration:                String("ad"),
   645  		Checks:                        String("c"),
   646  		Contents:                      String("co"),
   647  		ContentReferences:             String("cr"),
   648  		Deployments:                   String("d"),
   649  		Environments:                  String("e"),
   650  		Issues:                        String("i"),
   651  		Metadata:                      String("md"),
   652  		Members:                       String("m"),
   653  		OrganizationAdministration:    String("oa"),
   654  		OrganizationHooks:             String("oh"),
   655  		OrganizationPlan:              String("op"),
   656  		OrganizationPreReceiveHooks:   String("opr"),
   657  		OrganizationProjects:          String("op"),
   658  		OrganizationSecrets:           String("os"),
   659  		OrganizationSelfHostedRunners: String("osh"),
   660  		OrganizationUserBlocking:      String("oub"),
   661  		Packages:                      String("pkg"),
   662  		Pages:                         String("pg"),
   663  		PullRequests:                  String("pr"),
   664  		RepositoryHooks:               String("rh"),
   665  		RepositoryProjects:            String("rp"),
   666  		RepositoryPreReceiveHooks:     String("rprh"),
   667  		Secrets:                       String("s"),
   668  		SecretScanningAlerts:          String("ssa"),
   669  		SecurityEvents:                String("se"),
   670  		SingleFile:                    String("sf"),
   671  		Statuses:                      String("s"),
   672  		TeamDiscussions:               String("td"),
   673  		VulnerabilityAlerts:           String("va"),
   674  		Workflows:                     String("w"),
   675  	}
   676  
   677  	want := `{
   678  		"actions": "a",
   679  		"administration": "ad",
   680  		"checks": "c",
   681  		"contents": "co",
   682  		"content_references": "cr",
   683  		"deployments": "d",
   684  		"environments": "e",
   685  		"issues": "i",
   686  		"metadata": "md",
   687  		"members": "m",
   688  		"organization_administration": "oa",
   689  		"organization_hooks": "oh",
   690  		"organization_plan": "op",
   691  		"organization_pre_receive_hooks": "opr",
   692  		"organization_projects": "op",
   693  		"organization_secrets": "os",
   694  		"organization_self_hosted_runners": "osh",
   695  		"organization_user_blocking": "oub",
   696  		"packages": "pkg",
   697  		"pages": "pg",
   698  		"pull_requests": "pr",
   699  		"repository_hooks": "rh",
   700  		"repository_projects": "rp",
   701  		"repository_pre_receive_hooks": "rprh",
   702  		"secrets": "s",
   703  		"secret_scanning_alerts": "ssa",
   704  		"security_events": "se",
   705  		"single_file": "sf",
   706  		"statuses": "s",
   707  		"team_discussions": "td",
   708  		"vulnerability_alerts":"va",
   709  		"workflows": "w"
   710  	}`
   711  
   712  	testJSONMarshal(t, u, want)
   713  }
   714  
   715  func TestInstallation_Marshal(t *testing.T) {
   716  	testJSONMarshal(t, &Installation{}, "{}")
   717  
   718  	u := &Installation{
   719  		ID:       Int64(1),
   720  		NodeID:   String("nid"),
   721  		AppID:    Int64(1),
   722  		AppSlug:  String("as"),
   723  		TargetID: Int64(1),
   724  		Account: &User{
   725  			Login:           String("l"),
   726  			ID:              Int64(1),
   727  			URL:             String("u"),
   728  			AvatarURL:       String("a"),
   729  			GravatarID:      String("g"),
   730  			Name:            String("n"),
   731  			Company:         String("c"),
   732  			Blog:            String("b"),
   733  			Location:        String("l"),
   734  			Email:           String("e"),
   735  			Hireable:        Bool(true),
   736  			Bio:             String("b"),
   737  			TwitterUsername: String("t"),
   738  			PublicRepos:     Int(1),
   739  			Followers:       Int(1),
   740  			Following:       Int(1),
   741  			CreatedAt:       &Timestamp{referenceTime},
   742  			SuspendedAt:     &Timestamp{referenceTime},
   743  		},
   744  		AccessTokensURL:     String("atu"),
   745  		RepositoriesURL:     String("ru"),
   746  		HTMLURL:             String("hu"),
   747  		TargetType:          String("tt"),
   748  		SingleFileName:      String("sfn"),
   749  		RepositorySelection: String("rs"),
   750  		Events:              []string{"e"},
   751  		SingleFilePaths:     []string{"s"},
   752  		Permissions: &InstallationPermissions{
   753  			Actions:                       String("a"),
   754  			Administration:                String("ad"),
   755  			Checks:                        String("c"),
   756  			Contents:                      String("co"),
   757  			ContentReferences:             String("cr"),
   758  			Deployments:                   String("d"),
   759  			Environments:                  String("e"),
   760  			Issues:                        String("i"),
   761  			Metadata:                      String("md"),
   762  			Members:                       String("m"),
   763  			OrganizationAdministration:    String("oa"),
   764  			OrganizationHooks:             String("oh"),
   765  			OrganizationPlan:              String("op"),
   766  			OrganizationPreReceiveHooks:   String("opr"),
   767  			OrganizationProjects:          String("op"),
   768  			OrganizationSecrets:           String("os"),
   769  			OrganizationSelfHostedRunners: String("osh"),
   770  			OrganizationUserBlocking:      String("oub"),
   771  			Packages:                      String("pkg"),
   772  			Pages:                         String("pg"),
   773  			PullRequests:                  String("pr"),
   774  			RepositoryHooks:               String("rh"),
   775  			RepositoryProjects:            String("rp"),
   776  			RepositoryPreReceiveHooks:     String("rprh"),
   777  			Secrets:                       String("s"),
   778  			SecretScanningAlerts:          String("ssa"),
   779  			SecurityEvents:                String("se"),
   780  			SingleFile:                    String("sf"),
   781  			Statuses:                      String("s"),
   782  			TeamDiscussions:               String("td"),
   783  			VulnerabilityAlerts:           String("va"),
   784  			Workflows:                     String("w"),
   785  		},
   786  		CreatedAt:              &Timestamp{referenceTime},
   787  		UpdatedAt:              &Timestamp{referenceTime},
   788  		HasMultipleSingleFiles: Bool(false),
   789  		SuspendedBy: &User{
   790  			Login:           String("l"),
   791  			ID:              Int64(1),
   792  			URL:             String("u"),
   793  			AvatarURL:       String("a"),
   794  			GravatarID:      String("g"),
   795  			Name:            String("n"),
   796  			Company:         String("c"),
   797  			Blog:            String("b"),
   798  			Location:        String("l"),
   799  			Email:           String("e"),
   800  			Hireable:        Bool(true),
   801  			Bio:             String("b"),
   802  			TwitterUsername: String("t"),
   803  			PublicRepos:     Int(1),
   804  			Followers:       Int(1),
   805  			Following:       Int(1),
   806  			CreatedAt:       &Timestamp{referenceTime},
   807  			SuspendedAt:     &Timestamp{referenceTime},
   808  		},
   809  		SuspendedAt: &Timestamp{referenceTime},
   810  	}
   811  
   812  	want := `{
   813  		"id": 1,
   814  		"node_id": "nid",
   815  		"app_id": 1,
   816  		"app_slug": "as",
   817  		"target_id": 1,
   818  		"account": {
   819  			"login": "l",
   820  			"id": 1,
   821  			"avatar_url": "a",
   822  			"gravatar_id": "g",
   823  			"name": "n",
   824  			"company": "c",
   825  			"blog": "b",
   826  			"location": "l",
   827  			"email": "e",
   828  			"hireable": true,
   829  			"bio": "b",
   830  			"twitter_username": "t",
   831  			"public_repos": 1,
   832  			"followers": 1,
   833  			"following": 1,
   834  			"created_at": ` + referenceTimeStr + `,
   835  			"suspended_at": ` + referenceTimeStr + `,
   836  			"url": "u"
   837  		},
   838  		"access_tokens_url": "atu",
   839  		"repositories_url": "ru",
   840  		"html_url": "hu",
   841  		"target_type": "tt",
   842  		"single_file_name": "sfn",
   843  		"repository_selection": "rs",
   844  		"events": [
   845  			"e"
   846  		],
   847  		"single_file_paths": [
   848  			"s"
   849  		],
   850  		"permissions": {
   851  			"actions": "a",
   852  			"administration": "ad",
   853  			"checks": "c",
   854  			"contents": "co",
   855  			"content_references": "cr",
   856  			"deployments": "d",
   857  			"environments": "e",
   858  			"issues": "i",
   859  			"metadata": "md",
   860  			"members": "m",
   861  			"organization_administration": "oa",
   862  			"organization_hooks": "oh",
   863  			"organization_plan": "op",
   864  			"organization_pre_receive_hooks": "opr",
   865  			"organization_projects": "op",
   866  			"organization_secrets": "os",
   867  			"organization_self_hosted_runners": "osh",
   868  			"organization_user_blocking": "oub",
   869  			"packages": "pkg",
   870  			"pages": "pg",
   871  			"pull_requests": "pr",
   872  			"repository_hooks": "rh",
   873  			"repository_projects": "rp",
   874  			"repository_pre_receive_hooks": "rprh",
   875  			"secrets": "s",
   876  			"secret_scanning_alerts": "ssa",
   877  			"security_events": "se",
   878  			"single_file": "sf",
   879  			"statuses": "s",
   880  			"team_discussions": "td",
   881  			"vulnerability_alerts": "va",
   882  			"workflows": "w"
   883  		},
   884  		"created_at": ` + referenceTimeStr + `,
   885  		"updated_at": ` + referenceTimeStr + `,
   886  		"has_multiple_single_files": false,
   887  		"suspended_by": {
   888  			"login": "l",
   889  			"id": 1,
   890  			"avatar_url": "a",
   891  			"gravatar_id": "g",
   892  			"name": "n",
   893  			"company": "c",
   894  			"blog": "b",
   895  			"location": "l",
   896  			"email": "e",
   897  			"hireable": true,
   898  			"bio": "b",
   899  			"twitter_username": "t",
   900  			"public_repos": 1,
   901  			"followers": 1,
   902  			"following": 1,
   903  			"created_at": ` + referenceTimeStr + `,
   904  			"suspended_at": ` + referenceTimeStr + `,
   905  			"url": "u"
   906  		},
   907  		"suspended_at": ` + referenceTimeStr + `
   908  	}`
   909  
   910  	testJSONMarshal(t, u, want)
   911  }
   912  
   913  func TestInstallationTokenOptions_Marshal(t *testing.T) {
   914  	testJSONMarshal(t, &InstallationTokenOptions{}, "{}")
   915  
   916  	u := &InstallationTokenOptions{
   917  		RepositoryIDs: []int64{1},
   918  		Permissions: &InstallationPermissions{
   919  			Actions:                       String("a"),
   920  			Administration:                String("ad"),
   921  			Checks:                        String("c"),
   922  			Contents:                      String("co"),
   923  			ContentReferences:             String("cr"),
   924  			Deployments:                   String("d"),
   925  			Environments:                  String("e"),
   926  			Issues:                        String("i"),
   927  			Metadata:                      String("md"),
   928  			Members:                       String("m"),
   929  			OrganizationAdministration:    String("oa"),
   930  			OrganizationHooks:             String("oh"),
   931  			OrganizationPlan:              String("op"),
   932  			OrganizationPreReceiveHooks:   String("opr"),
   933  			OrganizationProjects:          String("op"),
   934  			OrganizationSecrets:           String("os"),
   935  			OrganizationSelfHostedRunners: String("osh"),
   936  			OrganizationUserBlocking:      String("oub"),
   937  			Packages:                      String("pkg"),
   938  			Pages:                         String("pg"),
   939  			PullRequests:                  String("pr"),
   940  			RepositoryHooks:               String("rh"),
   941  			RepositoryProjects:            String("rp"),
   942  			RepositoryPreReceiveHooks:     String("rprh"),
   943  			Secrets:                       String("s"),
   944  			SecretScanningAlerts:          String("ssa"),
   945  			SecurityEvents:                String("se"),
   946  			SingleFile:                    String("sf"),
   947  			Statuses:                      String("s"),
   948  			TeamDiscussions:               String("td"),
   949  			VulnerabilityAlerts:           String("va"),
   950  			Workflows:                     String("w"),
   951  		},
   952  	}
   953  
   954  	want := `{
   955  		"repository_ids": [1],
   956  		"permissions": {
   957  			"actions": "a",
   958  			"administration": "ad",
   959  			"checks": "c",
   960  			"contents": "co",
   961  			"content_references": "cr",
   962  			"deployments": "d",
   963  			"environments": "e",
   964  			"issues": "i",
   965  			"metadata": "md",
   966  			"members": "m",
   967  			"organization_administration": "oa",
   968  			"organization_hooks": "oh",
   969  			"organization_plan": "op",
   970  			"organization_pre_receive_hooks": "opr",
   971  			"organization_projects": "op",
   972  			"organization_secrets": "os",
   973  			"organization_self_hosted_runners": "osh",
   974  			"organization_user_blocking": "oub",
   975  			"packages": "pkg",
   976  			"pages": "pg",
   977  			"pull_requests": "pr",
   978  			"repository_hooks": "rh",
   979  			"repository_projects": "rp",
   980  			"repository_pre_receive_hooks": "rprh",
   981  			"secrets": "s",
   982  			"secret_scanning_alerts": "ssa",
   983  			"security_events": "se",
   984  			"single_file": "sf",
   985  			"statuses": "s",
   986  			"team_discussions": "td",
   987  			"vulnerability_alerts": "va",
   988  			"workflows": "w"
   989  		}
   990  	}`
   991  
   992  	testJSONMarshal(t, u, want)
   993  }
   994  
   995  func TestInstallationToken_Marshal(t *testing.T) {
   996  	testJSONMarshal(t, &InstallationToken{}, "{}")
   997  
   998  	u := &InstallationToken{
   999  		Token:     String("t"),
  1000  		ExpiresAt: &Timestamp{referenceTime},
  1001  		Permissions: &InstallationPermissions{
  1002  			Actions:                       String("a"),
  1003  			Administration:                String("ad"),
  1004  			Checks:                        String("c"),
  1005  			Contents:                      String("co"),
  1006  			ContentReferences:             String("cr"),
  1007  			Deployments:                   String("d"),
  1008  			Environments:                  String("e"),
  1009  			Issues:                        String("i"),
  1010  			Metadata:                      String("md"),
  1011  			Members:                       String("m"),
  1012  			OrganizationAdministration:    String("oa"),
  1013  			OrganizationHooks:             String("oh"),
  1014  			OrganizationPlan:              String("op"),
  1015  			OrganizationPreReceiveHooks:   String("opr"),
  1016  			OrganizationProjects:          String("op"),
  1017  			OrganizationSecrets:           String("os"),
  1018  			OrganizationSelfHostedRunners: String("osh"),
  1019  			OrganizationUserBlocking:      String("oub"),
  1020  			Packages:                      String("pkg"),
  1021  			Pages:                         String("pg"),
  1022  			PullRequests:                  String("pr"),
  1023  			RepositoryHooks:               String("rh"),
  1024  			RepositoryProjects:            String("rp"),
  1025  			RepositoryPreReceiveHooks:     String("rprh"),
  1026  			Secrets:                       String("s"),
  1027  			SecretScanningAlerts:          String("ssa"),
  1028  			SecurityEvents:                String("se"),
  1029  			SingleFile:                    String("sf"),
  1030  			Statuses:                      String("s"),
  1031  			TeamDiscussions:               String("td"),
  1032  			VulnerabilityAlerts:           String("va"),
  1033  			Workflows:                     String("w"),
  1034  		},
  1035  		Repositories: []*Repository{
  1036  			{
  1037  				ID:   Int64(1),
  1038  				URL:  String("u"),
  1039  				Name: String("n"),
  1040  			},
  1041  		},
  1042  	}
  1043  
  1044  	want := `{
  1045  		"token": "t",
  1046  		"expires_at": ` + referenceTimeStr + `,
  1047  		"permissions": {
  1048  			"actions": "a",
  1049  			"administration": "ad",
  1050  			"checks": "c",
  1051  			"contents": "co",
  1052  			"content_references": "cr",
  1053  			"deployments": "d",
  1054  			"environments": "e",
  1055  			"issues": "i",
  1056  			"metadata": "md",
  1057  			"members": "m",
  1058  			"organization_administration": "oa",
  1059  			"organization_hooks": "oh",
  1060  			"organization_plan": "op",
  1061  			"organization_pre_receive_hooks": "opr",
  1062  			"organization_projects": "op",
  1063  			"organization_secrets": "os",
  1064  			"organization_self_hosted_runners": "osh",
  1065  			"organization_user_blocking": "oub",
  1066  			"packages": "pkg",
  1067  			"pages": "pg",
  1068  			"pull_requests": "pr",
  1069  			"repository_hooks": "rh",
  1070  			"repository_projects": "rp",
  1071  			"repository_pre_receive_hooks": "rprh",
  1072  			"secrets": "s",
  1073  			"secret_scanning_alerts": "ssa",
  1074  			"security_events": "se",
  1075  			"single_file": "sf",
  1076  			"statuses": "s",
  1077  			"team_discussions": "td",
  1078  			"vulnerability_alerts": "va",
  1079  			"workflows": "w"
  1080  		},
  1081  		"repositories": [
  1082  			{
  1083  				"id": 1,
  1084  				"url": "u",
  1085  				"name": "n"
  1086  			}
  1087  		]
  1088  	}`
  1089  
  1090  	testJSONMarshal(t, u, want)
  1091  }
  1092  
  1093  func TestApp_Marshal(t *testing.T) {
  1094  	testJSONMarshal(t, &App{}, "{}")
  1095  
  1096  	u := &App{
  1097  		ID:     Int64(1),
  1098  		Slug:   String("s"),
  1099  		NodeID: String("nid"),
  1100  		Owner: &User{
  1101  			Login:           String("l"),
  1102  			ID:              Int64(1),
  1103  			URL:             String("u"),
  1104  			AvatarURL:       String("a"),
  1105  			GravatarID:      String("g"),
  1106  			Name:            String("n"),
  1107  			Company:         String("c"),
  1108  			Blog:            String("b"),
  1109  			Location:        String("l"),
  1110  			Email:           String("e"),
  1111  			Hireable:        Bool(true),
  1112  			Bio:             String("b"),
  1113  			TwitterUsername: String("t"),
  1114  			PublicRepos:     Int(1),
  1115  			Followers:       Int(1),
  1116  			Following:       Int(1),
  1117  			CreatedAt:       &Timestamp{referenceTime},
  1118  			SuspendedAt:     &Timestamp{referenceTime},
  1119  		},
  1120  		Name:        String("n"),
  1121  		Description: String("d"),
  1122  		ExternalURL: String("eu"),
  1123  		HTMLURL:     String("hu"),
  1124  		CreatedAt:   &Timestamp{referenceTime},
  1125  		UpdatedAt:   &Timestamp{referenceTime},
  1126  		Permissions: &InstallationPermissions{
  1127  			Actions:                       String("a"),
  1128  			Administration:                String("ad"),
  1129  			Checks:                        String("c"),
  1130  			Contents:                      String("co"),
  1131  			ContentReferences:             String("cr"),
  1132  			Deployments:                   String("d"),
  1133  			Environments:                  String("e"),
  1134  			Issues:                        String("i"),
  1135  			Metadata:                      String("md"),
  1136  			Members:                       String("m"),
  1137  			OrganizationAdministration:    String("oa"),
  1138  			OrganizationHooks:             String("oh"),
  1139  			OrganizationPlan:              String("op"),
  1140  			OrganizationPreReceiveHooks:   String("opr"),
  1141  			OrganizationProjects:          String("op"),
  1142  			OrganizationSecrets:           String("os"),
  1143  			OrganizationSelfHostedRunners: String("osh"),
  1144  			OrganizationUserBlocking:      String("oub"),
  1145  			Packages:                      String("pkg"),
  1146  			Pages:                         String("pg"),
  1147  			PullRequests:                  String("pr"),
  1148  			RepositoryHooks:               String("rh"),
  1149  			RepositoryProjects:            String("rp"),
  1150  			RepositoryPreReceiveHooks:     String("rprh"),
  1151  			Secrets:                       String("s"),
  1152  			SecretScanningAlerts:          String("ssa"),
  1153  			SecurityEvents:                String("se"),
  1154  			SingleFile:                    String("sf"),
  1155  			Statuses:                      String("s"),
  1156  			TeamDiscussions:               String("td"),
  1157  			VulnerabilityAlerts:           String("va"),
  1158  			Workflows:                     String("w"),
  1159  		},
  1160  		Events: []string{"s"},
  1161  	}
  1162  
  1163  	want := `{
  1164  		"id": 1,
  1165  		"slug": "s",
  1166  		"node_id": "nid",
  1167  		"owner": {
  1168  			"login": "l",
  1169  			"id": 1,
  1170  			"avatar_url": "a",
  1171  			"gravatar_id": "g",
  1172  			"name": "n",
  1173  			"company": "c",
  1174  			"blog": "b",
  1175  			"location": "l",
  1176  			"email": "e",
  1177  			"hireable": true,
  1178  			"bio": "b",
  1179  			"twitter_username": "t",
  1180  			"public_repos": 1,
  1181  			"followers": 1,
  1182  			"following": 1,
  1183  			"created_at": ` + referenceTimeStr + `,
  1184  			"suspended_at": ` + referenceTimeStr + `,
  1185  			"url": "u"
  1186  		},
  1187  		"name": "n",
  1188  		"description": "d",
  1189  		"external_url": "eu",
  1190  		"html_url": "hu",
  1191  		"created_at": ` + referenceTimeStr + `,
  1192  		"updated_at": ` + referenceTimeStr + `,
  1193  		"permissions": {
  1194  			"actions": "a",
  1195  			"administration": "ad",
  1196  			"checks": "c",
  1197  			"contents": "co",
  1198  			"content_references": "cr",
  1199  			"deployments": "d",
  1200  			"environments": "e",
  1201  			"issues": "i",
  1202  			"metadata": "md",
  1203  			"members": "m",
  1204  			"organization_administration": "oa",
  1205  			"organization_hooks": "oh",
  1206  			"organization_plan": "op",
  1207  			"organization_pre_receive_hooks": "opr",
  1208  			"organization_projects": "op",
  1209  			"organization_secrets": "os",
  1210  			"organization_self_hosted_runners": "osh",
  1211  			"organization_user_blocking": "oub",
  1212  			"packages": "pkg",
  1213  			"pages": "pg",
  1214  			"pull_requests": "pr",
  1215  			"repository_hooks": "rh",
  1216  			"repository_projects": "rp",
  1217  			"repository_pre_receive_hooks": "rprh",
  1218  			"secrets": "s",
  1219  			"secret_scanning_alerts": "ssa",
  1220  			"security_events": "se",
  1221  			"single_file": "sf",
  1222  			"statuses": "s",
  1223  			"team_discussions": "td",
  1224  			"vulnerability_alerts": "va",
  1225  			"workflows": "w"
  1226  		},
  1227  		"events": ["s"]
  1228  	}`
  1229  
  1230  	testJSONMarshal(t, u, want)
  1231  }
  1232  

View as plain text