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 }