github.com/google/go-github/v66@v66.0.0/github/orgs_organization_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  	t.Parallel()
    20  	client, mux, _ := setup(t)
    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_GetOrgRole(t *testing.T) {
   102  	t.Parallel()
   103  	client, mux, _ := setup(t)
   104  
   105  	// Test built-in org role
   106  	mux.HandleFunc("/orgs/o/organization-roles/8132", func(w http.ResponseWriter, r *http.Request) {
   107  		testMethod(t, r, "GET")
   108  		fmt.Fprint(w, `{
   109  			"id": 8132,
   110  			"name": "all_repo_read",
   111  			"description": "Grants read access to all repositories in the organization.",
   112  			"permissions": [],
   113  			"created_at": `+referenceTimeStr+`,
   114  			"updated_at": `+referenceTimeStr+`,
   115  			"source": "Predefined",
   116  			"base_role": "read"
   117  		}`)
   118  	})
   119  
   120  	ctx := context.Background()
   121  
   122  	gotBuiltInRole, _, err := client.Organizations.GetOrgRole(ctx, "o", 8132)
   123  	if err != nil {
   124  		t.Errorf("Organizations.GetOrgRole returned error: %v", err)
   125  	}
   126  
   127  	wantBuiltInRole := &CustomOrgRoles{
   128  		ID:          Int64(8132),
   129  		Name:        String("all_repo_read"),
   130  		Description: String("Grants read access to all repositories in the organization."),
   131  		Permissions: []string{},
   132  		CreatedAt:   &Timestamp{referenceTime},
   133  		UpdatedAt:   &Timestamp{referenceTime},
   134  		Source:      String("Predefined"),
   135  		BaseRole:    String("read"),
   136  	}
   137  
   138  	if !cmp.Equal(gotBuiltInRole, wantBuiltInRole) {
   139  		t.Errorf("Organizations.GetOrgRole returned %+v, want %+v", gotBuiltInRole, wantBuiltInRole)
   140  	}
   141  
   142  	// Test custom org role
   143  	mux.HandleFunc("/orgs/o/organization-roles/123456", func(w http.ResponseWriter, r *http.Request) {
   144  		testMethod(t, r, "GET")
   145  		fmt.Fprint(w, `{
   146  			"id": 123456,
   147  			"name": "test-role",
   148  			"description": "test-role",
   149  			"permissions": [
   150  				"read_organization_custom_org_role",
   151  				"read_organization_custom_repo_role",
   152  				"write_organization_custom_org_role"
   153  			],
   154  			"created_at": `+referenceTimeStr+`,
   155  			"updated_at": `+referenceTimeStr+`,
   156  			"source": "Organization",
   157  			"base_role": null
   158  			}`)
   159  	})
   160  
   161  	gotCustomRole, _, err := client.Organizations.GetOrgRole(ctx, "o", 123456)
   162  	if err != nil {
   163  		t.Errorf("Organizations.GetOrgRole returned error: %v", err)
   164  	}
   165  
   166  	wantCustomRole := &CustomOrgRoles{
   167  		ID:          Int64(123456),
   168  		Name:        String("test-role"),
   169  		Description: String("test-role"),
   170  		Permissions: []string{
   171  			"read_organization_custom_org_role",
   172  			"read_organization_custom_repo_role",
   173  			"write_organization_custom_org_role",
   174  		},
   175  		CreatedAt: &Timestamp{referenceTime},
   176  		UpdatedAt: &Timestamp{referenceTime},
   177  		Source:    String("Organization"),
   178  		BaseRole:  nil,
   179  	}
   180  
   181  	if !cmp.Equal(gotCustomRole, wantCustomRole) {
   182  		t.Errorf("Organizations.GetOrgRole returned %+v, want %+v", gotCustomRole, wantCustomRole)
   183  	}
   184  
   185  	const methodName = "GetOrgRole"
   186  	testBadOptions(t, methodName, func() (err error) {
   187  		_, _, err = client.Organizations.GetOrgRole(ctx, "\no", -8132)
   188  		return err
   189  	})
   190  
   191  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   192  		got, resp, err := client.Organizations.GetOrgRole(ctx, "o", 8132)
   193  		if got != nil {
   194  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   195  		}
   196  		return resp, err
   197  	})
   198  }
   199  
   200  func TestOrganizationsService_CreateCustomOrgRole(t *testing.T) {
   201  	t.Parallel()
   202  	client, mux, _ := setup(t)
   203  
   204  	mux.HandleFunc("/orgs/o/organization-roles", func(w http.ResponseWriter, r *http.Request) {
   205  		testMethod(t, r, "POST")
   206  		fmt.Fprint(w, `{"id":8030,"name":"Reader","description":"A role for reading custom org roles","permissions":["read_organization_custom_org_role"]}`)
   207  	})
   208  
   209  	ctx := context.Background()
   210  
   211  	opts := &CreateOrUpdateOrgRoleOptions{
   212  		Name:        String("Reader"),
   213  		Description: String("A role for reading custom org roles"),
   214  		Permissions: []string{"read_organization_custom_org_role"},
   215  	}
   216  	gotRoles, _, err := client.Organizations.CreateCustomOrgRole(ctx, "o", opts)
   217  	if err != nil {
   218  		t.Errorf("Organizations.CreateCustomOrgRole returned error: %v", err)
   219  	}
   220  
   221  	want := &CustomOrgRoles{ID: Int64(8030), Name: String("Reader"), Permissions: []string{"read_organization_custom_org_role"}, Description: String("A role for reading custom org roles")}
   222  
   223  	if !cmp.Equal(gotRoles, want) {
   224  		t.Errorf("Organizations.CreateCustomOrgRole returned %+v, want %+v", gotRoles, want)
   225  	}
   226  
   227  	const methodName = "CreateCustomOrgRole"
   228  	testBadOptions(t, methodName, func() (err error) {
   229  		_, _, err = client.Organizations.CreateCustomOrgRole(ctx, "\no", nil)
   230  		return err
   231  	})
   232  
   233  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   234  		got, resp, err := client.Organizations.CreateCustomOrgRole(ctx, "o", nil)
   235  		if got != nil {
   236  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   237  		}
   238  		return resp, err
   239  	})
   240  }
   241  
   242  func TestOrganizationsService_UpdateCustomOrgRole(t *testing.T) {
   243  	t.Parallel()
   244  	client, mux, _ := setup(t)
   245  
   246  	mux.HandleFunc("/orgs/o/organization-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   247  		testMethod(t, r, "PATCH")
   248  		fmt.Fprint(w, `{"id":8030,"name":"Updated Name","description":"Updated Description","permissions":["read_organization_custom_org_role"]}`)
   249  	})
   250  
   251  	ctx := context.Background()
   252  
   253  	opts := &CreateOrUpdateOrgRoleOptions{
   254  		Name:        String("Updated Name"),
   255  		Description: String("Updated Description"),
   256  	}
   257  	gotRoles, _, err := client.Organizations.UpdateCustomOrgRole(ctx, "o", 8030, opts)
   258  	if err != nil {
   259  		t.Errorf("Organizations.UpdateCustomOrgRole returned error: %v", err)
   260  	}
   261  
   262  	want := &CustomOrgRoles{ID: Int64(8030), Name: String("Updated Name"), Permissions: []string{"read_organization_custom_org_role"}, Description: String("Updated Description")}
   263  
   264  	if !cmp.Equal(gotRoles, want) {
   265  		t.Errorf("Organizations.UpdateCustomOrgRole returned %+v, want %+v", gotRoles, want)
   266  	}
   267  
   268  	const methodName = "UpdateCustomOrgRole"
   269  	testBadOptions(t, methodName, func() (err error) {
   270  		_, _, err = client.Organizations.UpdateCustomOrgRole(ctx, "\no", 8030, nil)
   271  		return err
   272  	})
   273  
   274  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   275  		got, resp, err := client.Organizations.UpdateCustomOrgRole(ctx, "o", 8030, nil)
   276  		if got != nil {
   277  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   278  		}
   279  		return resp, err
   280  	})
   281  }
   282  
   283  func TestOrganizationsService_DeleteCustomOrgRole(t *testing.T) {
   284  	t.Parallel()
   285  	client, mux, _ := setup(t)
   286  
   287  	mux.HandleFunc("/orgs/o/organization-roles/8030", func(w http.ResponseWriter, r *http.Request) {
   288  		testMethod(t, r, "DELETE")
   289  		w.WriteHeader(http.StatusNoContent)
   290  	})
   291  
   292  	ctx := context.Background()
   293  
   294  	resp, err := client.Organizations.DeleteCustomOrgRole(ctx, "o", 8030)
   295  	if err != nil {
   296  		t.Errorf("Organizations.DeleteCustomOrgRole returned error: %v", err)
   297  	}
   298  
   299  	if !cmp.Equal(resp.StatusCode, 204) {
   300  		t.Errorf("Organizations.DeleteCustomOrgRole returned  status code %+v, want %+v", resp.StatusCode, "204")
   301  	}
   302  
   303  	const methodName = "DeleteCustomOrgRole"
   304  	testBadOptions(t, methodName, func() (err error) {
   305  		_, err = client.Organizations.DeleteCustomOrgRole(ctx, "\no", 8030)
   306  		return err
   307  	})
   308  
   309  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   310  		return client.Organizations.DeleteCustomOrgRole(ctx, "o", 8030)
   311  	})
   312  }
   313  
   314  func TestOrganizationsService_AssignOrgRoleToTeam(t *testing.T) {
   315  	t.Parallel()
   316  	client, mux, _ := setup(t)
   317  
   318  	mux.HandleFunc("/orgs/o/organization-roles/teams/t/8030", func(w http.ResponseWriter, r *http.Request) {
   319  		testMethod(t, r, "PUT")
   320  		w.WriteHeader(http.StatusNoContent)
   321  	})
   322  
   323  	ctx := context.Background()
   324  	resp, err := client.Organizations.AssignOrgRoleToTeam(ctx, "o", "t", 8030)
   325  	if err != nil {
   326  		t.Errorf("Organization.AssignOrgRoleToTeam return error: %v", err)
   327  	}
   328  	if !cmp.Equal(resp.StatusCode, http.StatusNoContent) {
   329  		t.Errorf("Organizations.AssignOrgRoleToTeam returned status code %+v, want %+v", resp.StatusCode, http.StatusNoContent)
   330  	}
   331  
   332  	const methodName = "AssignOrgRoleToTeam"
   333  	testBadOptions(t, methodName, func() (err error) {
   334  		_, err = client.Organizations.AssignOrgRoleToTeam(ctx, "\no", "\nt", -8030)
   335  		return err
   336  	})
   337  
   338  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   339  		return client.Organizations.AssignOrgRoleToTeam(ctx, "o", "t", 8030)
   340  	})
   341  }
   342  
   343  func TestOrganizationsService_RemoveOrgRoleFromTeam(t *testing.T) {
   344  	t.Parallel()
   345  	client, mux, _ := setup(t)
   346  
   347  	mux.HandleFunc("/orgs/o/organization-roles/teams/t/8030", func(w http.ResponseWriter, r *http.Request) {
   348  		testMethod(t, r, "DELETE")
   349  		w.WriteHeader(http.StatusNoContent)
   350  	})
   351  
   352  	ctx := context.Background()
   353  	resp, err := client.Organizations.RemoveOrgRoleFromTeam(ctx, "o", "t", 8030)
   354  	if err != nil {
   355  		t.Errorf("Organization.RemoveOrgRoleFromTeam return error: %v", err)
   356  	}
   357  	if !cmp.Equal(resp.StatusCode, http.StatusNoContent) {
   358  		t.Errorf("Organizations.RemoveOrgRoleFromTeam returned status code %+v, want %+v", resp.StatusCode, http.StatusNoContent)
   359  	}
   360  
   361  	const methodName = "RemoveOrgRoleFromTeam"
   362  	testBadOptions(t, methodName, func() (err error) {
   363  		_, err = client.Organizations.RemoveOrgRoleFromTeam(ctx, "\no", "\nt", -8030)
   364  		return err
   365  	})
   366  
   367  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   368  		return client.Organizations.RemoveOrgRoleFromTeam(ctx, "o", "t", 8030)
   369  	})
   370  }
   371  
   372  func TestOrganizationsService_AssignOrgRoleToUser(t *testing.T) {
   373  	t.Parallel()
   374  	client, mux, _ := setup(t)
   375  
   376  	mux.HandleFunc("/orgs/o/organization-roles/users/t/8030", func(w http.ResponseWriter, r *http.Request) {
   377  		testMethod(t, r, "PUT")
   378  		w.WriteHeader(http.StatusNoContent)
   379  	})
   380  
   381  	ctx := context.Background()
   382  	resp, err := client.Organizations.AssignOrgRoleToUser(ctx, "o", "t", 8030)
   383  	if err != nil {
   384  		t.Errorf("Organization.AssignOrgRoleToUser return error: %v", err)
   385  	}
   386  	if !cmp.Equal(resp.StatusCode, http.StatusNoContent) {
   387  		t.Errorf("Organizations.AssignOrgRoleToUser returned status code %+v, want %+v", resp.StatusCode, http.StatusNoContent)
   388  	}
   389  
   390  	const methodName = "AssignOrgRoleToUser"
   391  	testBadOptions(t, methodName, func() (err error) {
   392  		_, err = client.Organizations.AssignOrgRoleToUser(ctx, "\no", "\nt", -8030)
   393  		return err
   394  	})
   395  
   396  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   397  		return client.Organizations.AssignOrgRoleToUser(ctx, "o", "t", 8030)
   398  	})
   399  }
   400  
   401  func TestOrganizationsService_RemoveOrgRoleFromUser(t *testing.T) {
   402  	t.Parallel()
   403  	client, mux, _ := setup(t)
   404  
   405  	mux.HandleFunc("/orgs/o/organization-roles/users/t/8030", func(w http.ResponseWriter, r *http.Request) {
   406  		testMethod(t, r, "DELETE")
   407  		w.WriteHeader(http.StatusNoContent)
   408  	})
   409  
   410  	ctx := context.Background()
   411  	resp, err := client.Organizations.RemoveOrgRoleFromUser(ctx, "o", "t", 8030)
   412  	if err != nil {
   413  		t.Errorf("Organization.RemoveOrgRoleFromUser return error: %v", err)
   414  	}
   415  	if !cmp.Equal(resp.StatusCode, http.StatusNoContent) {
   416  		t.Errorf("Organizations.RemoveOrgRoleFromUser returned status code %+v, want %+v", resp.StatusCode, http.StatusNoContent)
   417  	}
   418  
   419  	const methodName = "RemoveOrgRoleFromUser"
   420  	testBadOptions(t, methodName, func() (err error) {
   421  		_, err = client.Organizations.RemoveOrgRoleFromUser(ctx, "\no", "\nt", -8030)
   422  		return err
   423  	})
   424  
   425  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   426  		return client.Organizations.RemoveOrgRoleFromUser(ctx, "o", "t", 8030)
   427  	})
   428  }
   429  
   430  func TestOrganizationsService_ListTeamsAssignedToOrgRole(t *testing.T) {
   431  	t.Parallel()
   432  	client, mux, _ := setup(t)
   433  
   434  	mux.HandleFunc("/orgs/o/organization-roles/1729/teams", func(w http.ResponseWriter, r *http.Request) {
   435  		testMethod(t, r, "GET")
   436  		fmt.Fprint(w, `[{"id":1}]`)
   437  	})
   438  	opt := &ListOptions{Page: 2}
   439  	ctx := context.Background()
   440  	apps, _, err := client.Organizations.ListTeamsAssignedToOrgRole(ctx, "o", 1729, opt)
   441  	if err != nil {
   442  		t.Errorf("Organizations.ListTeamsAssignedToOrgRole returned error: %v", err)
   443  	}
   444  
   445  	want := []*Team{{ID: Int64(1)}}
   446  	if !cmp.Equal(apps, want) {
   447  		t.Errorf("Organizations.ListTeamsAssignedToOrgRole returned %+v, want %+v", apps, want)
   448  	}
   449  
   450  	const methodName = "ListTeamsAssignedToOrgRole"
   451  	testBadOptions(t, methodName, func() (err error) {
   452  		_, _, err = client.Organizations.ListTeamsAssignedToOrgRole(ctx, "\no", 1729, opt)
   453  		return err
   454  	})
   455  
   456  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   457  		got, resp, err := client.Organizations.ListTeamsAssignedToOrgRole(ctx, "o", 1729, opt)
   458  		if got != nil {
   459  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   460  		}
   461  		return resp, err
   462  	})
   463  }
   464  
   465  func TestOrganizationsService_ListUsersAssignedToOrgRole(t *testing.T) {
   466  	t.Parallel()
   467  	client, mux, _ := setup(t)
   468  
   469  	mux.HandleFunc("/orgs/o/organization-roles/1729/users", func(w http.ResponseWriter, r *http.Request) {
   470  		testMethod(t, r, "GET")
   471  		fmt.Fprint(w, `[{"id":1}]`)
   472  	})
   473  	opt := &ListOptions{Page: 2}
   474  	ctx := context.Background()
   475  	apps, _, err := client.Organizations.ListUsersAssignedToOrgRole(ctx, "o", 1729, opt)
   476  	if err != nil {
   477  		t.Errorf("Organizations.ListUsersAssignedToOrgRole returned error: %v", err)
   478  	}
   479  
   480  	want := []*User{{ID: Int64(1)}}
   481  	if !cmp.Equal(apps, want) {
   482  		t.Errorf("Organizations.ListUsersAssignedToOrgRole returned %+v, want %+v", apps, want)
   483  	}
   484  
   485  	const methodName = "ListUsersAssignedToOrgRole"
   486  	testBadOptions(t, methodName, func() (err error) {
   487  		_, _, err = client.Organizations.ListUsersAssignedToOrgRole(ctx, "\no", 1729, opt)
   488  		return err
   489  	})
   490  
   491  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   492  		got, resp, err := client.Organizations.ListUsersAssignedToOrgRole(ctx, "o", 1729, opt)
   493  		if got != nil {
   494  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   495  		}
   496  		return resp, err
   497  	})
   498  }