github.com/google/go-github/v69@v69.2.0/github/orgs_codesecurity_configurations_test.go (about) 1 // Copyright 2024 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 "reflect" 14 "testing" 15 ) 16 17 func TestOrganizationsService_GetCodeSecurityConfigurations(t *testing.T) { 18 t.Parallel() 19 ctx := context.Background() 20 client, mux, _ := setup(t) 21 22 mux.HandleFunc("/orgs/o/code-security/configurations", func(w http.ResponseWriter, r *http.Request) { 23 testMethod(t, r, "GET") 24 fmt.Fprint(w, `[ 25 { 26 "id":1, 27 "name":"config1", 28 "code_scanning_default_setup": "enabled" 29 }, 30 { 31 "id":2, 32 "name":"config2", 33 "private_vulnerability_reporting": "enabled" 34 }]`) 35 }) 36 37 configurations, _, err := client.Organizations.GetCodeSecurityConfigurations(ctx, "o") 38 if err != nil { 39 t.Errorf("Organizations.GetOrganizationCodeSecurityConfigurations returned error: %v", err) 40 } 41 42 want := []*CodeSecurityConfiguration{ 43 {ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}, 44 {ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")}, 45 } 46 if !reflect.DeepEqual(configurations, want) { 47 t.Errorf("Organizations.GetCodeSecurityConfigurations returned %+v, want %+v", configurations, want) 48 } 49 const methodName = "GetCodeSecurityConfigurations" 50 testBadOptions(t, methodName, func() (err error) { 51 _, _, err = client.Organizations.GetCodeSecurityConfigurations(ctx, "\n") 52 return err 53 }) 54 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 55 got, resp, err := client.Organizations.GetCodeSecurityConfigurations(ctx, "o") 56 if got != nil { 57 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 58 } 59 return resp, err 60 }) 61 } 62 63 func TestOrganizationsService_GetCodeSecurityConfiguration(t *testing.T) { 64 t.Parallel() 65 client, mux, _ := setup(t) 66 ctx := context.Background() 67 68 mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) { 69 testMethod(t, r, "GET") 70 fmt.Fprint(w, `{ 71 "id":1, 72 "name":"config1", 73 "code_scanning_default_setup": "enabled" 74 }`) 75 }) 76 77 configuration, _, err := client.Organizations.GetCodeSecurityConfiguration(ctx, "o", 1) 78 if err != nil { 79 t.Errorf("Organizations.GetCodeSecurityConfiguration returned error: %v", err) 80 } 81 82 want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")} 83 if !reflect.DeepEqual(configuration, want) { 84 t.Errorf("Organizations.GetCodeSecurityConfiguration returned %+v, want %+v", configuration, want) 85 } 86 87 const methodName = "GetCodeSecurityConfiguration" 88 testBadOptions(t, methodName, func() (err error) { 89 _, _, err = client.Organizations.GetCodeSecurityConfiguration(ctx, "\n", -1) 90 return err 91 }) 92 93 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 94 got, resp, err := client.Organizations.GetCodeSecurityConfiguration(ctx, "o", 1) 95 if got != nil { 96 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 97 } 98 return resp, err 99 }) 100 } 101 102 func TestOrganizationsService_CreateCodeSecurityConfiguration(t *testing.T) { 103 t.Parallel() 104 client, mux, _ := setup(t) 105 ctx := context.Background() 106 107 input := &CodeSecurityConfiguration{ 108 Name: Ptr("config1"), 109 CodeScanningDefaultSetup: Ptr("enabled"), 110 } 111 112 mux.HandleFunc("/orgs/o/code-security/configurations", func(w http.ResponseWriter, r *http.Request) { 113 v := new(CodeSecurityConfiguration) 114 err := json.NewDecoder(r.Body).Decode(v) 115 if err != nil { 116 t.Errorf("Organizations.CreateCodeSecurityConfiguration request body decode failed: %v", err) 117 } 118 119 if !reflect.DeepEqual(v, input) { 120 t.Errorf("Organizations.CreateCodeSecurityConfiguration request body = %+v, want %+v", v, input) 121 } 122 123 fmt.Fprint(w, `{ 124 "id":1, 125 "name":"config1", 126 "code_scanning_default_setup": "enabled" 127 }`) 128 }) 129 130 configuration, _, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input) 131 if err != nil { 132 t.Errorf("Organizations.CreateCodeSecurityConfiguration returned error: %v", err) 133 } 134 135 want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")} 136 if !reflect.DeepEqual(configuration, want) { 137 t.Errorf("Organizations.CreateCodeSecurityConfiguration returned %+v, want %+v", configuration, want) 138 } 139 140 const methodName = "CreateCodeSecurityConfiguration" 141 testBadOptions(t, methodName, func() (err error) { 142 _, _, err = client.Organizations.CreateCodeSecurityConfiguration(ctx, "\n", input) 143 return err 144 }) 145 146 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 147 got, resp, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input) 148 if got != nil { 149 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 150 } 151 return resp, err 152 }) 153 } 154 155 func TestOrganizationsService_GetDefaultCodeSecurityConfigurations(t *testing.T) { 156 t.Parallel() 157 client, mux, _ := setup(t) 158 ctx := context.Background() 159 160 mux.HandleFunc("/orgs/o/code-security/configurations/defaults", func(w http.ResponseWriter, r *http.Request) { 161 testMethod(t, r, "GET") 162 fmt.Fprint(w, `[ 163 { 164 "id":1, 165 "name":"config1", 166 "code_scanning_default_setup": "enabled" 167 }, 168 { 169 "id":2, 170 "name":"config2", 171 "private_vulnerability_reporting": "enabled" 172 }]`) 173 }) 174 175 configurations, _, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o") 176 if err != nil { 177 t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned error: %v", err) 178 } 179 180 want := []*CodeSecurityConfiguration{ 181 {ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}, 182 {ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")}, 183 } 184 if !reflect.DeepEqual(configurations, want) { 185 t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned %+v, want %+v", configurations, want) 186 } 187 188 const methodName = "GetDefaultCodeSecurityConfigurations" 189 testBadOptions(t, methodName, func() (err error) { 190 _, _, err = client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "\n") 191 return err 192 }) 193 194 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 195 got, resp, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o") 196 if got != nil { 197 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 198 } 199 return resp, err 200 }) 201 } 202 203 func TestOrganizationsService_DetachCodeSecurityConfigurationsFromRepositories(t *testing.T) { 204 t.Parallel() 205 client, mux, _ := setup(t) 206 ctx := context.Background() 207 208 mux.HandleFunc("/orgs/o/code-security/configurations/detach", func(w http.ResponseWriter, r *http.Request) { 209 testMethod(t, r, "DELETE") 210 w.WriteHeader(http.StatusNoContent) 211 }) 212 213 resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1}) 214 if err != nil { 215 t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned error: %v", err) 216 } 217 218 want := http.StatusNoContent 219 if resp.StatusCode != want { 220 t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned status %d, want %d", resp.StatusCode, want) 221 } 222 223 const methodName = "DetachCodeSecurityConfigurationsFromRepositories" 224 testBadOptions(t, methodName, func() (err error) { 225 _, err = client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "\n", []int64{1}) 226 return err 227 }) 228 229 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 230 resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1}) 231 return resp, err 232 }) 233 } 234 235 func TestOrganizationsService_UpdateCodeSecurityConfiguration(t *testing.T) { 236 t.Parallel() 237 ctx := context.Background() 238 client, mux, _ := setup(t) 239 240 input := &CodeSecurityConfiguration{ 241 Name: Ptr("config1"), 242 CodeScanningDefaultSetup: Ptr("enabled"), 243 } 244 245 mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) { 246 v := new(CodeSecurityConfiguration) 247 err := json.NewDecoder(r.Body).Decode(v) 248 if err != nil { 249 t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body decode failed: %v", err) 250 } 251 252 if !reflect.DeepEqual(v, input) { 253 t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body = %+v, want %+v", v, input) 254 } 255 256 fmt.Fprint(w, `{ 257 "id":1, 258 "name":"config1", 259 "code_scanning_default_setup": "enabled" 260 }`) 261 }) 262 263 configuration, _, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input) 264 if err != nil { 265 t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned error: %v", err) 266 } 267 268 want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")} 269 if !reflect.DeepEqual(configuration, want) { 270 t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned %+v, want %+v", configuration, want) 271 } 272 273 const methodName = "UpdateCodeSecurityConfiguration" 274 testBadOptions(t, methodName, func() (err error) { 275 _, _, err = client.Organizations.UpdateCodeSecurityConfiguration(ctx, "\n", -1, input) 276 return 277 }) 278 279 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 280 got, resp, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input) 281 if got != nil { 282 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 283 } 284 return resp, err 285 }) 286 } 287 288 func TestOrganizationsService_DeleteCodeSecurityConfiguration(t *testing.T) { 289 t.Parallel() 290 ctx := context.Background() 291 client, mux, _ := setup(t) 292 293 mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) { 294 testMethod(t, r, "DELETE") 295 w.WriteHeader(http.StatusNoContent) 296 }) 297 298 resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1) 299 if err != nil { 300 t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned error: %v", err) 301 } 302 303 want := http.StatusNoContent 304 if resp.StatusCode != want { 305 t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, want) 306 } 307 308 const methodName = "DeleteCodeSecurityConfiguration" 309 testBadOptions(t, methodName, func() (err error) { 310 _, err = client.Organizations.DeleteCodeSecurityConfiguration(ctx, "\n", -1) 311 return 312 }) 313 314 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 315 resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1) 316 return resp, err 317 }) 318 } 319 320 func TestOrganizationsService_AttachCodeSecurityConfigurationsToRepositories(t *testing.T) { 321 t.Parallel() 322 ctx := context.Background() 323 client, mux, _ := setup(t) 324 325 mux.HandleFunc("/orgs/o/code-security/configurations/1/attach", func(w http.ResponseWriter, r *http.Request) { 326 testMethod(t, r, "POST") 327 type request struct { 328 Scope string `json:"scope"` 329 SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"` 330 } 331 v := new(request) 332 err := json.NewDecoder(r.Body).Decode(v) 333 if err != nil { 334 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body decode failed: %v", err) 335 } 336 if v.Scope != "selected" { 337 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body scope = %s, want selected", v.Scope) 338 } 339 if !reflect.DeepEqual(v.SelectedRepositoryIDs, []int64{5, 20}) { 340 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body selected_repository_ids = %+v, want %+v", v.SelectedRepositoryIDs, []int64{5, 20}) 341 } 342 w.WriteHeader(http.StatusAccepted) 343 }) 344 345 resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", int64(1), "selected", []int64{5, 20}) 346 if err != nil { 347 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned error: %v", err) 348 } 349 350 want := http.StatusAccepted 351 if resp.StatusCode != want { 352 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned status %d, want %d", resp.StatusCode, want) 353 } 354 355 const methodName = "AttachCodeSecurityConfigurationsToRepositories" 356 testBadOptions(t, methodName, func() (err error) { 357 _, err = client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "\n", -1, "", nil) 358 return 359 }) 360 361 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 362 resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", 1, "selected", []int64{5, 20}) 363 return resp, err 364 }) 365 } 366 367 func TestOrganizationsService_SetDefaultCodeSecurityConfiguration(t *testing.T) { 368 t.Parallel() 369 ctx := context.Background() 370 client, mux, _ := setup(t) 371 372 mux.HandleFunc("/orgs/o/code-security/configurations/1/defaults", func(w http.ResponseWriter, r *http.Request) { 373 testMethod(t, r, "PUT") 374 fmt.Fprintf(w, ` 375 { 376 "default_for_new_repos": "all", 377 "configuration": 378 { 379 "id": 1, 380 "name": "config1", 381 "code_scanning_default_setup": "enabled" 382 } 383 }`) 384 }) 385 got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all") 386 if err != nil { 387 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned error: %v", err) 388 } 389 wantStatus := http.StatusOK 390 if resp.StatusCode != wantStatus { 391 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, wantStatus) 392 } 393 want := &CodeSecurityConfigurationWithDefaultForNewRepos{ 394 DefaultForNewRepos: Ptr("all"), 395 Configuration: &CodeSecurityConfiguration{ 396 ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled"), 397 }, 398 } 399 if !reflect.DeepEqual(got, want) { 400 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned %+v, want %+v", got, want) 401 } 402 403 const methodName = "SetDefaultCodeSecurityConfiguration" 404 testBadOptions(t, methodName, func() (err error) { 405 _, _, err = client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "\n", -1, "") 406 return 407 }) 408 409 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 410 got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all") 411 if got != nil { 412 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 413 } 414 return resp, err 415 }) 416 } 417 418 func TestOrganizationsService_GetRepositoriesForCodeSecurityConfiguration(t *testing.T) { 419 t.Parallel() 420 ctx := context.Background() 421 client, mux, _ := setup(t) 422 423 mux.HandleFunc("/orgs/o/code-security/configurations/1/repositories", func(w http.ResponseWriter, r *http.Request) { 424 testMethod(t, r, "GET") 425 fmt.Fprint(w, `[ 426 { 427 "id":8, 428 "name":"repo8" 429 }, 430 { 431 "id":42, 432 "name":"repo42" 433 }]`) 434 }) 435 436 repositories, _, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1) 437 if err != nil { 438 t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned error: %v", err) 439 } 440 441 want := []*Repository{ 442 {ID: Ptr(int64(8)), Name: Ptr("repo8")}, 443 {ID: Ptr(int64(42)), Name: Ptr("repo42")}, 444 } 445 if !reflect.DeepEqual(repositories, want) { 446 t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned %+v, want %+v", repositories, want) 447 } 448 449 const methodName = "GetRepositoriesForCodeSecurityConfiguration" 450 testBadOptions(t, methodName, func() (err error) { 451 _, _, err = client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "\n", -1) 452 return 453 }) 454 455 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 456 got, resp, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1) 457 if got != nil { 458 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 459 } 460 return resp, err 461 }) 462 } 463 464 func TestOrganizationsService_GetCodeSecurityConfigurationForRepository(t *testing.T) { 465 t.Parallel() 466 ctx := context.Background() 467 client, mux, _ := setup(t) 468 469 mux.HandleFunc("/repos/o/repo8/code-security-configuration", func(w http.ResponseWriter, r *http.Request) { 470 testMethod(t, r, "GET") 471 fmt.Fprint(w, `{ 472 "state": "attached", 473 "configuration": { 474 "id":42, 475 "name":"config42", 476 "code_scanning_default_setup": "enabled" 477 } 478 }`) 479 }) 480 481 rc, _, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8") 482 if err != nil { 483 t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned error: %v", err) 484 } 485 c := &CodeSecurityConfiguration{ID: Ptr(int64(42)), Name: Ptr("config42"), CodeScanningDefaultSetup: Ptr("enabled")} 486 want := &RepositoryCodeSecurityConfiguration{ 487 State: Ptr("attached"), 488 Configuration: c, 489 } 490 if !reflect.DeepEqual(rc, want) { 491 t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned %+v, want %+v", rc, want) 492 } 493 494 const methodName = "GetCodeSecurityConfigurationForRepository" 495 testBadOptions(t, methodName, func() (err error) { 496 _, _, err = client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "\n", "\n") 497 return 498 }) 499 500 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 501 got, resp, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8") 502 if got != nil { 503 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 504 } 505 return resp, err 506 }) 507 }