github.com/google/go-github/v69@v69.2.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: Ptr(1), 58 CustomRepoRoles: []*CustomOrgRoles{ 59 { 60 ID: Ptr(int64(1)), 61 Name: Ptr("Auditor"), 62 Permissions: []string{"read_audit_logs"}, 63 Org: &Organization{ 64 Login: Ptr("l"), 65 ID: Ptr(int64(1)), 66 NodeID: Ptr("n"), 67 AvatarURL: Ptr("a"), 68 HTMLURL: Ptr("h"), 69 Name: Ptr("n"), 70 Company: Ptr("c"), 71 Blog: Ptr("b"), 72 Location: Ptr("l"), 73 Email: Ptr("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: Ptr("Organization"), 78 BaseRole: Ptr("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: Ptr(int64(8132)), 129 Name: Ptr("all_repo_read"), 130 Description: Ptr("Grants read access to all repositories in the organization."), 131 Permissions: []string{}, 132 CreatedAt: &Timestamp{referenceTime}, 133 UpdatedAt: &Timestamp{referenceTime}, 134 Source: Ptr("Predefined"), 135 BaseRole: Ptr("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: Ptr(int64(123456)), 168 Name: Ptr("test-role"), 169 Description: Ptr("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: Ptr("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: Ptr("Reader"), 213 Description: Ptr("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: Ptr(int64(8030)), Name: Ptr("Reader"), Permissions: []string{"read_organization_custom_org_role"}, Description: Ptr("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: Ptr("Updated Name"), 255 Description: Ptr("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: Ptr(int64(8030)), Name: Ptr("Updated Name"), Permissions: []string{"read_organization_custom_org_role"}, Description: Ptr("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: Ptr(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: Ptr(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 }