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

     1  // Copyright 2013 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  
    15  	"github.com/google/go-cmp/cmp"
    16  )
    17  
    18  func TestRepositoriesService_ListCollaborators(t *testing.T) {
    19  	t.Parallel()
    20  	client, mux, _ := setup(t)
    21  
    22  	mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) {
    23  		testMethod(t, r, "GET")
    24  		testFormValues(t, r, values{"page": "2"})
    25  		fmt.Fprintf(w, `[{"id":1}, {"id":2}]`)
    26  	})
    27  
    28  	opt := &ListCollaboratorsOptions{
    29  		ListOptions: ListOptions{Page: 2},
    30  	}
    31  	ctx := context.Background()
    32  	users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
    33  	if err != nil {
    34  		t.Errorf("Repositories.ListCollaborators returned error: %v", err)
    35  	}
    36  
    37  	want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}
    38  	if !cmp.Equal(users, want) {
    39  		t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want)
    40  	}
    41  
    42  	const methodName = "ListCollaborators"
    43  	testBadOptions(t, methodName, func() (err error) {
    44  		_, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt)
    45  		return err
    46  	})
    47  
    48  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    49  		got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", 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 TestRepositoriesService_ListCollaborators_withAffiliation(t *testing.T) {
    58  	t.Parallel()
    59  	client, mux, _ := setup(t)
    60  
    61  	mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) {
    62  		testMethod(t, r, "GET")
    63  		testFormValues(t, r, values{"affiliation": "all", "page": "2"})
    64  		fmt.Fprintf(w, `[{"id":1}, {"id":2}]`)
    65  	})
    66  
    67  	opt := &ListCollaboratorsOptions{
    68  		ListOptions: ListOptions{Page: 2},
    69  		Affiliation: "all",
    70  	}
    71  	ctx := context.Background()
    72  	users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
    73  	if err != nil {
    74  		t.Errorf("Repositories.ListCollaborators returned error: %v", err)
    75  	}
    76  
    77  	want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}
    78  	if !cmp.Equal(users, want) {
    79  		t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want)
    80  	}
    81  
    82  	const methodName = "ListCollaborators"
    83  	testBadOptions(t, methodName, func() (err error) {
    84  		_, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt)
    85  		return err
    86  	})
    87  
    88  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    89  		got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
    90  		if got != nil {
    91  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    92  		}
    93  		return resp, err
    94  	})
    95  }
    96  
    97  func TestRepositoriesService_ListCollaborators_withPermission(t *testing.T) {
    98  	t.Parallel()
    99  	client, mux, _ := setup(t)
   100  
   101  	mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) {
   102  		testMethod(t, r, "GET")
   103  		testFormValues(t, r, values{"permission": "pull", "page": "2"})
   104  		fmt.Fprintf(w, `[{"id":1}, {"id":2}]`)
   105  	})
   106  
   107  	opt := &ListCollaboratorsOptions{
   108  		ListOptions: ListOptions{Page: 2},
   109  		Permission:  "pull",
   110  	}
   111  	ctx := context.Background()
   112  	users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
   113  	if err != nil {
   114  		t.Errorf("Repositories.ListCollaborators returned error: %v", err)
   115  	}
   116  
   117  	want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}
   118  	if !cmp.Equal(users, want) {
   119  		t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want)
   120  	}
   121  
   122  	const methodName = "ListCollaborators"
   123  	testBadOptions(t, methodName, func() (err error) {
   124  		_, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt)
   125  		return err
   126  	})
   127  
   128  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   129  		got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt)
   130  		if got != nil {
   131  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   132  		}
   133  		return resp, err
   134  	})
   135  }
   136  
   137  func TestRepositoriesService_ListCollaborators_invalidOwner(t *testing.T) {
   138  	t.Parallel()
   139  	client, _, _ := setup(t)
   140  
   141  	ctx := context.Background()
   142  	_, _, err := client.Repositories.ListCollaborators(ctx, "%", "%", nil)
   143  	testURLParseError(t, err)
   144  }
   145  
   146  func TestRepositoriesService_IsCollaborator_True(t *testing.T) {
   147  	t.Parallel()
   148  	client, mux, _ := setup(t)
   149  
   150  	mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) {
   151  		testMethod(t, r, "GET")
   152  		w.WriteHeader(http.StatusNoContent)
   153  	})
   154  
   155  	ctx := context.Background()
   156  	isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u")
   157  	if err != nil {
   158  		t.Errorf("Repositories.IsCollaborator returned error: %v", err)
   159  	}
   160  
   161  	if !isCollab {
   162  		t.Errorf("Repositories.IsCollaborator returned false, want true")
   163  	}
   164  
   165  	const methodName = "IsCollaborator"
   166  	testBadOptions(t, methodName, func() (err error) {
   167  		_, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n")
   168  		return err
   169  	})
   170  
   171  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   172  		got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u")
   173  		if got {
   174  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got)
   175  		}
   176  		return resp, err
   177  	})
   178  }
   179  
   180  func TestRepositoriesService_IsCollaborator_False(t *testing.T) {
   181  	t.Parallel()
   182  	client, mux, _ := setup(t)
   183  
   184  	mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) {
   185  		testMethod(t, r, "GET")
   186  		w.WriteHeader(http.StatusNotFound)
   187  	})
   188  
   189  	ctx := context.Background()
   190  	isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u")
   191  	if err != nil {
   192  		t.Errorf("Repositories.IsCollaborator returned error: %v", err)
   193  	}
   194  
   195  	if isCollab {
   196  		t.Errorf("Repositories.IsCollaborator returned true, want false")
   197  	}
   198  
   199  	const methodName = "IsCollaborator"
   200  	testBadOptions(t, methodName, func() (err error) {
   201  		_, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n")
   202  		return err
   203  	})
   204  
   205  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   206  		got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u")
   207  		if got {
   208  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got)
   209  		}
   210  		return resp, err
   211  	})
   212  }
   213  
   214  func TestRepositoriesService_IsCollaborator_invalidUser(t *testing.T) {
   215  	t.Parallel()
   216  	client, _, _ := setup(t)
   217  
   218  	ctx := context.Background()
   219  	_, _, err := client.Repositories.IsCollaborator(ctx, "%", "%", "%")
   220  	testURLParseError(t, err)
   221  }
   222  
   223  func TestRepositoryService_GetPermissionLevel(t *testing.T) {
   224  	t.Parallel()
   225  	client, mux, _ := setup(t)
   226  
   227  	mux.HandleFunc("/repos/o/r/collaborators/u/permission", func(w http.ResponseWriter, r *http.Request) {
   228  		testMethod(t, r, "GET")
   229  		fmt.Fprintf(w, `{"permission":"admin","user":{"login":"u"}}`)
   230  	})
   231  
   232  	ctx := context.Background()
   233  	rpl, _, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u")
   234  	if err != nil {
   235  		t.Errorf("Repositories.GetPermissionLevel returned error: %v", err)
   236  	}
   237  
   238  	want := &RepositoryPermissionLevel{
   239  		Permission: Ptr("admin"),
   240  		User: &User{
   241  			Login: Ptr("u"),
   242  		},
   243  	}
   244  
   245  	if !cmp.Equal(rpl, want) {
   246  		t.Errorf("Repositories.GetPermissionLevel returned %+v, want %+v", rpl, want)
   247  	}
   248  
   249  	const methodName = "GetPermissionLevel"
   250  	testBadOptions(t, methodName, func() (err error) {
   251  		_, _, err = client.Repositories.GetPermissionLevel(ctx, "\n", "\n", "\n")
   252  		return err
   253  	})
   254  
   255  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   256  		got, resp, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u")
   257  		if got != nil {
   258  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   259  		}
   260  		return resp, err
   261  	})
   262  }
   263  
   264  func TestRepositoriesService_AddCollaborator(t *testing.T) {
   265  	t.Parallel()
   266  	client, mux, _ := setup(t)
   267  
   268  	opt := &RepositoryAddCollaboratorOptions{Permission: "admin"}
   269  	mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) {
   270  		v := new(RepositoryAddCollaboratorOptions)
   271  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   272  		testMethod(t, r, "PUT")
   273  		if !cmp.Equal(v, opt) {
   274  			t.Errorf("Request body = %+v, want %+v", v, opt)
   275  		}
   276  		w.WriteHeader(http.StatusOK)
   277  		assertWrite(t, w, []byte(`{"permissions": "write","url": "https://api.github.com/user/repository_invitations/1296269","html_url": "https://github.com/octocat/Hello-World/invitations","id":1,"permissions":"write","repository":{"url":"s","name":"r","id":1},"invitee":{"login":"u"},"inviter":{"login":"o"}}`))
   278  	})
   279  	ctx := context.Background()
   280  	collaboratorInvitation, _, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt)
   281  	if err != nil {
   282  		t.Errorf("Repositories.AddCollaborator returned error: %v", err)
   283  	}
   284  	want := &CollaboratorInvitation{
   285  		ID: Ptr(int64(1)),
   286  		Repo: &Repository{
   287  			ID:   Ptr(int64(1)),
   288  			URL:  Ptr("s"),
   289  			Name: Ptr("r"),
   290  		},
   291  		Invitee: &User{
   292  			Login: Ptr("u"),
   293  		},
   294  		Inviter: &User{
   295  			Login: Ptr("o"),
   296  		},
   297  		Permissions: Ptr("write"),
   298  		URL:         Ptr("https://api.github.com/user/repository_invitations/1296269"),
   299  		HTMLURL:     Ptr("https://github.com/octocat/Hello-World/invitations"),
   300  	}
   301  
   302  	if !cmp.Equal(collaboratorInvitation, want) {
   303  		t.Errorf("AddCollaborator returned %+v, want %+v", collaboratorInvitation, want)
   304  	}
   305  
   306  	const methodName = "AddCollaborator"
   307  	testBadOptions(t, methodName, func() (err error) {
   308  		_, _, err = client.Repositories.AddCollaborator(ctx, "\n", "\n", "\n", opt)
   309  		return err
   310  	})
   311  
   312  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   313  		got, resp, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt)
   314  		if got != nil {
   315  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   316  		}
   317  		return resp, err
   318  	})
   319  }
   320  
   321  func TestRepositoriesService_AddCollaborator_invalidUser(t *testing.T) {
   322  	t.Parallel()
   323  	client, _, _ := setup(t)
   324  
   325  	ctx := context.Background()
   326  	_, _, err := client.Repositories.AddCollaborator(ctx, "%", "%", "%", nil)
   327  	testURLParseError(t, err)
   328  }
   329  
   330  func TestRepositoriesService_RemoveCollaborator(t *testing.T) {
   331  	t.Parallel()
   332  	client, mux, _ := setup(t)
   333  
   334  	mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) {
   335  		testMethod(t, r, "DELETE")
   336  		w.WriteHeader(http.StatusNoContent)
   337  	})
   338  
   339  	ctx := context.Background()
   340  	_, err := client.Repositories.RemoveCollaborator(ctx, "o", "r", "u")
   341  	if err != nil {
   342  		t.Errorf("Repositories.RemoveCollaborator returned error: %v", err)
   343  	}
   344  
   345  	const methodName = "RemoveCollaborator"
   346  	testBadOptions(t, methodName, func() (err error) {
   347  		_, err = client.Repositories.RemoveCollaborator(ctx, "\n", "\n", "\n")
   348  		return err
   349  	})
   350  
   351  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   352  		return client.Repositories.RemoveCollaborator(ctx, "o", "r", "u")
   353  	})
   354  }
   355  
   356  func TestRepositoriesService_RemoveCollaborator_invalidUser(t *testing.T) {
   357  	t.Parallel()
   358  	client, _, _ := setup(t)
   359  
   360  	ctx := context.Background()
   361  	_, err := client.Repositories.RemoveCollaborator(ctx, "%", "%", "%")
   362  	testURLParseError(t, err)
   363  }
   364  
   365  func TestRepositoryAddCollaboratorOptions_Marshal(t *testing.T) {
   366  	t.Parallel()
   367  	testJSONMarshal(t, &RepositoryAddCollaboratorOptions{}, "{}")
   368  
   369  	r := &RepositoryAddCollaboratorOptions{
   370  		Permission: "permission",
   371  	}
   372  
   373  	want := `{
   374  		"permission": "permission"
   375  	}`
   376  
   377  	testJSONMarshal(t, r, want)
   378  }
   379  
   380  func TestRepositoryPermissionLevel_Marshal(t *testing.T) {
   381  	t.Parallel()
   382  	testJSONMarshal(t, &RepositoryPermissionLevel{}, "{}")
   383  
   384  	r := &RepositoryPermissionLevel{
   385  		Permission: Ptr("permission"),
   386  		User: &User{
   387  			Login:           Ptr("l"),
   388  			ID:              Ptr(int64(1)),
   389  			URL:             Ptr("u"),
   390  			AvatarURL:       Ptr("a"),
   391  			GravatarID:      Ptr("g"),
   392  			Name:            Ptr("n"),
   393  			Company:         Ptr("c"),
   394  			Blog:            Ptr("b"),
   395  			Location:        Ptr("l"),
   396  			Email:           Ptr("e"),
   397  			Hireable:        Ptr(true),
   398  			Bio:             Ptr("b"),
   399  			TwitterUsername: Ptr("t"),
   400  			PublicRepos:     Ptr(1),
   401  			Followers:       Ptr(1),
   402  			Following:       Ptr(1),
   403  			CreatedAt:       &Timestamp{referenceTime},
   404  			SuspendedAt:     &Timestamp{referenceTime},
   405  		},
   406  	}
   407  
   408  	want := `{
   409  		"permission": "permission",
   410  		"user": {
   411  			"login": "l",
   412  			"id": 1,
   413  			"avatar_url": "a",
   414  			"gravatar_id": "g",
   415  			"name": "n",
   416  			"company": "c",
   417  			"blog": "b",
   418  			"location": "l",
   419  			"email": "e",
   420  			"hireable": true,
   421  			"bio": "b",
   422  			"twitter_username": "t",
   423  			"public_repos": 1,
   424  			"followers": 1,
   425  			"following": 1,
   426  			"created_at": ` + referenceTimeStr + `,
   427  			"suspended_at": ` + referenceTimeStr + `,
   428  			"url": "u"
   429  		}
   430  	}`
   431  
   432  	testJSONMarshal(t, r, want)
   433  }
   434  
   435  func TestCollaboratorInvitation_Marshal(t *testing.T) {
   436  	t.Parallel()
   437  	testJSONMarshal(t, &CollaboratorInvitation{}, "{}")
   438  
   439  	r := &CollaboratorInvitation{
   440  		ID: Ptr(int64(1)),
   441  		Repo: &Repository{
   442  
   443  			ID:   Ptr(int64(1)),
   444  			URL:  Ptr("url"),
   445  			Name: Ptr("n"),
   446  		},
   447  		Invitee: &User{
   448  			Login:           Ptr("l"),
   449  			ID:              Ptr(int64(1)),
   450  			URL:             Ptr("u"),
   451  			AvatarURL:       Ptr("a"),
   452  			GravatarID:      Ptr("g"),
   453  			Name:            Ptr("n"),
   454  			Company:         Ptr("c"),
   455  			Blog:            Ptr("b"),
   456  			Location:        Ptr("l"),
   457  			Email:           Ptr("e"),
   458  			Hireable:        Ptr(true),
   459  			Bio:             Ptr("b"),
   460  			TwitterUsername: Ptr("t"),
   461  			PublicRepos:     Ptr(1),
   462  			Followers:       Ptr(1),
   463  			Following:       Ptr(1),
   464  			CreatedAt:       &Timestamp{referenceTime},
   465  			SuspendedAt:     &Timestamp{referenceTime},
   466  		},
   467  		Inviter: &User{
   468  			Login:           Ptr("l"),
   469  			ID:              Ptr(int64(1)),
   470  			URL:             Ptr("u"),
   471  			AvatarURL:       Ptr("a"),
   472  			GravatarID:      Ptr("g"),
   473  			Name:            Ptr("n"),
   474  			Company:         Ptr("c"),
   475  			Blog:            Ptr("b"),
   476  			Location:        Ptr("l"),
   477  			Email:           Ptr("e"),
   478  			Hireable:        Ptr(true),
   479  			Bio:             Ptr("b"),
   480  			TwitterUsername: Ptr("t"),
   481  			PublicRepos:     Ptr(1),
   482  			Followers:       Ptr(1),
   483  			Following:       Ptr(1),
   484  			CreatedAt:       &Timestamp{referenceTime},
   485  			SuspendedAt:     &Timestamp{referenceTime},
   486  		},
   487  		Permissions: Ptr("per"),
   488  		CreatedAt:   &Timestamp{referenceTime},
   489  		URL:         Ptr("url"),
   490  		HTMLURL:     Ptr("hurl"),
   491  	}
   492  
   493  	want := `{
   494  		"id": 1,
   495  		"repository": {
   496  			"id": 1,
   497  			"name": "n",
   498  			"url": "url"
   499  		},
   500  		"invitee": {
   501  			"login": "l",
   502  			"id": 1,
   503  			"avatar_url": "a",
   504  			"gravatar_id": "g",
   505  			"name": "n",
   506  			"company": "c",
   507  			"blog": "b",
   508  			"location": "l",
   509  			"email": "e",
   510  			"hireable": true,
   511  			"bio": "b",
   512  			"twitter_username": "t",
   513  			"public_repos": 1,
   514  			"followers": 1,
   515  			"following": 1,
   516  			"created_at": ` + referenceTimeStr + `,
   517  			"suspended_at": ` + referenceTimeStr + `,
   518  			"url": "u"
   519  		},
   520  		"inviter": {
   521  			"login": "l",
   522  			"id": 1,
   523  			"avatar_url": "a",
   524  			"gravatar_id": "g",
   525  			"name": "n",
   526  			"company": "c",
   527  			"blog": "b",
   528  			"location": "l",
   529  			"email": "e",
   530  			"hireable": true,
   531  			"bio": "b",
   532  			"twitter_username": "t",
   533  			"public_repos": 1,
   534  			"followers": 1,
   535  			"following": 1,
   536  			"created_at": ` + referenceTimeStr + `,
   537  			"suspended_at": ` + referenceTimeStr + `,
   538  			"url": "u"
   539  		},
   540  		"permissions": "per",
   541  		"created_at": ` + referenceTimeStr + `,
   542  		"url": "url",
   543  		"html_url": "hurl"
   544  	}`
   545  
   546  	testJSONMarshal(t, r, want)
   547  }