github.com/google/go-github/v69@v69.2.0/github/teams_test.go (about)

     1  // Copyright 2018 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  	"bytes"
    10  	"context"
    11  	"encoding/json"
    12  	"fmt"
    13  	"io"
    14  	"net/http"
    15  	"testing"
    16  
    17  	"github.com/google/go-cmp/cmp"
    18  )
    19  
    20  func TestTeamsService_ListTeams(t *testing.T) {
    21  	t.Parallel()
    22  	client, mux, _ := setup(t)
    23  
    24  	mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) {
    25  		testMethod(t, r, "GET")
    26  		testFormValues(t, r, values{"page": "2"})
    27  		fmt.Fprint(w, `[{"id":1}]`)
    28  	})
    29  
    30  	opt := &ListOptions{Page: 2}
    31  	ctx := context.Background()
    32  	teams, _, err := client.Teams.ListTeams(ctx, "o", opt)
    33  	if err != nil {
    34  		t.Errorf("Teams.ListTeams returned error: %v", err)
    35  	}
    36  
    37  	want := []*Team{{ID: Ptr(int64(1))}}
    38  	if !cmp.Equal(teams, want) {
    39  		t.Errorf("Teams.ListTeams returned %+v, want %+v", teams, want)
    40  	}
    41  
    42  	const methodName = "ListTeams"
    43  	testBadOptions(t, methodName, func() (err error) {
    44  		_, _, err = client.Teams.ListTeams(ctx, "\n", opt)
    45  		return err
    46  	})
    47  
    48  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    49  		got, resp, err := client.Teams.ListTeams(ctx, "o", opt)
    50  		if got != nil {
    51  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    52  		}
    53  		return resp, err
    54  	})
    55  }
    56  
    57  func TestTeamsService_ListTeams_invalidOrg(t *testing.T) {
    58  	t.Parallel()
    59  	client, _, _ := setup(t)
    60  
    61  	ctx := context.Background()
    62  	_, _, err := client.Teams.ListTeams(ctx, "%", nil)
    63  	testURLParseError(t, err)
    64  }
    65  
    66  func TestTeamsService_GetTeamByID(t *testing.T) {
    67  	t.Parallel()
    68  	client, mux, _ := setup(t)
    69  
    70  	mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) {
    71  		testMethod(t, r, "GET")
    72  		fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`)
    73  	})
    74  
    75  	ctx := context.Background()
    76  	team, _, err := client.Teams.GetTeamByID(ctx, 1, 1)
    77  	if err != nil {
    78  		t.Errorf("Teams.GetTeamByID returned error: %v", err)
    79  	}
    80  
    81  	want := &Team{ID: Ptr(int64(1)), Name: Ptr("n"), Description: Ptr("d"), URL: Ptr("u"), Slug: Ptr("s"), Permission: Ptr("p"), LDAPDN: Ptr("cn=n,ou=groups,dc=example,dc=com")}
    82  	if !cmp.Equal(team, want) {
    83  		t.Errorf("Teams.GetTeamByID returned %+v, want %+v", team, want)
    84  	}
    85  
    86  	const methodName = "GetTeamByID"
    87  	testBadOptions(t, methodName, func() (err error) {
    88  		_, _, err = client.Teams.GetTeamByID(ctx, -1, -1)
    89  		return err
    90  	})
    91  
    92  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    93  		got, resp, err := client.Teams.GetTeamByID(ctx, 1, 1)
    94  		if got != nil {
    95  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    96  		}
    97  		return resp, err
    98  	})
    99  }
   100  
   101  func TestTeamsService_GetTeamByID_notFound(t *testing.T) {
   102  	t.Parallel()
   103  	client, mux, _ := setup(t)
   104  
   105  	mux.HandleFunc("/organizations/1/team/2", func(w http.ResponseWriter, r *http.Request) {
   106  		testMethod(t, r, "GET")
   107  		w.WriteHeader(http.StatusNotFound)
   108  	})
   109  
   110  	ctx := context.Background()
   111  	team, resp, err := client.Teams.GetTeamByID(ctx, 1, 2)
   112  	if err == nil {
   113  		t.Errorf("Expected HTTP 404 response")
   114  	}
   115  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
   116  		t.Errorf("Teams.GetTeamByID returned status %d, want %d", got, want)
   117  	}
   118  	if team != nil {
   119  		t.Errorf("Teams.GetTeamByID returned %+v, want nil", team)
   120  	}
   121  }
   122  
   123  func TestTeamsService_GetTeamBySlug(t *testing.T) {
   124  	t.Parallel()
   125  	client, mux, _ := setup(t)
   126  
   127  	mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) {
   128  		testMethod(t, r, "GET")
   129  		fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`)
   130  	})
   131  
   132  	ctx := context.Background()
   133  	team, _, err := client.Teams.GetTeamBySlug(ctx, "o", "s")
   134  	if err != nil {
   135  		t.Errorf("Teams.GetTeamBySlug returned error: %v", err)
   136  	}
   137  
   138  	want := &Team{ID: Ptr(int64(1)), Name: Ptr("n"), Description: Ptr("d"), URL: Ptr("u"), Slug: Ptr("s"), Permission: Ptr("p"), LDAPDN: Ptr("cn=n,ou=groups,dc=example,dc=com")}
   139  	if !cmp.Equal(team, want) {
   140  		t.Errorf("Teams.GetTeamBySlug returned %+v, want %+v", team, want)
   141  	}
   142  
   143  	const methodName = "GetTeamBySlug"
   144  	testBadOptions(t, methodName, func() (err error) {
   145  		_, _, err = client.Teams.GetTeamBySlug(ctx, "\n", "\n")
   146  		return err
   147  	})
   148  
   149  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   150  		got, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s")
   151  		if got != nil {
   152  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   153  		}
   154  		return resp, err
   155  	})
   156  }
   157  
   158  func TestTeamsService_GetTeamBySlug_invalidOrg(t *testing.T) {
   159  	t.Parallel()
   160  	client, _, _ := setup(t)
   161  
   162  	ctx := context.Background()
   163  	_, _, err := client.Teams.GetTeamBySlug(ctx, "%", "s")
   164  	testURLParseError(t, err)
   165  }
   166  
   167  func TestTeamsService_GetTeamBySlug_notFound(t *testing.T) {
   168  	t.Parallel()
   169  	client, mux, _ := setup(t)
   170  
   171  	mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) {
   172  		testMethod(t, r, "GET")
   173  		w.WriteHeader(http.StatusNotFound)
   174  	})
   175  
   176  	ctx := context.Background()
   177  	team, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s")
   178  	if err == nil {
   179  		t.Errorf("Expected HTTP 404 response")
   180  	}
   181  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
   182  		t.Errorf("Teams.GetTeamBySlug returned status %d, want %d", got, want)
   183  	}
   184  	if team != nil {
   185  		t.Errorf("Teams.GetTeamBySlug returned %+v, want nil", team)
   186  	}
   187  }
   188  
   189  func TestTeamsService_CreateTeam(t *testing.T) {
   190  	t.Parallel()
   191  	client, mux, _ := setup(t)
   192  
   193  	input := NewTeam{Name: "n", Privacy: Ptr("closed"), RepoNames: []string{"r"}}
   194  
   195  	mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) {
   196  		v := new(NewTeam)
   197  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   198  
   199  		testMethod(t, r, "POST")
   200  		if !cmp.Equal(v, &input) {
   201  			t.Errorf("Request body = %+v, want %+v", v, input)
   202  		}
   203  
   204  		fmt.Fprint(w, `{"id":1}`)
   205  	})
   206  
   207  	ctx := context.Background()
   208  	team, _, err := client.Teams.CreateTeam(ctx, "o", input)
   209  	if err != nil {
   210  		t.Errorf("Teams.CreateTeam returned error: %v", err)
   211  	}
   212  
   213  	want := &Team{ID: Ptr(int64(1))}
   214  	if !cmp.Equal(team, want) {
   215  		t.Errorf("Teams.CreateTeam returned %+v, want %+v", team, want)
   216  	}
   217  
   218  	const methodName = "CreateTeam"
   219  	testBadOptions(t, methodName, func() (err error) {
   220  		_, _, err = client.Teams.CreateTeam(ctx, "\n", input)
   221  		return err
   222  	})
   223  
   224  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   225  		got, resp, err := client.Teams.CreateTeam(ctx, "o", input)
   226  		if got != nil {
   227  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   228  		}
   229  		return resp, err
   230  	})
   231  }
   232  
   233  func TestTeamsService_CreateTeam_invalidOrg(t *testing.T) {
   234  	t.Parallel()
   235  	client, _, _ := setup(t)
   236  
   237  	ctx := context.Background()
   238  	_, _, err := client.Teams.CreateTeam(ctx, "%", NewTeam{})
   239  	testURLParseError(t, err)
   240  }
   241  
   242  func TestTeamsService_EditTeamByID(t *testing.T) {
   243  	t.Parallel()
   244  	client, mux, _ := setup(t)
   245  
   246  	input := NewTeam{Name: "n", Privacy: Ptr("closed")}
   247  
   248  	mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) {
   249  		v := new(NewTeam)
   250  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   251  
   252  		testMethod(t, r, "PATCH")
   253  		if !cmp.Equal(v, &input) {
   254  			t.Errorf("Request body = %+v, want %+v", v, input)
   255  		}
   256  
   257  		fmt.Fprint(w, `{"id":1}`)
   258  	})
   259  
   260  	ctx := context.Background()
   261  	team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false)
   262  	if err != nil {
   263  		t.Errorf("Teams.EditTeamByID returned error: %v", err)
   264  	}
   265  
   266  	want := &Team{ID: Ptr(int64(1))}
   267  	if !cmp.Equal(team, want) {
   268  		t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want)
   269  	}
   270  
   271  	const methodName = "EditTeamByID"
   272  	testBadOptions(t, methodName, func() (err error) {
   273  		_, _, err = client.Teams.EditTeamByID(ctx, -1, -1, input, false)
   274  		return err
   275  	})
   276  
   277  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   278  		got, resp, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false)
   279  		if got != nil {
   280  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   281  		}
   282  		return resp, err
   283  	})
   284  }
   285  
   286  func TestTeamsService_EditTeamByID_RemoveParent(t *testing.T) {
   287  	t.Parallel()
   288  	client, mux, _ := setup(t)
   289  
   290  	input := NewTeam{Name: "n", NotificationSetting: Ptr("notifications_enabled"), Privacy: Ptr("closed")}
   291  	var body string
   292  
   293  	mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) {
   294  		v := new(NewTeam)
   295  		buf, err := io.ReadAll(r.Body)
   296  		if err != nil {
   297  			t.Errorf("Unable to read body: %v", err)
   298  		}
   299  		body = string(buf)
   300  		assertNilError(t, json.NewDecoder(bytes.NewBuffer(buf)).Decode(v))
   301  
   302  		testMethod(t, r, "PATCH")
   303  		if !cmp.Equal(v, &input) {
   304  			t.Errorf("Request body = %+v, want %+v", v, input)
   305  		}
   306  
   307  		fmt.Fprint(w, `{"id":1}`)
   308  	})
   309  
   310  	ctx := context.Background()
   311  	team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, true)
   312  	if err != nil {
   313  		t.Errorf("Teams.EditTeamByID returned error: %v", err)
   314  	}
   315  
   316  	want := &Team{ID: Ptr(int64(1))}
   317  	if !cmp.Equal(team, want) {
   318  		t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want)
   319  	}
   320  
   321  	if want := `{"name":"n","parent_team_id":null,"notification_setting":"notifications_enabled","privacy":"closed"}` + "\n"; body != want {
   322  		t.Errorf("Teams.EditTeamByID body = %+v, want %+v", body, want)
   323  	}
   324  }
   325  
   326  func TestTeamsService_EditTeamBySlug(t *testing.T) {
   327  	t.Parallel()
   328  	client, mux, _ := setup(t)
   329  
   330  	input := NewTeam{Name: "n", Privacy: Ptr("closed")}
   331  
   332  	mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) {
   333  		v := new(NewTeam)
   334  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   335  
   336  		testMethod(t, r, "PATCH")
   337  		if !cmp.Equal(v, &input) {
   338  			t.Errorf("Request body = %+v, want %+v", v, input)
   339  		}
   340  
   341  		fmt.Fprint(w, `{"id":1}`)
   342  	})
   343  
   344  	ctx := context.Background()
   345  	team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false)
   346  	if err != nil {
   347  		t.Errorf("Teams.EditTeamBySlug returned error: %v", err)
   348  	}
   349  
   350  	want := &Team{ID: Ptr(int64(1))}
   351  	if !cmp.Equal(team, want) {
   352  		t.Errorf("Teams.EditTeamBySlug returned %+v, want %+v", team, want)
   353  	}
   354  
   355  	const methodName = "EditTeamBySlug"
   356  	testBadOptions(t, methodName, func() (err error) {
   357  		_, _, err = client.Teams.EditTeamBySlug(ctx, "\n", "\n", input, false)
   358  		return err
   359  	})
   360  
   361  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   362  		got, resp, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false)
   363  		if got != nil {
   364  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   365  		}
   366  		return resp, err
   367  	})
   368  }
   369  
   370  func TestTeamsService_EditTeamBySlug_RemoveParent(t *testing.T) {
   371  	t.Parallel()
   372  	client, mux, _ := setup(t)
   373  
   374  	input := NewTeam{Name: "n", NotificationSetting: Ptr("notifications_disabled"), Privacy: Ptr("closed")}
   375  	var body string
   376  
   377  	mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) {
   378  		v := new(NewTeam)
   379  		buf, err := io.ReadAll(r.Body)
   380  		if err != nil {
   381  			t.Errorf("Unable to read body: %v", err)
   382  		}
   383  		body = string(buf)
   384  		assertNilError(t, json.NewDecoder(bytes.NewBuffer(buf)).Decode(v))
   385  
   386  		testMethod(t, r, "PATCH")
   387  		if !cmp.Equal(v, &input) {
   388  			t.Errorf("Request body = %+v, want %+v", v, input)
   389  		}
   390  
   391  		fmt.Fprint(w, `{"id":1}`)
   392  	})
   393  
   394  	ctx := context.Background()
   395  	team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, true)
   396  	if err != nil {
   397  		t.Errorf("Teams.EditTeam returned error: %v", err)
   398  	}
   399  
   400  	want := &Team{ID: Ptr(int64(1))}
   401  	if !cmp.Equal(team, want) {
   402  		t.Errorf("Teams.EditTeam returned %+v, want %+v", team, want)
   403  	}
   404  
   405  	if want := `{"name":"n","parent_team_id":null,"notification_setting":"notifications_disabled","privacy":"closed"}` + "\n"; body != want {
   406  		t.Errorf("Teams.EditTeam body = %+v, want %+v", body, want)
   407  	}
   408  }
   409  
   410  func TestTeamsService_DeleteTeamByID(t *testing.T) {
   411  	t.Parallel()
   412  	client, mux, _ := setup(t)
   413  
   414  	mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) {
   415  		testMethod(t, r, "DELETE")
   416  	})
   417  
   418  	ctx := context.Background()
   419  	_, err := client.Teams.DeleteTeamByID(ctx, 1, 1)
   420  	if err != nil {
   421  		t.Errorf("Teams.DeleteTeamByID returned error: %v", err)
   422  	}
   423  
   424  	const methodName = "DeleteTeamByID"
   425  	testBadOptions(t, methodName, func() (err error) {
   426  		_, err = client.Teams.DeleteTeamByID(ctx, -1, -1)
   427  		return err
   428  	})
   429  
   430  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   431  		return client.Teams.DeleteTeamByID(ctx, 1, 1)
   432  	})
   433  }
   434  
   435  func TestTeamsService_DeleteTeamBySlug(t *testing.T) {
   436  	t.Parallel()
   437  	client, mux, _ := setup(t)
   438  
   439  	mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) {
   440  		testMethod(t, r, "DELETE")
   441  	})
   442  
   443  	ctx := context.Background()
   444  	_, err := client.Teams.DeleteTeamBySlug(ctx, "o", "s")
   445  	if err != nil {
   446  		t.Errorf("Teams.DeleteTeamBySlug returned error: %v", err)
   447  	}
   448  
   449  	const methodName = "DeleteTeamBySlug"
   450  	testBadOptions(t, methodName, func() (err error) {
   451  		_, err = client.Teams.DeleteTeamBySlug(ctx, "\n", "\n")
   452  		return err
   453  	})
   454  
   455  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   456  		return client.Teams.DeleteTeamBySlug(ctx, "o", "s")
   457  	})
   458  }
   459  
   460  func TestTeamsService_ListChildTeamsByParentID(t *testing.T) {
   461  	t.Parallel()
   462  	client, mux, _ := setup(t)
   463  
   464  	mux.HandleFunc("/organizations/1/team/2/teams", func(w http.ResponseWriter, r *http.Request) {
   465  		testMethod(t, r, "GET")
   466  		testFormValues(t, r, values{"page": "2"})
   467  		fmt.Fprint(w, `[{"id":2}]`)
   468  	})
   469  
   470  	opt := &ListOptions{Page: 2}
   471  	ctx := context.Background()
   472  	teams, _, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt)
   473  	if err != nil {
   474  		t.Errorf("Teams.ListChildTeamsByParentID returned error: %v", err)
   475  	}
   476  
   477  	want := []*Team{{ID: Ptr(int64(2))}}
   478  	if !cmp.Equal(teams, want) {
   479  		t.Errorf("Teams.ListChildTeamsByParentID returned %+v, want %+v", teams, want)
   480  	}
   481  
   482  	const methodName = "ListChildTeamsByParentID"
   483  	testBadOptions(t, methodName, func() (err error) {
   484  		_, _, err = client.Teams.ListChildTeamsByParentID(ctx, -1, -2, opt)
   485  		return err
   486  	})
   487  
   488  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   489  		got, resp, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt)
   490  		if got != nil {
   491  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   492  		}
   493  		return resp, err
   494  	})
   495  }
   496  
   497  func TestTeamsService_ListChildTeamsByParentSlug(t *testing.T) {
   498  	t.Parallel()
   499  	client, mux, _ := setup(t)
   500  
   501  	mux.HandleFunc("/orgs/o/teams/s/teams", func(w http.ResponseWriter, r *http.Request) {
   502  		testMethod(t, r, "GET")
   503  		testFormValues(t, r, values{"page": "2"})
   504  		fmt.Fprint(w, `[{"id":2}]`)
   505  	})
   506  
   507  	opt := &ListOptions{Page: 2}
   508  	ctx := context.Background()
   509  	teams, _, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt)
   510  	if err != nil {
   511  		t.Errorf("Teams.ListChildTeamsByParentSlug returned error: %v", err)
   512  	}
   513  
   514  	want := []*Team{{ID: Ptr(int64(2))}}
   515  	if !cmp.Equal(teams, want) {
   516  		t.Errorf("Teams.ListChildTeamsByParentSlug returned %+v, want %+v", teams, want)
   517  	}
   518  
   519  	const methodName = "ListChildTeamsByParentSlug"
   520  	testBadOptions(t, methodName, func() (err error) {
   521  		_, _, err = client.Teams.ListChildTeamsByParentSlug(ctx, "\n", "\n", opt)
   522  		return err
   523  	})
   524  
   525  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   526  		got, resp, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt)
   527  		if got != nil {
   528  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   529  		}
   530  		return resp, err
   531  	})
   532  }
   533  
   534  func TestTeamsService_ListTeamReposByID(t *testing.T) {
   535  	t.Parallel()
   536  	client, mux, _ := setup(t)
   537  
   538  	mux.HandleFunc("/organizations/1/team/1/repos", func(w http.ResponseWriter, r *http.Request) {
   539  		testMethod(t, r, "GET")
   540  		testHeader(t, r, "Accept", mediaTypeTopicsPreview)
   541  		testFormValues(t, r, values{"page": "2"})
   542  		fmt.Fprint(w, `[{"id":1}]`)
   543  	})
   544  
   545  	opt := &ListOptions{Page: 2}
   546  	ctx := context.Background()
   547  	members, _, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt)
   548  	if err != nil {
   549  		t.Errorf("Teams.ListTeamReposByID returned error: %v", err)
   550  	}
   551  
   552  	want := []*Repository{{ID: Ptr(int64(1))}}
   553  	if !cmp.Equal(members, want) {
   554  		t.Errorf("Teams.ListTeamReposByID returned %+v, want %+v", members, want)
   555  	}
   556  
   557  	const methodName = "ListTeamReposByID"
   558  	testBadOptions(t, methodName, func() (err error) {
   559  		_, _, err = client.Teams.ListTeamReposByID(ctx, -1, -1, opt)
   560  		return err
   561  	})
   562  
   563  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   564  		got, resp, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt)
   565  		if got != nil {
   566  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   567  		}
   568  		return resp, err
   569  	})
   570  }
   571  
   572  func TestTeamsService_ListTeamReposBySlug(t *testing.T) {
   573  	t.Parallel()
   574  	client, mux, _ := setup(t)
   575  
   576  	mux.HandleFunc("/orgs/o/teams/s/repos", func(w http.ResponseWriter, r *http.Request) {
   577  		testMethod(t, r, "GET")
   578  		testHeader(t, r, "Accept", mediaTypeTopicsPreview)
   579  		testFormValues(t, r, values{"page": "2"})
   580  		fmt.Fprint(w, `[{"id":1}]`)
   581  	})
   582  
   583  	opt := &ListOptions{Page: 2}
   584  	ctx := context.Background()
   585  	members, _, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt)
   586  	if err != nil {
   587  		t.Errorf("Teams.ListTeamReposBySlug returned error: %v", err)
   588  	}
   589  
   590  	want := []*Repository{{ID: Ptr(int64(1))}}
   591  	if !cmp.Equal(members, want) {
   592  		t.Errorf("Teams.ListTeamReposBySlug returned %+v, want %+v", members, want)
   593  	}
   594  
   595  	const methodName = "ListTeamReposBySlug"
   596  	testBadOptions(t, methodName, func() (err error) {
   597  		_, _, err = client.Teams.ListTeamReposBySlug(ctx, "\n", "\n", opt)
   598  		return err
   599  	})
   600  
   601  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   602  		got, resp, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt)
   603  		if got != nil {
   604  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   605  		}
   606  		return resp, err
   607  	})
   608  }
   609  
   610  func TestTeamsService_IsTeamRepoByID_true(t *testing.T) {
   611  	t.Parallel()
   612  	client, mux, _ := setup(t)
   613  
   614  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   615  		testMethod(t, r, "GET")
   616  		testHeader(t, r, "Accept", mediaTypeOrgPermissionRepo)
   617  		fmt.Fprint(w, `{"id":1}`)
   618  	})
   619  
   620  	ctx := context.Background()
   621  	repo, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo")
   622  	if err != nil {
   623  		t.Errorf("Teams.IsTeamRepoByID returned error: %v", err)
   624  	}
   625  
   626  	want := &Repository{ID: Ptr(int64(1))}
   627  	if !cmp.Equal(repo, want) {
   628  		t.Errorf("Teams.IsTeamRepoByID returned %+v, want %+v", repo, want)
   629  	}
   630  
   631  	const methodName = "IsTeamRepoByID"
   632  	testBadOptions(t, methodName, func() (err error) {
   633  		_, _, err = client.Teams.IsTeamRepoByID(ctx, -1, -1, "\n", "\n")
   634  		return err
   635  	})
   636  
   637  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   638  		got, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo")
   639  		if got != nil {
   640  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   641  		}
   642  		return resp, err
   643  	})
   644  }
   645  
   646  func TestTeamsService_IsTeamRepoBySlug_true(t *testing.T) {
   647  	t.Parallel()
   648  	client, mux, _ := setup(t)
   649  
   650  	mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   651  		testMethod(t, r, "GET")
   652  		testHeader(t, r, "Accept", mediaTypeOrgPermissionRepo)
   653  		fmt.Fprint(w, `{"id":1}`)
   654  	})
   655  
   656  	ctx := context.Background()
   657  	repo, _, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   658  	if err != nil {
   659  		t.Errorf("Teams.IsTeamRepoBySlug returned error: %v", err)
   660  	}
   661  
   662  	want := &Repository{ID: Ptr(int64(1))}
   663  	if !cmp.Equal(repo, want) {
   664  		t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want %+v", repo, want)
   665  	}
   666  
   667  	const methodName = "IsTeamRepoBySlug"
   668  	testBadOptions(t, methodName, func() (err error) {
   669  		_, _, err = client.Teams.IsTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n")
   670  		return err
   671  	})
   672  
   673  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   674  		got, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   675  		if got != nil {
   676  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   677  		}
   678  		return resp, err
   679  	})
   680  }
   681  
   682  func TestTeamsService_IsTeamRepoByID_false(t *testing.T) {
   683  	t.Parallel()
   684  	client, mux, _ := setup(t)
   685  
   686  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   687  		testMethod(t, r, "GET")
   688  		w.WriteHeader(http.StatusNotFound)
   689  	})
   690  
   691  	ctx := context.Background()
   692  	repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo")
   693  	if err == nil {
   694  		t.Errorf("Expected HTTP 404 response")
   695  	}
   696  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
   697  		t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want)
   698  	}
   699  	if repo != nil {
   700  		t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo)
   701  	}
   702  }
   703  
   704  func TestTeamsService_IsTeamRepoBySlug_false(t *testing.T) {
   705  	t.Parallel()
   706  	client, mux, _ := setup(t)
   707  
   708  	mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) {
   709  		testMethod(t, r, "GET")
   710  		w.WriteHeader(http.StatusNotFound)
   711  	})
   712  
   713  	ctx := context.Background()
   714  	repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   715  	if err == nil {
   716  		t.Errorf("Expected HTTP 404 response")
   717  	}
   718  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
   719  		t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want)
   720  	}
   721  	if repo != nil {
   722  		t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo)
   723  	}
   724  }
   725  
   726  func TestTeamsService_IsTeamRepoByID_error(t *testing.T) {
   727  	t.Parallel()
   728  	client, mux, _ := setup(t)
   729  
   730  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   731  		testMethod(t, r, "GET")
   732  		http.Error(w, "BadRequest", http.StatusBadRequest)
   733  	})
   734  
   735  	ctx := context.Background()
   736  	repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo")
   737  	if err == nil {
   738  		t.Errorf("Expected HTTP 400 response")
   739  	}
   740  	if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want {
   741  		t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want)
   742  	}
   743  	if repo != nil {
   744  		t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo)
   745  	}
   746  }
   747  
   748  func TestTeamsService_IsTeamRepoBySlug_error(t *testing.T) {
   749  	t.Parallel()
   750  	client, mux, _ := setup(t)
   751  
   752  	mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   753  		testMethod(t, r, "GET")
   754  		http.Error(w, "BadRequest", http.StatusBadRequest)
   755  	})
   756  
   757  	ctx := context.Background()
   758  	repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   759  	if err == nil {
   760  		t.Errorf("Expected HTTP 400 response")
   761  	}
   762  	if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want {
   763  		t.Errorf("Teams.IsTeamRepoBySlug returned status %d, want %d", got, want)
   764  	}
   765  	if repo != nil {
   766  		t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want nil", repo)
   767  	}
   768  }
   769  
   770  func TestTeamsService_IsTeamRepoByID_invalidOwner(t *testing.T) {
   771  	t.Parallel()
   772  	client, _, _ := setup(t)
   773  
   774  	ctx := context.Background()
   775  	_, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "%", "r")
   776  	testURLParseError(t, err)
   777  }
   778  
   779  func TestTeamsService_IsTeamRepoBySlug_invalidOwner(t *testing.T) {
   780  	t.Parallel()
   781  	client, _, _ := setup(t)
   782  
   783  	ctx := context.Background()
   784  	_, _, err := client.Teams.IsTeamRepoBySlug(ctx, "o", "s", "%", "r")
   785  	testURLParseError(t, err)
   786  }
   787  
   788  func TestTeamsService_AddTeamRepoByID(t *testing.T) {
   789  	t.Parallel()
   790  	client, mux, _ := setup(t)
   791  
   792  	opt := &TeamAddTeamRepoOptions{Permission: "admin"}
   793  
   794  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   795  		v := new(TeamAddTeamRepoOptions)
   796  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   797  
   798  		testMethod(t, r, "PUT")
   799  		if !cmp.Equal(v, opt) {
   800  			t.Errorf("Request body = %+v, want %+v", v, opt)
   801  		}
   802  
   803  		w.WriteHeader(http.StatusNoContent)
   804  	})
   805  
   806  	ctx := context.Background()
   807  	_, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt)
   808  	if err != nil {
   809  		t.Errorf("Teams.AddTeamRepoByID returned error: %v", err)
   810  	}
   811  
   812  	const methodName = "AddTeamRepoByID"
   813  	testBadOptions(t, methodName, func() (err error) {
   814  		_, err = client.Teams.AddTeamRepoByID(ctx, 1, 1, "\n", "\n", opt)
   815  		return err
   816  	})
   817  
   818  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   819  		return client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt)
   820  	})
   821  }
   822  
   823  func TestTeamsService_AddTeamRepoBySlug(t *testing.T) {
   824  	t.Parallel()
   825  	client, mux, _ := setup(t)
   826  
   827  	opt := &TeamAddTeamRepoOptions{Permission: "admin"}
   828  
   829  	mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   830  		v := new(TeamAddTeamRepoOptions)
   831  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   832  
   833  		testMethod(t, r, "PUT")
   834  		if !cmp.Equal(v, opt) {
   835  			t.Errorf("Request body = %+v, want %+v", v, opt)
   836  		}
   837  
   838  		w.WriteHeader(http.StatusNoContent)
   839  	})
   840  
   841  	ctx := context.Background()
   842  	_, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt)
   843  	if err != nil {
   844  		t.Errorf("Teams.AddTeamRepoBySlug returned error: %v", err)
   845  	}
   846  
   847  	const methodName = "AddTeamRepoBySlug"
   848  	testBadOptions(t, methodName, func() (err error) {
   849  		_, err = client.Teams.AddTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n", opt)
   850  		return err
   851  	})
   852  
   853  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   854  		return client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt)
   855  	})
   856  }
   857  
   858  func TestTeamsService_AddTeamRepoByID_noAccess(t *testing.T) {
   859  	t.Parallel()
   860  	client, mux, _ := setup(t)
   861  
   862  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   863  		testMethod(t, r, "PUT")
   864  		w.WriteHeader(http.StatusUnprocessableEntity)
   865  	})
   866  
   867  	ctx := context.Background()
   868  	_, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", nil)
   869  	if err == nil {
   870  		t.Errorf("Expected error to be returned")
   871  	}
   872  }
   873  
   874  func TestTeamsService_AddTeamRepoBySlug_noAccess(t *testing.T) {
   875  	t.Parallel()
   876  	client, mux, _ := setup(t)
   877  
   878  	mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) {
   879  		testMethod(t, r, "PUT")
   880  		w.WriteHeader(http.StatusUnprocessableEntity)
   881  	})
   882  
   883  	ctx := context.Background()
   884  	_, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", nil)
   885  	if err == nil {
   886  		t.Errorf("Expected error to be returned")
   887  	}
   888  }
   889  
   890  func TestTeamsService_AddTeamRepoByID_invalidOwner(t *testing.T) {
   891  	t.Parallel()
   892  	client, _, _ := setup(t)
   893  
   894  	ctx := context.Background()
   895  	_, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "%", "r", nil)
   896  	testURLParseError(t, err)
   897  }
   898  
   899  func TestTeamsService_AddTeamRepoBySlug_invalidOwner(t *testing.T) {
   900  	t.Parallel()
   901  	client, _, _ := setup(t)
   902  
   903  	ctx := context.Background()
   904  	_, err := client.Teams.AddTeamRepoBySlug(ctx, "o", "s", "%", "r", nil)
   905  	testURLParseError(t, err)
   906  }
   907  
   908  func TestTeamsService_RemoveTeamRepoByID(t *testing.T) {
   909  	t.Parallel()
   910  	client, mux, _ := setup(t)
   911  
   912  	mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   913  		testMethod(t, r, "DELETE")
   914  		w.WriteHeader(http.StatusNoContent)
   915  	})
   916  
   917  	ctx := context.Background()
   918  	_, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo")
   919  	if err != nil {
   920  		t.Errorf("Teams.RemoveTeamRepoByID returned error: %v", err)
   921  	}
   922  
   923  	const methodName = "RemoveTeamRepoByID"
   924  	testBadOptions(t, methodName, func() (err error) {
   925  		_, err = client.Teams.RemoveTeamRepoByID(ctx, -1, -1, "\n", "\n")
   926  		return err
   927  	})
   928  
   929  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   930  		return client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo")
   931  	})
   932  }
   933  
   934  func TestTeamsService_RemoveTeamRepoBySlug(t *testing.T) {
   935  	t.Parallel()
   936  	client, mux, _ := setup(t)
   937  
   938  	mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) {
   939  		testMethod(t, r, "DELETE")
   940  		w.WriteHeader(http.StatusNoContent)
   941  	})
   942  
   943  	ctx := context.Background()
   944  	_, err := client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   945  	if err != nil {
   946  		t.Errorf("Teams.RemoveTeamRepoBySlug returned error: %v", err)
   947  	}
   948  
   949  	const methodName = "RemoveTeamRepoBySlug"
   950  	testBadOptions(t, methodName, func() (err error) {
   951  		_, err = client.Teams.RemoveTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n")
   952  		return err
   953  	})
   954  
   955  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   956  		return client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo")
   957  	})
   958  }
   959  
   960  func TestTeamsService_RemoveTeamRepoByID_invalidOwner(t *testing.T) {
   961  	t.Parallel()
   962  	client, _, _ := setup(t)
   963  
   964  	ctx := context.Background()
   965  	_, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "%", "r")
   966  	testURLParseError(t, err)
   967  }
   968  
   969  func TestTeamsService_RemoveTeamRepoBySlug_invalidOwner(t *testing.T) {
   970  	t.Parallel()
   971  	client, _, _ := setup(t)
   972  
   973  	ctx := context.Background()
   974  	_, err := client.Teams.RemoveTeamRepoBySlug(ctx, "o", "s", "%", "r")
   975  	testURLParseError(t, err)
   976  }
   977  
   978  func TestTeamsService_ListUserTeams(t *testing.T) {
   979  	t.Parallel()
   980  	client, mux, _ := setup(t)
   981  
   982  	mux.HandleFunc("/user/teams", func(w http.ResponseWriter, r *http.Request) {
   983  		testMethod(t, r, "GET")
   984  		testFormValues(t, r, values{"page": "1"})
   985  		fmt.Fprint(w, `[{"id":1}]`)
   986  	})
   987  
   988  	opt := &ListOptions{Page: 1}
   989  	ctx := context.Background()
   990  	teams, _, err := client.Teams.ListUserTeams(ctx, opt)
   991  	if err != nil {
   992  		t.Errorf("Teams.ListUserTeams returned error: %v", err)
   993  	}
   994  
   995  	want := []*Team{{ID: Ptr(int64(1))}}
   996  	if !cmp.Equal(teams, want) {
   997  		t.Errorf("Teams.ListUserTeams returned %+v, want %+v", teams, want)
   998  	}
   999  
  1000  	const methodName = "ListUserTeams"
  1001  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1002  		got, resp, err := client.Teams.ListUserTeams(ctx, opt)
  1003  		if got != nil {
  1004  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1005  		}
  1006  		return resp, err
  1007  	})
  1008  }
  1009  
  1010  func TestTeamsService_ListProjectsByID(t *testing.T) {
  1011  	t.Parallel()
  1012  	client, mux, _ := setup(t)
  1013  
  1014  	mux.HandleFunc("/organizations/1/team/1/projects", func(w http.ResponseWriter, r *http.Request) {
  1015  		testMethod(t, r, "GET")
  1016  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1017  		fmt.Fprint(w, `[{"id":1}]`)
  1018  	})
  1019  
  1020  	ctx := context.Background()
  1021  	projects, _, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1)
  1022  	if err != nil {
  1023  		t.Errorf("Teams.ListTeamProjectsByID returned error: %v", err)
  1024  	}
  1025  
  1026  	want := []*ProjectV2{{ID: Ptr(int64(1))}}
  1027  	if !cmp.Equal(projects, want) {
  1028  		t.Errorf("Teams.ListTeamProjectsByID returned %+v, want %+v", projects, want)
  1029  	}
  1030  
  1031  	const methodName = "ListTeamProjectsByID"
  1032  	testBadOptions(t, methodName, func() (err error) {
  1033  		_, _, err = client.Teams.ListTeamProjectsByID(ctx, -1, -1)
  1034  		return err
  1035  	})
  1036  
  1037  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1038  		got, resp, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1)
  1039  		if got != nil {
  1040  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1041  		}
  1042  		return resp, err
  1043  	})
  1044  }
  1045  
  1046  func TestTeamsService_ListProjectsBySlug(t *testing.T) {
  1047  	t.Parallel()
  1048  	client, mux, _ := setup(t)
  1049  
  1050  	mux.HandleFunc("/orgs/o/teams/s/projects", func(w http.ResponseWriter, r *http.Request) {
  1051  		testMethod(t, r, "GET")
  1052  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1053  		fmt.Fprint(w, `[{"id":1}]`)
  1054  	})
  1055  
  1056  	ctx := context.Background()
  1057  	projects, _, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s")
  1058  	if err != nil {
  1059  		t.Errorf("Teams.ListTeamProjectsBySlug returned error: %v", err)
  1060  	}
  1061  
  1062  	want := []*ProjectV2{{ID: Ptr(int64(1))}}
  1063  	if !cmp.Equal(projects, want) {
  1064  		t.Errorf("Teams.ListTeamProjectsBySlug returned %+v, want %+v", projects, want)
  1065  	}
  1066  
  1067  	const methodName = "ListTeamProjectsBySlug"
  1068  	testBadOptions(t, methodName, func() (err error) {
  1069  		_, _, err = client.Teams.ListTeamProjectsBySlug(ctx, "\n", "\n")
  1070  		return err
  1071  	})
  1072  
  1073  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1074  		got, resp, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s")
  1075  		if got != nil {
  1076  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1077  		}
  1078  		return resp, err
  1079  	})
  1080  }
  1081  
  1082  func TestTeamsService_ReviewProjectsByID(t *testing.T) {
  1083  	t.Parallel()
  1084  	client, mux, _ := setup(t)
  1085  
  1086  	mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1087  		testMethod(t, r, "GET")
  1088  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1089  		fmt.Fprint(w, `{"id":1}`)
  1090  	})
  1091  
  1092  	ctx := context.Background()
  1093  	project, _, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1)
  1094  	if err != nil {
  1095  		t.Errorf("Teams.ReviewTeamProjectsByID returned error: %v", err)
  1096  	}
  1097  
  1098  	want := &ProjectV2{ID: Ptr(int64(1))}
  1099  	if !cmp.Equal(project, want) {
  1100  		t.Errorf("Teams.ReviewTeamProjectsByID returned %+v, want %+v", project, want)
  1101  	}
  1102  
  1103  	const methodName = "ReviewTeamProjectsByID"
  1104  	testBadOptions(t, methodName, func() (err error) {
  1105  		_, _, err = client.Teams.ReviewTeamProjectsByID(ctx, -1, -1, -1)
  1106  		return err
  1107  	})
  1108  
  1109  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1110  		got, resp, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1)
  1111  		if got != nil {
  1112  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1113  		}
  1114  		return resp, err
  1115  	})
  1116  }
  1117  
  1118  func TestTeamsService_ReviewProjectsBySlug(t *testing.T) {
  1119  	t.Parallel()
  1120  	client, mux, _ := setup(t)
  1121  
  1122  	mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1123  		testMethod(t, r, "GET")
  1124  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1125  		fmt.Fprint(w, `{"id":1}`)
  1126  	})
  1127  
  1128  	ctx := context.Background()
  1129  	project, _, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1)
  1130  	if err != nil {
  1131  		t.Errorf("Teams.ReviewTeamProjectsBySlug returned error: %v", err)
  1132  	}
  1133  
  1134  	want := &ProjectV2{ID: Ptr(int64(1))}
  1135  	if !cmp.Equal(project, want) {
  1136  		t.Errorf("Teams.ReviewTeamProjectsBySlug returned %+v, want %+v", project, want)
  1137  	}
  1138  
  1139  	const methodName = "ReviewTeamProjectsBySlug"
  1140  	testBadOptions(t, methodName, func() (err error) {
  1141  		_, _, err = client.Teams.ReviewTeamProjectsBySlug(ctx, "\n", "\n", -1)
  1142  		return err
  1143  	})
  1144  
  1145  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1146  		got, resp, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1)
  1147  		if got != nil {
  1148  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1149  		}
  1150  		return resp, err
  1151  	})
  1152  }
  1153  
  1154  func TestTeamsService_AddTeamProjectByID(t *testing.T) {
  1155  	t.Parallel()
  1156  	client, mux, _ := setup(t)
  1157  
  1158  	opt := &TeamProjectOptions{
  1159  		Permission: Ptr("admin"),
  1160  	}
  1161  
  1162  	mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1163  		testMethod(t, r, "PUT")
  1164  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1165  
  1166  		v := &TeamProjectOptions{}
  1167  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
  1168  		if !cmp.Equal(v, opt) {
  1169  			t.Errorf("Request body = %+v, want %+v", v, opt)
  1170  		}
  1171  
  1172  		w.WriteHeader(http.StatusNoContent)
  1173  	})
  1174  
  1175  	ctx := context.Background()
  1176  	_, err := client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt)
  1177  	if err != nil {
  1178  		t.Errorf("Teams.AddTeamProjectByID returned error: %v", err)
  1179  	}
  1180  
  1181  	const methodName = "AddTeamProjectByID"
  1182  	testBadOptions(t, methodName, func() (err error) {
  1183  		_, err = client.Teams.AddTeamProjectByID(ctx, -1, -1, -1, opt)
  1184  		return err
  1185  	})
  1186  
  1187  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1188  		return client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt)
  1189  	})
  1190  }
  1191  
  1192  func TestTeamsService_AddTeamProjectBySlug(t *testing.T) {
  1193  	t.Parallel()
  1194  	client, mux, _ := setup(t)
  1195  
  1196  	opt := &TeamProjectOptions{
  1197  		Permission: Ptr("admin"),
  1198  	}
  1199  
  1200  	mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1201  		testMethod(t, r, "PUT")
  1202  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1203  
  1204  		v := &TeamProjectOptions{}
  1205  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
  1206  		if !cmp.Equal(v, opt) {
  1207  			t.Errorf("Request body = %+v, want %+v", v, opt)
  1208  		}
  1209  
  1210  		w.WriteHeader(http.StatusNoContent)
  1211  	})
  1212  
  1213  	ctx := context.Background()
  1214  	_, err := client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt)
  1215  	if err != nil {
  1216  		t.Errorf("Teams.AddTeamProjectBySlug returned error: %v", err)
  1217  	}
  1218  
  1219  	const methodName = "AddTeamProjectBySlug"
  1220  	testBadOptions(t, methodName, func() (err error) {
  1221  		_, err = client.Teams.AddTeamProjectBySlug(ctx, "\n", "\n", -1, opt)
  1222  		return err
  1223  	})
  1224  
  1225  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1226  		return client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt)
  1227  	})
  1228  }
  1229  
  1230  func TestTeamsService_RemoveTeamProjectByID(t *testing.T) {
  1231  	t.Parallel()
  1232  	client, mux, _ := setup(t)
  1233  
  1234  	mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1235  		testMethod(t, r, "DELETE")
  1236  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1237  		w.WriteHeader(http.StatusNoContent)
  1238  	})
  1239  
  1240  	ctx := context.Background()
  1241  	_, err := client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1)
  1242  	if err != nil {
  1243  		t.Errorf("Teams.RemoveTeamProjectByID returned error: %v", err)
  1244  	}
  1245  
  1246  	const methodName = "RemoveTeamProjectByID"
  1247  	testBadOptions(t, methodName, func() (err error) {
  1248  		_, err = client.Teams.RemoveTeamProjectByID(ctx, -1, -1, -1)
  1249  		return err
  1250  	})
  1251  
  1252  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1253  		return client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1)
  1254  	})
  1255  }
  1256  
  1257  func TestTeamsService_RemoveTeamProjectBySlug(t *testing.T) {
  1258  	t.Parallel()
  1259  	client, mux, _ := setup(t)
  1260  
  1261  	mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) {
  1262  		testMethod(t, r, "DELETE")
  1263  		testHeader(t, r, "Accept", mediaTypeProjectsPreview)
  1264  		w.WriteHeader(http.StatusNoContent)
  1265  	})
  1266  
  1267  	ctx := context.Background()
  1268  	_, err := client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1)
  1269  	if err != nil {
  1270  		t.Errorf("Teams.RemoveTeamProjectBySlug returned error: %v", err)
  1271  	}
  1272  
  1273  	const methodName = "RemoveTeamProjectBySlug"
  1274  	testBadOptions(t, methodName, func() (err error) {
  1275  		_, err = client.Teams.RemoveTeamProjectBySlug(ctx, "\n", "\n", -1)
  1276  		return err
  1277  	})
  1278  
  1279  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1280  		return client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1)
  1281  	})
  1282  }
  1283  
  1284  func TestTeamsService_ListIDPGroupsInOrganization(t *testing.T) {
  1285  	t.Parallel()
  1286  	client, mux, _ := setup(t)
  1287  
  1288  	mux.HandleFunc("/orgs/o/team-sync/groups", func(w http.ResponseWriter, r *http.Request) {
  1289  		testMethod(t, r, "GET")
  1290  		testFormValues(t, r, values{
  1291  			"page": "url-encoded-next-page-token",
  1292  			"q":    "n",
  1293  		})
  1294  		fmt.Fprint(w, `{"groups": [{"group_id": "1",  "group_name": "n", "group_description": "d"}]}`)
  1295  	})
  1296  
  1297  	opt := &ListIDPGroupsOptions{
  1298  		Query:             "n",
  1299  		ListCursorOptions: ListCursorOptions{Page: "url-encoded-next-page-token"},
  1300  	}
  1301  	ctx := context.Background()
  1302  	groups, _, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt)
  1303  	if err != nil {
  1304  		t.Errorf("Teams.ListIDPGroupsInOrganization returned error: %v", err)
  1305  	}
  1306  
  1307  	want := &IDPGroupList{
  1308  		Groups: []*IDPGroup{
  1309  			{
  1310  				GroupID:          Ptr("1"),
  1311  				GroupName:        Ptr("n"),
  1312  				GroupDescription: Ptr("d"),
  1313  			},
  1314  		},
  1315  	}
  1316  	if !cmp.Equal(groups, want) {
  1317  		t.Errorf("Teams.ListIDPGroupsInOrganization returned %+v. want %+v", groups, want)
  1318  	}
  1319  
  1320  	const methodName = "ListIDPGroupsInOrganization"
  1321  	testBadOptions(t, methodName, func() (err error) {
  1322  		_, _, err = client.Teams.ListIDPGroupsInOrganization(ctx, "\n", opt)
  1323  		return err
  1324  	})
  1325  
  1326  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1327  		got, resp, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt)
  1328  		if got != nil {
  1329  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1330  		}
  1331  		return resp, err
  1332  	})
  1333  }
  1334  
  1335  func TestTeamsService_ListIDPGroupsForTeamByID(t *testing.T) {
  1336  	t.Parallel()
  1337  	client, mux, _ := setup(t)
  1338  
  1339  	mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1340  		testMethod(t, r, "GET")
  1341  		fmt.Fprint(w, `{"groups": [{"group_id": "1",  "group_name": "n", "group_description": "d"}]}`)
  1342  	})
  1343  
  1344  	ctx := context.Background()
  1345  	groups, _, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1)
  1346  	if err != nil {
  1347  		t.Errorf("Teams.ListIDPGroupsForTeamByID returned error: %v", err)
  1348  	}
  1349  
  1350  	want := &IDPGroupList{
  1351  		Groups: []*IDPGroup{
  1352  			{
  1353  				GroupID:          Ptr("1"),
  1354  				GroupName:        Ptr("n"),
  1355  				GroupDescription: Ptr("d"),
  1356  			},
  1357  		},
  1358  	}
  1359  	if !cmp.Equal(groups, want) {
  1360  		t.Errorf("Teams.ListIDPGroupsForTeamByID returned %+v. want %+v", groups, want)
  1361  	}
  1362  
  1363  	const methodName = "ListIDPGroupsForTeamByID"
  1364  	testBadOptions(t, methodName, func() (err error) {
  1365  		_, _, err = client.Teams.ListIDPGroupsForTeamByID(ctx, -1, -1)
  1366  		return err
  1367  	})
  1368  
  1369  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1370  		got, resp, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1)
  1371  		if got != nil {
  1372  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1373  		}
  1374  		return resp, err
  1375  	})
  1376  }
  1377  
  1378  func TestTeamsService_ListIDPGroupsForTeamBySlug(t *testing.T) {
  1379  	t.Parallel()
  1380  	client, mux, _ := setup(t)
  1381  
  1382  	mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1383  		testMethod(t, r, "GET")
  1384  		fmt.Fprint(w, `{"groups": [{"group_id": "1",  "group_name": "n", "group_description": "d"}]}`)
  1385  	})
  1386  
  1387  	ctx := context.Background()
  1388  	groups, _, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug")
  1389  	if err != nil {
  1390  		t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned error: %v", err)
  1391  	}
  1392  
  1393  	want := &IDPGroupList{
  1394  		Groups: []*IDPGroup{
  1395  			{
  1396  				GroupID:          Ptr("1"),
  1397  				GroupName:        Ptr("n"),
  1398  				GroupDescription: Ptr("d"),
  1399  			},
  1400  		},
  1401  	}
  1402  	if !cmp.Equal(groups, want) {
  1403  		t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned %+v. want %+v", groups, want)
  1404  	}
  1405  
  1406  	const methodName = "ListIDPGroupsForTeamBySlug"
  1407  	testBadOptions(t, methodName, func() (err error) {
  1408  		_, _, err = client.Teams.ListIDPGroupsForTeamBySlug(ctx, "\n", "\n")
  1409  		return err
  1410  	})
  1411  
  1412  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1413  		got, resp, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug")
  1414  		if got != nil {
  1415  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1416  		}
  1417  		return resp, err
  1418  	})
  1419  }
  1420  
  1421  func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID(t *testing.T) {
  1422  	t.Parallel()
  1423  	client, mux, _ := setup(t)
  1424  
  1425  	mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1426  		testMethod(t, r, "PATCH")
  1427  		fmt.Fprint(w, `{"groups": [{"group_id": "1",  "group_name": "n", "group_description": "d"}]}`)
  1428  	})
  1429  
  1430  	input := IDPGroupList{
  1431  		Groups: []*IDPGroup{
  1432  			{
  1433  				GroupID:          Ptr("1"),
  1434  				GroupName:        Ptr("n"),
  1435  				GroupDescription: Ptr("d"),
  1436  			},
  1437  		},
  1438  	}
  1439  
  1440  	ctx := context.Background()
  1441  	groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input)
  1442  	if err != nil {
  1443  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err)
  1444  	}
  1445  
  1446  	want := &IDPGroupList{
  1447  		Groups: []*IDPGroup{
  1448  			{
  1449  				GroupID:          Ptr("1"),
  1450  				GroupName:        Ptr("n"),
  1451  				GroupDescription: Ptr("d"),
  1452  			},
  1453  		},
  1454  	}
  1455  	if !cmp.Equal(groups, want) {
  1456  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want)
  1457  	}
  1458  
  1459  	const methodName = "CreateOrUpdateIDPGroupConnectionsByID"
  1460  	testBadOptions(t, methodName, func() (err error) {
  1461  		_, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, -1, -1, input)
  1462  		return err
  1463  	})
  1464  
  1465  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1466  		got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input)
  1467  		if got != nil {
  1468  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1469  		}
  1470  		return resp, err
  1471  	})
  1472  }
  1473  
  1474  func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug(t *testing.T) {
  1475  	t.Parallel()
  1476  	client, mux, _ := setup(t)
  1477  
  1478  	mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1479  		testMethod(t, r, "PATCH")
  1480  		fmt.Fprint(w, `{"groups": [{"group_id": "1",  "group_name": "n", "group_description": "d"}]}`)
  1481  	})
  1482  
  1483  	input := IDPGroupList{
  1484  		Groups: []*IDPGroup{
  1485  			{
  1486  				GroupID:          Ptr("1"),
  1487  				GroupName:        Ptr("n"),
  1488  				GroupDescription: Ptr("d"),
  1489  			},
  1490  		},
  1491  	}
  1492  
  1493  	ctx := context.Background()
  1494  	groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input)
  1495  	if err != nil {
  1496  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err)
  1497  	}
  1498  
  1499  	want := &IDPGroupList{
  1500  		Groups: []*IDPGroup{
  1501  			{
  1502  				GroupID:          Ptr("1"),
  1503  				GroupName:        Ptr("n"),
  1504  				GroupDescription: Ptr("d"),
  1505  			},
  1506  		},
  1507  	}
  1508  	if !cmp.Equal(groups, want) {
  1509  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want)
  1510  	}
  1511  
  1512  	const methodName = "CreateOrUpdateIDPGroupConnectionsBySlug"
  1513  	testBadOptions(t, methodName, func() (err error) {
  1514  		_, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "\n", "\n", input)
  1515  		return err
  1516  	})
  1517  
  1518  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1519  		got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input)
  1520  		if got != nil {
  1521  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1522  		}
  1523  		return resp, err
  1524  	})
  1525  }
  1526  func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID_empty(t *testing.T) {
  1527  	t.Parallel()
  1528  	client, mux, _ := setup(t)
  1529  
  1530  	mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1531  		testMethod(t, r, "PATCH")
  1532  		fmt.Fprint(w, `{"groups": []}`)
  1533  	})
  1534  
  1535  	input := IDPGroupList{
  1536  		Groups: []*IDPGroup{},
  1537  	}
  1538  
  1539  	ctx := context.Background()
  1540  	groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input)
  1541  	if err != nil {
  1542  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err)
  1543  	}
  1544  
  1545  	want := &IDPGroupList{
  1546  		Groups: []*IDPGroup{},
  1547  	}
  1548  	if !cmp.Equal(groups, want) {
  1549  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want)
  1550  	}
  1551  }
  1552  
  1553  func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug_empty(t *testing.T) {
  1554  	t.Parallel()
  1555  	client, mux, _ := setup(t)
  1556  
  1557  	mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) {
  1558  		testMethod(t, r, "PATCH")
  1559  		fmt.Fprint(w, `{"groups": []}`)
  1560  	})
  1561  
  1562  	input := IDPGroupList{
  1563  		Groups: []*IDPGroup{},
  1564  	}
  1565  
  1566  	ctx := context.Background()
  1567  	groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input)
  1568  	if err != nil {
  1569  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err)
  1570  	}
  1571  
  1572  	want := &IDPGroupList{
  1573  		Groups: []*IDPGroup{},
  1574  	}
  1575  	if !cmp.Equal(groups, want) {
  1576  		t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want)
  1577  	}
  1578  }
  1579  
  1580  func TestNewTeam_Marshal(t *testing.T) {
  1581  	t.Parallel()
  1582  	testJSONMarshal(t, &NewTeam{}, "{}")
  1583  
  1584  	u := &NewTeam{
  1585  		Name:                "n",
  1586  		Description:         Ptr("d"),
  1587  		Maintainers:         []string{"m1", "m2"},
  1588  		RepoNames:           []string{"repo1", "repo2"},
  1589  		NotificationSetting: Ptr("notifications_enabled"),
  1590  		ParentTeamID:        Ptr(int64(1)),
  1591  		Permission:          Ptr("perm"),
  1592  		Privacy:             Ptr("p"),
  1593  		LDAPDN:              Ptr("l"),
  1594  	}
  1595  
  1596  	want := `{
  1597  		"name":           "n",
  1598  		"description":    "d",
  1599  		"maintainers":    ["m1", "m2"],
  1600  		"repo_names":     ["repo1", "repo2"],
  1601  		"parent_team_id": 1,
  1602  		"notification_setting": "notifications_enabled",
  1603  		"permission":     "perm",
  1604  		"privacy":        "p",
  1605  		"ldap_dn":        "l"
  1606  	}`
  1607  
  1608  	testJSONMarshal(t, u, want)
  1609  }
  1610  
  1611  func TestTeams_Marshal(t *testing.T) {
  1612  	t.Parallel()
  1613  	testJSONMarshal(t, &Team{}, "{}")
  1614  
  1615  	u := &Team{
  1616  		ID:              Ptr(int64(1)),
  1617  		NodeID:          Ptr("n"),
  1618  		Name:            Ptr("n"),
  1619  		Description:     Ptr("d"),
  1620  		URL:             Ptr("u"),
  1621  		Slug:            Ptr("s"),
  1622  		Permission:      Ptr("p"),
  1623  		Privacy:         Ptr("p"),
  1624  		MembersCount:    Ptr(1),
  1625  		ReposCount:      Ptr(1),
  1626  		MembersURL:      Ptr("m"),
  1627  		RepositoriesURL: Ptr("r"),
  1628  		Organization: &Organization{
  1629  			Login:     Ptr("l"),
  1630  			ID:        Ptr(int64(1)),
  1631  			NodeID:    Ptr("n"),
  1632  			AvatarURL: Ptr("a"),
  1633  			HTMLURL:   Ptr("h"),
  1634  			Name:      Ptr("n"),
  1635  			Company:   Ptr("c"),
  1636  			Blog:      Ptr("b"),
  1637  			Location:  Ptr("l"),
  1638  			Email:     Ptr("e"),
  1639  		},
  1640  		Parent: &Team{
  1641  			ID:           Ptr(int64(1)),
  1642  			NodeID:       Ptr("n"),
  1643  			Name:         Ptr("n"),
  1644  			Description:  Ptr("d"),
  1645  			URL:          Ptr("u"),
  1646  			Slug:         Ptr("s"),
  1647  			Permission:   Ptr("p"),
  1648  			Privacy:      Ptr("p"),
  1649  			MembersCount: Ptr(1),
  1650  			ReposCount:   Ptr(1),
  1651  		},
  1652  		LDAPDN: Ptr("l"),
  1653  	}
  1654  
  1655  	want := `{
  1656  		"id": 1,
  1657  		"node_id": "n",
  1658  		"name": "n",
  1659  		"description": "d",
  1660  		"url": "u",
  1661  		"slug": "s",
  1662  		"permission": "p",
  1663  		"privacy": "p",
  1664  		"members_count": 1,
  1665  		"repos_count": 1,
  1666  		"members_url": "m",
  1667  		"repositories_url": "r",
  1668  		"organization": {
  1669  			"login": "l",
  1670  			"id": 1,
  1671  			"node_id": "n",
  1672  			"avatar_url": "a",
  1673  			"html_url": "h",
  1674  			"name": "n",
  1675  			"company": "c",
  1676  			"blog": "b",
  1677  			"location": "l",
  1678  			"email": "e"
  1679  		},
  1680  		"parent": {
  1681  			"id": 1,
  1682  			"node_id": "n",
  1683  			"name": "n",
  1684  			"description": "d",
  1685  			"url": "u",
  1686  			"slug": "s",
  1687  			"permission": "p",
  1688  			"privacy": "p",
  1689  			"members_count": 1,
  1690  			"repos_count": 1
  1691  		},
  1692  		"ldap_dn": "l"
  1693  	}`
  1694  
  1695  	testJSONMarshal(t, u, want)
  1696  }
  1697  
  1698  func TestInvitation_Marshal(t *testing.T) {
  1699  	t.Parallel()
  1700  	testJSONMarshal(t, &Invitation{}, "{}")
  1701  
  1702  	u := &Invitation{
  1703  		ID:                Ptr(int64(1)),
  1704  		NodeID:            Ptr("test node"),
  1705  		Login:             Ptr("login123"),
  1706  		Email:             Ptr("go@github.com"),
  1707  		Role:              Ptr("developer"),
  1708  		CreatedAt:         &Timestamp{referenceTime},
  1709  		TeamCount:         Ptr(99),
  1710  		InvitationTeamURL: Ptr("url"),
  1711  	}
  1712  
  1713  	want := `{
  1714  		"id": 1,
  1715  		"node_id": "test node",
  1716  		"login":"login123",
  1717  		"email":"go@github.com",
  1718  		"role":"developer",
  1719  		"created_at":` + referenceTimeStr + `,
  1720  		"team_count":99,
  1721  		"invitation_team_url":"url"
  1722  	}`
  1723  
  1724  	testJSONMarshal(t, u, want)
  1725  }
  1726  
  1727  func TestIDPGroup_Marshal(t *testing.T) {
  1728  	t.Parallel()
  1729  	testJSONMarshal(t, &IDPGroup{}, "{}")
  1730  
  1731  	u := &IDPGroup{
  1732  		GroupID:          Ptr("abc1"),
  1733  		GroupName:        Ptr("test group"),
  1734  		GroupDescription: Ptr("test group description"),
  1735  	}
  1736  
  1737  	want := `{
  1738  		"group_id": "abc1",
  1739  		"group_name": "test group",
  1740  		"group_description":"test group description"
  1741  	}`
  1742  
  1743  	testJSONMarshal(t, u, want)
  1744  }
  1745  
  1746  func TestTeamsService_GetExternalGroup(t *testing.T) {
  1747  	t.Parallel()
  1748  	client, mux, _ := setup(t)
  1749  
  1750  	mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) {
  1751  		testMethod(t, r, "GET")
  1752  		fmt.Fprint(w, `{
  1753  			"group_id": 123,
  1754  			"group_name": "Octocat admins",
  1755  			"updated_at": "2006-01-02T15:04:05Z",
  1756  			"teams": [
  1757  				{
  1758  					"team_id": 1,
  1759  					"team_name": "team-test"
  1760  				},
  1761  				{
  1762  					"team_id": 2,
  1763  					"team_name": "team-test2"
  1764  				}
  1765  			],
  1766  			"members": [
  1767  				{
  1768  					"member_id": 1,
  1769  					"member_login": "mona-lisa_eocsaxrs",
  1770  					"member_name": "Mona Lisa",
  1771  					"member_email": "mona_lisa@github.com"
  1772  				},
  1773  				{
  1774  					"member_id": 2,
  1775  					"member_login": "octo-lisa_eocsaxrs",
  1776  					"member_name": "Octo Lisa",
  1777  					"member_email": "octo_lisa@github.com"
  1778  				}
  1779  			]
  1780  		}`)
  1781  	})
  1782  
  1783  	ctx := context.Background()
  1784  	externalGroup, _, err := client.Teams.GetExternalGroup(ctx, "o", 123)
  1785  	if err != nil {
  1786  		t.Errorf("Teams.GetExternalGroup returned error: %v", err)
  1787  	}
  1788  
  1789  	want := &ExternalGroup{
  1790  		GroupID:   Ptr(int64(123)),
  1791  		GroupName: Ptr("Octocat admins"),
  1792  		UpdatedAt: &Timestamp{Time: referenceTime},
  1793  		Teams: []*ExternalGroupTeam{
  1794  			{
  1795  				TeamID:   Ptr(int64(1)),
  1796  				TeamName: Ptr("team-test"),
  1797  			},
  1798  			{
  1799  				TeamID:   Ptr(int64(2)),
  1800  				TeamName: Ptr("team-test2"),
  1801  			},
  1802  		},
  1803  		Members: []*ExternalGroupMember{
  1804  			{
  1805  				MemberID:    Ptr(int64(1)),
  1806  				MemberLogin: Ptr("mona-lisa_eocsaxrs"),
  1807  				MemberName:  Ptr("Mona Lisa"),
  1808  				MemberEmail: Ptr("mona_lisa@github.com"),
  1809  			},
  1810  			{
  1811  				MemberID:    Ptr(int64(2)),
  1812  				MemberLogin: Ptr("octo-lisa_eocsaxrs"),
  1813  				MemberName:  Ptr("Octo Lisa"),
  1814  				MemberEmail: Ptr("octo_lisa@github.com"),
  1815  			},
  1816  		},
  1817  	}
  1818  	if !cmp.Equal(externalGroup, want) {
  1819  		t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want)
  1820  	}
  1821  
  1822  	const methodName = "GetExternalGroup"
  1823  	testBadOptions(t, methodName, func() (err error) {
  1824  		_, _, err = client.Teams.GetExternalGroup(ctx, "\n", -1)
  1825  		return err
  1826  	})
  1827  
  1828  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1829  		got, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123)
  1830  		if got != nil {
  1831  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1832  		}
  1833  		return resp, err
  1834  	})
  1835  }
  1836  
  1837  func TestTeamsService_GetExternalGroup_notFound(t *testing.T) {
  1838  	t.Parallel()
  1839  	client, mux, _ := setup(t)
  1840  
  1841  	mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) {
  1842  		testMethod(t, r, "GET")
  1843  		w.WriteHeader(http.StatusNotFound)
  1844  	})
  1845  
  1846  	ctx := context.Background()
  1847  	eg, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123)
  1848  	if err == nil {
  1849  		t.Errorf("Expected HTTP 404 response")
  1850  	}
  1851  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
  1852  		t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want)
  1853  	}
  1854  	if eg != nil {
  1855  		t.Errorf("Teams.GetExternalGroup returned %+v, want nil", eg)
  1856  	}
  1857  }
  1858  
  1859  func TestTeamsService_ListExternalGroups(t *testing.T) {
  1860  	t.Parallel()
  1861  	client, mux, _ := setup(t)
  1862  
  1863  	mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) {
  1864  		testMethod(t, r, "GET")
  1865  		fmt.Fprint(w, `{
  1866  			"groups": [
  1867  				{
  1868  					"group_id": 123,
  1869  					"group_name": "Octocat admins",
  1870  					"updated_at": "2006-01-02T15:04:05Z"
  1871  				}
  1872  			]
  1873  		}`)
  1874  	})
  1875  
  1876  	ctx := context.Background()
  1877  	opts := &ListExternalGroupsOptions{
  1878  		DisplayName: Ptr("Octocat"),
  1879  	}
  1880  	list, _, err := client.Teams.ListExternalGroups(ctx, "o", opts)
  1881  	if err != nil {
  1882  		t.Errorf("Teams.ListExternalGroups returned error: %v", err)
  1883  	}
  1884  
  1885  	want := &ExternalGroupList{
  1886  		Groups: []*ExternalGroup{
  1887  			{
  1888  				GroupID:   Ptr(int64(123)),
  1889  				GroupName: Ptr("Octocat admins"),
  1890  				UpdatedAt: &Timestamp{Time: referenceTime},
  1891  			},
  1892  		},
  1893  	}
  1894  	if !cmp.Equal(list, want) {
  1895  		t.Errorf("Teams.ListExternalGroups returned %+v, want %+v", list, want)
  1896  	}
  1897  
  1898  	const methodName = "ListExternalGroups"
  1899  	testBadOptions(t, methodName, func() (err error) {
  1900  		_, _, err = client.Teams.ListExternalGroups(ctx, "\n", opts)
  1901  		return err
  1902  	})
  1903  
  1904  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1905  		got, resp, err := client.Teams.ListExternalGroups(ctx, "o", opts)
  1906  		if got != nil {
  1907  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1908  		}
  1909  		return resp, err
  1910  	})
  1911  }
  1912  
  1913  func TestTeamsService_ListExternalGroups_notFound(t *testing.T) {
  1914  	t.Parallel()
  1915  	client, mux, _ := setup(t)
  1916  
  1917  	mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) {
  1918  		testMethod(t, r, "GET")
  1919  		w.WriteHeader(http.StatusNotFound)
  1920  	})
  1921  
  1922  	ctx := context.Background()
  1923  	eg, resp, err := client.Teams.ListExternalGroups(ctx, "o", nil)
  1924  	if err == nil {
  1925  		t.Errorf("Expected HTTP 404 response")
  1926  	}
  1927  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
  1928  		t.Errorf("Teams.ListExternalGroups returned status %d, want %d", got, want)
  1929  	}
  1930  	if eg != nil {
  1931  		t.Errorf("Teams.ListExternalGroups returned %+v, want nil", eg)
  1932  	}
  1933  }
  1934  
  1935  func TestTeamsService_ListExternalGroupsForTeamBySlug(t *testing.T) {
  1936  	t.Parallel()
  1937  	client, mux, _ := setup(t)
  1938  
  1939  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  1940  		testMethod(t, r, "GET")
  1941  		fmt.Fprint(w, `{
  1942  			"groups": [
  1943  				{
  1944  					"group_id": 123,
  1945  					"group_name": "Octocat admins",
  1946  					"updated_at": "2006-01-02T15:04:05Z"
  1947  				}
  1948  			]
  1949  		}`)
  1950  	})
  1951  
  1952  	ctx := context.Background()
  1953  	list, _, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
  1954  	if err != nil {
  1955  		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned error: %v", err)
  1956  	}
  1957  
  1958  	want := &ExternalGroupList{
  1959  		Groups: []*ExternalGroup{
  1960  			{
  1961  				GroupID:   Ptr(int64(123)),
  1962  				GroupName: Ptr("Octocat admins"),
  1963  				UpdatedAt: &Timestamp{Time: referenceTime},
  1964  			},
  1965  		},
  1966  	}
  1967  	if !cmp.Equal(list, want) {
  1968  		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want %+v", list, want)
  1969  	}
  1970  
  1971  	const methodName = "ListExternalGroupsForTeamBySlug"
  1972  	testBadOptions(t, methodName, func() (err error) {
  1973  		_, _, err = client.Teams.ListExternalGroupsForTeamBySlug(ctx, "\n", "\n")
  1974  		return err
  1975  	})
  1976  
  1977  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1978  		got, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
  1979  		if got != nil {
  1980  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1981  		}
  1982  		return resp, err
  1983  	})
  1984  }
  1985  
  1986  func TestTeamsService_ListExternalGroupsForTeamBySlug_notFound(t *testing.T) {
  1987  	t.Parallel()
  1988  	client, mux, _ := setup(t)
  1989  
  1990  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  1991  		testMethod(t, r, "GET")
  1992  		w.WriteHeader(http.StatusNotFound)
  1993  	})
  1994  
  1995  	ctx := context.Background()
  1996  	eg, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t")
  1997  	if err == nil {
  1998  		t.Errorf("Expected HTTP 404 response")
  1999  	}
  2000  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
  2001  		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned status %d, want %d", got, want)
  2002  	}
  2003  	if eg != nil {
  2004  		t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want nil", eg)
  2005  	}
  2006  }
  2007  
  2008  func TestTeamsService_UpdateConnectedExternalGroup(t *testing.T) {
  2009  	t.Parallel()
  2010  	client, mux, _ := setup(t)
  2011  
  2012  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  2013  		testMethod(t, r, "PATCH")
  2014  		fmt.Fprint(w, `{
  2015  			"group_id": 123,
  2016  			"group_name": "Octocat admins",
  2017  			"updated_at": "2006-01-02T15:04:05Z",
  2018  			"teams": [
  2019  				{
  2020  					"team_id": 1,
  2021  					"team_name": "team-test"
  2022  				},
  2023  				{
  2024  					"team_id": 2,
  2025  					"team_name": "team-test2"
  2026  				}
  2027  			],
  2028  			"members": [
  2029  				{
  2030  					"member_id": 1,
  2031  					"member_login": "mona-lisa_eocsaxrs",
  2032  					"member_name": "Mona Lisa",
  2033  					"member_email": "mona_lisa@github.com"
  2034  				},
  2035  				{
  2036  					"member_id": 2,
  2037  					"member_login": "octo-lisa_eocsaxrs",
  2038  					"member_name": "Octo Lisa",
  2039  					"member_email": "octo_lisa@github.com"
  2040  				}
  2041  			]
  2042  		}`)
  2043  	})
  2044  
  2045  	ctx := context.Background()
  2046  	body := &ExternalGroup{
  2047  		GroupID: Ptr(int64(123)),
  2048  	}
  2049  	externalGroup, _, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body)
  2050  	if err != nil {
  2051  		t.Errorf("Teams.UpdateConnectedExternalGroup returned error: %v", err)
  2052  	}
  2053  
  2054  	want := &ExternalGroup{
  2055  		GroupID:   Ptr(int64(123)),
  2056  		GroupName: Ptr("Octocat admins"),
  2057  		UpdatedAt: &Timestamp{Time: referenceTime},
  2058  		Teams: []*ExternalGroupTeam{
  2059  			{
  2060  				TeamID:   Ptr(int64(1)),
  2061  				TeamName: Ptr("team-test"),
  2062  			},
  2063  			{
  2064  				TeamID:   Ptr(int64(2)),
  2065  				TeamName: Ptr("team-test2"),
  2066  			},
  2067  		},
  2068  		Members: []*ExternalGroupMember{
  2069  			{
  2070  				MemberID:    Ptr(int64(1)),
  2071  				MemberLogin: Ptr("mona-lisa_eocsaxrs"),
  2072  				MemberName:  Ptr("Mona Lisa"),
  2073  				MemberEmail: Ptr("mona_lisa@github.com"),
  2074  			},
  2075  			{
  2076  				MemberID:    Ptr(int64(2)),
  2077  				MemberLogin: Ptr("octo-lisa_eocsaxrs"),
  2078  				MemberName:  Ptr("Octo Lisa"),
  2079  				MemberEmail: Ptr("octo_lisa@github.com"),
  2080  			},
  2081  		},
  2082  	}
  2083  	if !cmp.Equal(externalGroup, want) {
  2084  		t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want)
  2085  	}
  2086  
  2087  	const methodName = "UpdateConnectedExternalGroup"
  2088  	testBadOptions(t, methodName, func() (err error) {
  2089  		_, _, err = client.Teams.UpdateConnectedExternalGroup(ctx, "\n", "\n", body)
  2090  		return err
  2091  	})
  2092  
  2093  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  2094  		got, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body)
  2095  		if got != nil {
  2096  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  2097  		}
  2098  		return resp, err
  2099  	})
  2100  }
  2101  
  2102  func TestTeamsService_UpdateConnectedExternalGroup_notFound(t *testing.T) {
  2103  	t.Parallel()
  2104  	client, mux, _ := setup(t)
  2105  
  2106  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  2107  		testMethod(t, r, "PATCH")
  2108  		w.WriteHeader(http.StatusNotFound)
  2109  	})
  2110  
  2111  	ctx := context.Background()
  2112  	body := &ExternalGroup{
  2113  		GroupID: Ptr(int64(123)),
  2114  	}
  2115  	eg, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body)
  2116  	if err == nil {
  2117  		t.Errorf("Expected HTTP 404 response")
  2118  	}
  2119  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
  2120  		t.Errorf("Teams.UpdateConnectedExternalGroup returned status %d, want %d", got, want)
  2121  	}
  2122  	if eg != nil {
  2123  		t.Errorf("Teams.UpdateConnectedExternalGroup returned %+v, want nil", eg)
  2124  	}
  2125  }
  2126  
  2127  func TestTeamsService_RemoveConnectedExternalGroup(t *testing.T) {
  2128  	t.Parallel()
  2129  	client, mux, _ := setup(t)
  2130  
  2131  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  2132  		testMethod(t, r, "DELETE")
  2133  		w.WriteHeader(http.StatusNoContent)
  2134  	})
  2135  
  2136  	ctx := context.Background()
  2137  	_, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t")
  2138  	if err != nil {
  2139  		t.Errorf("Teams.RemoveConnectedExternalGroup returned error: %v", err)
  2140  	}
  2141  
  2142  	const methodName = "RemoveConnectedExternalGroup"
  2143  	testBadOptions(t, methodName, func() (err error) {
  2144  		_, err = client.Teams.RemoveConnectedExternalGroup(ctx, "\n", "\n")
  2145  		return err
  2146  	})
  2147  
  2148  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  2149  		return client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t")
  2150  	})
  2151  }
  2152  
  2153  func TestTeamsService_RemoveConnectedExternalGroup_notFound(t *testing.T) {
  2154  	t.Parallel()
  2155  	client, mux, _ := setup(t)
  2156  
  2157  	mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) {
  2158  		testMethod(t, r, "DELETE")
  2159  		w.WriteHeader(http.StatusNotFound)
  2160  	})
  2161  
  2162  	ctx := context.Background()
  2163  	resp, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t")
  2164  	if err == nil {
  2165  		t.Errorf("Expected HTTP 404 response")
  2166  	}
  2167  	if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
  2168  		t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want)
  2169  	}
  2170  }
  2171  
  2172  func TestIDPGroupList_Marshal(t *testing.T) {
  2173  	t.Parallel()
  2174  	testJSONMarshal(t, &IDPGroupList{}, "{}")
  2175  
  2176  	u := &IDPGroupList{
  2177  		Groups: []*IDPGroup{
  2178  			{
  2179  				GroupID:          Ptr("abc1"),
  2180  				GroupName:        Ptr("test group"),
  2181  				GroupDescription: Ptr("test group description"),
  2182  			},
  2183  			{
  2184  				GroupID:          Ptr("abc2"),
  2185  				GroupName:        Ptr("test group2"),
  2186  				GroupDescription: Ptr("test group description2"),
  2187  			},
  2188  		},
  2189  	}
  2190  
  2191  	want := `{
  2192  		"groups": [
  2193  			{
  2194  				"group_id": "abc1",
  2195  				"group_name": "test group",
  2196  				"group_description": "test group description"
  2197  			},
  2198  			{
  2199  				"group_id": "abc2",
  2200  				"group_name": "test group2",
  2201  				"group_description": "test group description2"
  2202  			}
  2203  		]
  2204  	}`
  2205  
  2206  	testJSONMarshal(t, u, want)
  2207  }
  2208  
  2209  func TestExternalGroupMember_Marshal(t *testing.T) {
  2210  	t.Parallel()
  2211  	testJSONMarshal(t, &ExternalGroupMember{}, "{}")
  2212  
  2213  	u := &ExternalGroupMember{
  2214  		MemberID:    Ptr(int64(1)),
  2215  		MemberLogin: Ptr("test member"),
  2216  		MemberName:  Ptr("test member name"),
  2217  		MemberEmail: Ptr("test member email"),
  2218  	}
  2219  
  2220  	want := `{
  2221  		"member_id": 1,
  2222  		"member_login": "test member",
  2223  		"member_name":"test member name",
  2224  		"member_email":"test member email"
  2225  	}`
  2226  
  2227  	testJSONMarshal(t, u, want)
  2228  }
  2229  
  2230  func TestExternalGroup_Marshal(t *testing.T) {
  2231  	t.Parallel()
  2232  	testJSONMarshal(t, &ExternalGroup{}, "{}")
  2233  
  2234  	u := &ExternalGroup{
  2235  		GroupID:   Ptr(int64(123)),
  2236  		GroupName: Ptr("group1"),
  2237  		UpdatedAt: &Timestamp{referenceTime},
  2238  		Teams: []*ExternalGroupTeam{
  2239  			{
  2240  				TeamID:   Ptr(int64(1)),
  2241  				TeamName: Ptr("team-test"),
  2242  			},
  2243  			{
  2244  				TeamID:   Ptr(int64(2)),
  2245  				TeamName: Ptr("team-test2"),
  2246  			},
  2247  		},
  2248  		Members: []*ExternalGroupMember{
  2249  			{
  2250  				MemberID:    Ptr(int64(1)),
  2251  				MemberLogin: Ptr("test"),
  2252  				MemberName:  Ptr("test"),
  2253  				MemberEmail: Ptr("test@github.com"),
  2254  			},
  2255  		},
  2256  	}
  2257  
  2258  	want := `{
  2259  		"group_id": 123,
  2260  		"group_name": "group1",
  2261  		"updated_at": ` + referenceTimeStr + `,
  2262  		"teams": [
  2263  			{
  2264  				"team_id": 1,
  2265  				"team_name": "team-test"
  2266  			},
  2267  			{
  2268  				"team_id": 2,
  2269  				"team_name": "team-test2"
  2270  			}
  2271  		],
  2272  		"members": [
  2273  			{
  2274  				"member_id": 1,
  2275  				"member_login": "test",
  2276  				"member_name": "test",
  2277  				"member_email": "test@github.com"
  2278  			}
  2279  		]
  2280  	}`
  2281  
  2282  	testJSONMarshal(t, u, want)
  2283  }
  2284  
  2285  func TestExternalGroupTeam_Marshal(t *testing.T) {
  2286  	t.Parallel()
  2287  	testJSONMarshal(t, &ExternalGroupTeam{}, "{}")
  2288  
  2289  	u := &ExternalGroupTeam{
  2290  		TeamID:   Ptr(int64(123)),
  2291  		TeamName: Ptr("test"),
  2292  	}
  2293  
  2294  	want := `{
  2295  		"team_id": 123,
  2296  		"team_name": "test"
  2297  	}`
  2298  
  2299  	testJSONMarshal(t, u, want)
  2300  }
  2301  
  2302  func TestListExternalGroupsOptions_Marshal(t *testing.T) {
  2303  	t.Parallel()
  2304  	testJSONMarshal(t, &ListExternalGroupsOptions{}, "{}")
  2305  
  2306  	u := &ListExternalGroupsOptions{
  2307  		DisplayName: Ptr("test"),
  2308  		ListOptions: ListOptions{
  2309  			Page:    1,
  2310  			PerPage: 2,
  2311  		},
  2312  	}
  2313  
  2314  	want := `{
  2315  		"DisplayName": "test",
  2316  		"page":	1,
  2317  		"PerPage":	2
  2318  	}`
  2319  
  2320  	testJSONMarshal(t, u, want)
  2321  }
  2322  
  2323  func TestTeamAddTeamRepoOptions_Marshal(t *testing.T) {
  2324  	t.Parallel()
  2325  	testJSONMarshal(t, &TeamAddTeamRepoOptions{}, "{}")
  2326  
  2327  	u := &TeamAddTeamRepoOptions{
  2328  		Permission: "a",
  2329  	}
  2330  
  2331  	want := `{
  2332  		"permission": "a"
  2333  	}`
  2334  
  2335  	testJSONMarshal(t, u, want)
  2336  }