github.com/google/go-github/v65@v65.0.0/github/orgs_custom_roles_test.go (about)

     1  // Copyright 2022 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  	"fmt"
    11  	"net/http"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/google/go-cmp/cmp"
    16  )
    17  
    18  func TestOrganizationsService_ListRoles(t *testing.T) {
    19  	client, mux, _, teardown := setup()
    20  	defer teardown()
    21  
    22  	mux.HandleFunc("/orgs/o/organization-roles", func(w http.ResponseWriter, r *http.Request) {
    23  		testMethod(t, r, "GET")
    24  		fmt.Fprint(w, `{"total_count": 1, "roles": [
    25  			{
    26  				"id": 1,
    27  				"name": "Auditor",
    28  				"permissions": ["read_audit_logs"],
    29  				"organization": {
    30  					"login": "l",
    31  					"id": 1,
    32  					"node_id": "n",
    33  					"avatar_url": "a",
    34  					"html_url": "h",
    35  					"name": "n",
    36  					"company": "c",
    37  					"blog": "b",
    38  					"location": "l",
    39  					"email": "e"
    40  				},
    41  				"created_at": "2024-07-21T19:33:08Z",
    42  				"updated_at": "2024-07-21T19:33:08Z",
    43  				"source": "Organization",
    44  				"base_role": "admin"
    45  			}
    46  			]
    47  		}`)
    48  	})
    49  
    50  	ctx := context.Background()
    51  	apps, _, err := client.Organizations.ListRoles(ctx, "o")
    52  	if err != nil {
    53  		t.Errorf("Organizations.ListRoles returned error: %v", err)
    54  	}
    55  
    56  	want := &OrganizationCustomRoles{
    57  		TotalCount: Int(1),
    58  		CustomRepoRoles: []*CustomOrgRoles{
    59  			{
    60  				ID:          Int64(1),
    61  				Name:        String("Auditor"),
    62  				Permissions: []string{"read_audit_logs"},
    63  				Org: &Organization{
    64  					Login:     String("l"),
    65  					ID:        Int64(1),
    66  					NodeID:    String("n"),
    67  					AvatarURL: String("a"),
    68  					HTMLURL:   String("h"),
    69  					Name:      String("n"),
    70  					Company:   String("c"),
    71  					Blog:      String("b"),
    72  					Location:  String("l"),
    73  					Email:     String("e"),
    74  				},
    75  				CreatedAt: &Timestamp{time.Date(2024, time.July, 21, 19, 33, 8, 0, time.UTC)},
    76  				UpdatedAt: &Timestamp{time.Date(2024, time.July, 21, 19, 33, 8, 0, time.UTC)},
    77  				Source:    String("Organization"),
    78  				BaseRole:  String("admin"),
    79  			},
    80  		},
    81  	}
    82  	if !cmp.Equal(apps, want) {
    83  		t.Errorf("Organizations.ListRoles returned %+v, want %+v", apps, want)
    84  	}
    85  
    86  	const methodName = "ListRoles"
    87  	testBadOptions(t, methodName, func() (err error) {
    88  		_, _, err = client.Organizations.ListRoles(ctx, "\no")
    89  		return err
    90  	})
    91  
    92  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    93  		got, resp, err := client.Organizations.ListRoles(ctx, "o")
    94  		if got != nil {
    95  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    96  		}
    97  		return resp, err
    98  	})
    99  }
   100  
   101  func TestOrganizationsService_CreateCustomOrgRole(t *testing.T) {
   102  	client, mux, _, teardown := setup()
   103  	defer teardown()
   104  
   105  	mux.HandleFunc("/orgs/o/organization-roles", func(w http.ResponseWriter, r *http.Request) {
   106  		testMethod(t, r, "POST")
   107  		fmt.Fprint(w, `{"id":8030,"name":"Reader","description":"A role for reading custom org roles","permissions":["read_organization_custom_org_role"]}`)
   108  	})
   109  
   110  	ctx := context.Background()
   111  
   112  	opts := &CreateOrUpdateOrgRoleOptions{
   113  		Name:        String("Reader"),
   114  		Description: String("A role for reading custom org roles"),
   115  		Permissions: []string{"read_organization_custom_org_role"},
   116  	}
   117  	gotRoles, _, err := client.Organizations.CreateCustomOrgRole(ctx, "o", opts)
   118  	if err != nil {
   119  		t.Errorf("Organizations.CreateCustomOrgRole returned error: %v", err)
   120  	}
   121  
   122  	want := &CustomOrgRoles{ID: Int64(8030), Name: String("Reader"), Permissions: []string{"read_organization_custom_org_role"}, Description: String("A role for reading custom org roles")}
   123  
   124  	if !cmp.Equal(gotRoles, want) {
   125  		t.Errorf("Organizations.CreateCustomOrgRole returned %+v, want %+v", gotRoles, want)
   126  	}
   127  
   128  	const methodName = "CreateCustomOrgRole"
   129  	testBadOptions(t, methodName, func() (err error) {
   130  		_, _, err = client.Organizations.CreateCustomOrgRole(ctx, "\no", nil)
   131  		return err
   132  	})
   133  
   134  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   135  		got, resp, err := client.Organizations.CreateCustomOrgRole(ctx, "o", nil)
   136  		if got != nil {
   137  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   138  		}
   139  		return resp, err
   140  	})
   141  }
   142  
   143  func TestOrganizationsService_UpdateCustomOrgRole(t *testing.T) {
   144  	client, mux, _, teardown := setup()
   145  	defer teardown()
   146  
   147  	mux.HandleFunc("/orgs/o/organization-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   148  		testMethod(t, r, "PATCH")
   149  		fmt.Fprint(w, `{"id":8030,"name":"Updated Name","description":"Updated Description","permissions":["read_organization_custom_org_role"]}`)
   150  	})
   151  
   152  	ctx := context.Background()
   153  
   154  	opts := &CreateOrUpdateOrgRoleOptions{
   155  		Name:        String("Updated Name"),
   156  		Description: String("Updated Description"),
   157  	}
   158  	gotRoles, _, err := client.Organizations.UpdateCustomOrgRole(ctx, "o", 8030, opts)
   159  	if err != nil {
   160  		t.Errorf("Organizations.UpdateCustomOrgRole returned error: %v", err)
   161  	}
   162  
   163  	want := &CustomOrgRoles{ID: Int64(8030), Name: String("Updated Name"), Permissions: []string{"read_organization_custom_org_role"}, Description: String("Updated Description")}
   164  
   165  	if !cmp.Equal(gotRoles, want) {
   166  		t.Errorf("Organizations.UpdateCustomOrgRole returned %+v, want %+v", gotRoles, want)
   167  	}
   168  
   169  	const methodName = "UpdateCustomOrgRole"
   170  	testBadOptions(t, methodName, func() (err error) {
   171  		_, _, err = client.Organizations.UpdateCustomOrgRole(ctx, "\no", 8030, nil)
   172  		return err
   173  	})
   174  
   175  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   176  		got, resp, err := client.Organizations.UpdateCustomOrgRole(ctx, "o", 8030, nil)
   177  		if got != nil {
   178  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   179  		}
   180  		return resp, err
   181  	})
   182  }
   183  
   184  func TestOrganizationsService_DeleteCustomOrgRole(t *testing.T) {
   185  	client, mux, _, teardown := setup()
   186  	defer teardown()
   187  
   188  	mux.HandleFunc("/orgs/o/organization-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   189  		testMethod(t, r, "DELETE")
   190  		w.WriteHeader(http.StatusNoContent)
   191  	})
   192  
   193  	ctx := context.Background()
   194  
   195  	resp, err := client.Organizations.DeleteCustomOrgRole(ctx, "o", 8030)
   196  	if err != nil {
   197  		t.Errorf("Organizations.DeleteCustomOrgRole returned error: %v", err)
   198  	}
   199  
   200  	if !cmp.Equal(resp.StatusCode, 204) {
   201  		t.Errorf("Organizations.DeleteCustomOrgRole returned  status code %+v, want %+v", resp.StatusCode, "204")
   202  	}
   203  
   204  	const methodName = "DeleteCustomOrgRole"
   205  	testBadOptions(t, methodName, func() (err error) {
   206  		_, err = client.Organizations.DeleteCustomOrgRole(ctx, "\no", 8030)
   207  		return err
   208  	})
   209  
   210  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   211  		return client.Organizations.DeleteCustomOrgRole(ctx, "o", 8030)
   212  	})
   213  }
   214  
   215  func TestOrganizationsService_ListCustomRepoRoles(t *testing.T) {
   216  	client, mux, _, teardown := setup()
   217  	defer teardown()
   218  
   219  	mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) {
   220  		testMethod(t, r, "GET")
   221  		fmt.Fprint(w, `{"total_count": 1, "custom_roles": [
   222  			{
   223  				"id": 1,
   224  				"name": "Developer",
   225  				"base_role": "write",
   226  				"permissions": ["delete_alerts_code_scanning"],
   227  				"organization": {
   228  					"login": "l",
   229  					"id": 1,
   230  					"node_id": "n",
   231  					"avatar_url": "a",
   232  					"html_url": "h",
   233  					"name": "n",
   234  					"company": "c",
   235  					"blog": "b",
   236  					"location": "l",
   237  					"email": "e"
   238  				},
   239  				"created_at": "2024-07-21T19:33:08Z",
   240  				"updated_at": "2024-07-21T19:33:08Z"
   241  			}
   242  		  ]
   243  		}`)
   244  	})
   245  
   246  	ctx := context.Background()
   247  	apps, _, err := client.Organizations.ListCustomRepoRoles(ctx, "o")
   248  	if err != nil {
   249  		t.Errorf("Organizations.ListCustomRepoRoles returned error: %v", err)
   250  	}
   251  
   252  	want := &OrganizationCustomRepoRoles{
   253  		TotalCount: Int(1),
   254  		CustomRepoRoles: []*CustomRepoRoles{
   255  			{
   256  				ID:          Int64(1),
   257  				Name:        String("Developer"),
   258  				BaseRole:    String("write"),
   259  				Permissions: []string{"delete_alerts_code_scanning"},
   260  				Org: &Organization{
   261  					Login:     String("l"),
   262  					ID:        Int64(1),
   263  					NodeID:    String("n"),
   264  					AvatarURL: String("a"),
   265  					HTMLURL:   String("h"),
   266  					Name:      String("n"),
   267  					Company:   String("c"),
   268  					Blog:      String("b"),
   269  					Location:  String("l"),
   270  					Email:     String("e"),
   271  				},
   272  				CreatedAt: &Timestamp{time.Date(2024, time.July, 21, 19, 33, 8, 0, time.UTC)},
   273  				UpdatedAt: &Timestamp{time.Date(2024, time.July, 21, 19, 33, 8, 0, time.UTC)},
   274  			},
   275  		},
   276  	}
   277  	if !cmp.Equal(apps, want) {
   278  		t.Errorf("Organizations.ListCustomRepoRoles returned %+v, want %+v", apps, want)
   279  	}
   280  
   281  	const methodName = "ListCustomRepoRoles"
   282  	testBadOptions(t, methodName, func() (err error) {
   283  		_, _, err = client.Organizations.ListCustomRepoRoles(ctx, "\no")
   284  		return err
   285  	})
   286  
   287  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   288  		got, resp, err := client.Organizations.ListCustomRepoRoles(ctx, "o")
   289  		if got != nil {
   290  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   291  		}
   292  		return resp, err
   293  	})
   294  }
   295  
   296  func TestOrganizationsService_CreateCustomRepoRole(t *testing.T) {
   297  	client, mux, _, teardown := setup()
   298  	defer teardown()
   299  
   300  	mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) {
   301  		testMethod(t, r, "POST")
   302  		fmt.Fprint(w, `{"id":8030,"name":"Labeler","description":"A role for issue and PR labelers","base_role":"read","permissions":["add_label"]}`)
   303  	})
   304  
   305  	ctx := context.Background()
   306  
   307  	opts := &CreateOrUpdateCustomRepoRoleOptions{
   308  		Name:        String("Labeler"),
   309  		Description: String("A role for issue and PR labelers"),
   310  		BaseRole:    String("read"),
   311  		Permissions: []string{"add_label"},
   312  	}
   313  	apps, _, err := client.Organizations.CreateCustomRepoRole(ctx, "o", opts)
   314  	if err != nil {
   315  		t.Errorf("Organizations.CreateCustomRepoRole returned error: %v", err)
   316  	}
   317  
   318  	want := &CustomRepoRoles{ID: Int64(8030), Name: String("Labeler"), BaseRole: String("read"), Permissions: []string{"add_label"}, Description: String("A role for issue and PR labelers")}
   319  
   320  	if !cmp.Equal(apps, want) {
   321  		t.Errorf("Organizations.CreateCustomRepoRole returned %+v, want %+v", apps, want)
   322  	}
   323  
   324  	const methodName = "CreateCustomRepoRole"
   325  	testBadOptions(t, methodName, func() (err error) {
   326  		_, _, err = client.Organizations.CreateCustomRepoRole(ctx, "\no", nil)
   327  		return err
   328  	})
   329  
   330  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   331  		got, resp, err := client.Organizations.CreateCustomRepoRole(ctx, "o", nil)
   332  		if got != nil {
   333  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   334  		}
   335  		return resp, err
   336  	})
   337  }
   338  
   339  func TestOrganizationsService_UpdateCustomRepoRole(t *testing.T) {
   340  	client, mux, _, teardown := setup()
   341  	defer teardown()
   342  
   343  	mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   344  		testMethod(t, r, "PATCH")
   345  		fmt.Fprint(w, `{"id":8030,"name":"Updated Name","description":"Updated Description","base_role":"read","permissions":["add_label"]}`)
   346  	})
   347  
   348  	ctx := context.Background()
   349  
   350  	opts := &CreateOrUpdateCustomRepoRoleOptions{
   351  		Name:        String("Updated Name"),
   352  		Description: String("Updated Description"),
   353  	}
   354  	apps, _, err := client.Organizations.UpdateCustomRepoRole(ctx, "o", 8030, opts)
   355  	if err != nil {
   356  		t.Errorf("Organizations.UpdateCustomRepoRole returned error: %v", err)
   357  	}
   358  
   359  	want := &CustomRepoRoles{ID: Int64(8030), Name: String("Updated Name"), BaseRole: String("read"), Permissions: []string{"add_label"}, Description: String("Updated Description")}
   360  
   361  	if !cmp.Equal(apps, want) {
   362  		t.Errorf("Organizations.UpdateCustomRepoRole returned %+v, want %+v", apps, want)
   363  	}
   364  
   365  	const methodName = "UpdateCustomRepoRole"
   366  	testBadOptions(t, methodName, func() (err error) {
   367  		_, _, err = client.Organizations.UpdateCustomRepoRole(ctx, "\no", 8030, nil)
   368  		return err
   369  	})
   370  
   371  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   372  		got, resp, err := client.Organizations.UpdateCustomRepoRole(ctx, "o", 8030, nil)
   373  		if got != nil {
   374  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   375  		}
   376  		return resp, err
   377  	})
   378  }
   379  
   380  func TestOrganizationsService_DeleteCustomRepoRole(t *testing.T) {
   381  	client, mux, _, teardown := setup()
   382  	defer teardown()
   383  
   384  	mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   385  		testMethod(t, r, "DELETE")
   386  		w.WriteHeader(http.StatusNoContent)
   387  	})
   388  
   389  	ctx := context.Background()
   390  
   391  	resp, err := client.Organizations.DeleteCustomRepoRole(ctx, "o", 8030)
   392  	if err != nil {
   393  		t.Errorf("Organizations.DeleteCustomRepoRole returned error: %v", err)
   394  	}
   395  
   396  	if !cmp.Equal(resp.StatusCode, 204) {
   397  		t.Errorf("Organizations.DeleteCustomRepoRole returned  status code %+v, want %+v", resp.StatusCode, "204")
   398  	}
   399  
   400  	const methodName = "DeleteCustomRepoRole"
   401  	testBadOptions(t, methodName, func() (err error) {
   402  		_, err = client.Organizations.DeleteCustomRepoRole(ctx, "\no", 8030)
   403  		return err
   404  	})
   405  }
   406  
   407  func TestOrganizationsService_ListTeamsAssignedToOrgRole(t *testing.T) {
   408  	client, mux, _, teardown := setup()
   409  	defer teardown()
   410  
   411  	mux.HandleFunc("/orgs/o/organization-roles/1729/teams", func(w http.ResponseWriter, r *http.Request) {
   412  		testMethod(t, r, "GET")
   413  		fmt.Fprint(w, `[{"id":1}]`)
   414  	})
   415  	opt := &ListOptions{Page: 2}
   416  	ctx := context.Background()
   417  	apps, _, err := client.Organizations.ListTeamsAssignedToOrgRole(ctx, "o", 1729, opt)
   418  	if err != nil {
   419  		t.Errorf("Organizations.ListTeamsAssignedToOrgRole returned error: %v", err)
   420  	}
   421  
   422  	want := []*Team{{ID: Int64(1)}}
   423  	if !cmp.Equal(apps, want) {
   424  		t.Errorf("Organizations.ListTeamsAssignedToOrgRole returned %+v, want %+v", apps, want)
   425  	}
   426  
   427  	const methodName = "ListTeamsAssignedToOrgRole"
   428  	testBadOptions(t, methodName, func() (err error) {
   429  		_, _, err = client.Organizations.ListTeamsAssignedToOrgRole(ctx, "\no", 1729, opt)
   430  		return err
   431  	})
   432  
   433  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   434  		got, resp, err := client.Organizations.ListTeamsAssignedToOrgRole(ctx, "o", 1729, opt)
   435  		if got != nil {
   436  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   437  		}
   438  		return resp, err
   439  	})
   440  }
   441  
   442  func TestOrganizationsService_ListUsersAssignedToOrgRole(t *testing.T) {
   443  	client, mux, _, teardown := setup()
   444  	defer teardown()
   445  
   446  	mux.HandleFunc("/orgs/o/organization-roles/1729/users", func(w http.ResponseWriter, r *http.Request) {
   447  		testMethod(t, r, "GET")
   448  		fmt.Fprint(w, `[{"id":1}]`)
   449  	})
   450  	opt := &ListOptions{Page: 2}
   451  	ctx := context.Background()
   452  	apps, _, err := client.Organizations.ListUsersAssignedToOrgRole(ctx, "o", 1729, opt)
   453  	if err != nil {
   454  		t.Errorf("Organizations.ListUsersAssignedToOrgRole returned error: %v", err)
   455  	}
   456  
   457  	want := []*User{{ID: Int64(1)}}
   458  	if !cmp.Equal(apps, want) {
   459  		t.Errorf("Organizations.ListUsersAssignedToOrgRole returned %+v, want %+v", apps, want)
   460  	}
   461  
   462  	const methodName = "ListUsersAssignedToOrgRole"
   463  	testBadOptions(t, methodName, func() (err error) {
   464  		_, _, err = client.Organizations.ListUsersAssignedToOrgRole(ctx, "\no", 1729, opt)
   465  		return err
   466  	})
   467  
   468  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   469  		got, resp, err := client.Organizations.ListUsersAssignedToOrgRole(ctx, "o", 1729, opt)
   470  		if got != nil {
   471  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   472  		}
   473  		return resp, err
   474  	})
   475  }