github.com/google/go-github/v74@v74.0.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 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 115 116 if !reflect.DeepEqual(v, input) { 117 t.Errorf("Organizations.CreateCodeSecurityConfiguration request body = %+v, want %+v", v, input) 118 } 119 120 fmt.Fprint(w, `{ 121 "id":1, 122 "name":"config1", 123 "code_scanning_default_setup": "enabled" 124 }`) 125 }) 126 127 configuration, _, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input) 128 if err != nil { 129 t.Errorf("Organizations.CreateCodeSecurityConfiguration returned error: %v", err) 130 } 131 132 want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")} 133 if !reflect.DeepEqual(configuration, want) { 134 t.Errorf("Organizations.CreateCodeSecurityConfiguration returned %+v, want %+v", configuration, want) 135 } 136 137 const methodName = "CreateCodeSecurityConfiguration" 138 testBadOptions(t, methodName, func() (err error) { 139 _, _, err = client.Organizations.CreateCodeSecurityConfiguration(ctx, "\n", input) 140 return err 141 }) 142 143 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 144 got, resp, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input) 145 if got != nil { 146 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 147 } 148 return resp, err 149 }) 150 } 151 152 func TestOrganizationsService_GetDefaultCodeSecurityConfigurations(t *testing.T) { 153 t.Parallel() 154 client, mux, _ := setup(t) 155 ctx := context.Background() 156 157 mux.HandleFunc("/orgs/o/code-security/configurations/defaults", func(w http.ResponseWriter, r *http.Request) { 158 testMethod(t, r, "GET") 159 fmt.Fprint(w, `[ 160 { 161 "id":1, 162 "name":"config1", 163 "code_scanning_default_setup": "enabled" 164 }, 165 { 166 "id":2, 167 "name":"config2", 168 "private_vulnerability_reporting": "enabled" 169 }]`) 170 }) 171 172 configurations, _, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o") 173 if err != nil { 174 t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned error: %v", err) 175 } 176 177 want := []*CodeSecurityConfiguration{ 178 {ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}, 179 {ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")}, 180 } 181 if !reflect.DeepEqual(configurations, want) { 182 t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned %+v, want %+v", configurations, want) 183 } 184 185 const methodName = "GetDefaultCodeSecurityConfigurations" 186 testBadOptions(t, methodName, func() (err error) { 187 _, _, err = client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "\n") 188 return err 189 }) 190 191 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 192 got, resp, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o") 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_DetachCodeSecurityConfigurationsFromRepositories(t *testing.T) { 201 t.Parallel() 202 client, mux, _ := setup(t) 203 ctx := context.Background() 204 205 mux.HandleFunc("/orgs/o/code-security/configurations/detach", func(w http.ResponseWriter, r *http.Request) { 206 testMethod(t, r, "DELETE") 207 w.WriteHeader(http.StatusNoContent) 208 }) 209 210 resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1}) 211 if err != nil { 212 t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned error: %v", err) 213 } 214 215 want := http.StatusNoContent 216 if resp.StatusCode != want { 217 t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned status %d, want %d", resp.StatusCode, want) 218 } 219 220 const methodName = "DetachCodeSecurityConfigurationsFromRepositories" 221 testBadOptions(t, methodName, func() (err error) { 222 _, err = client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "\n", []int64{1}) 223 return err 224 }) 225 226 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 227 resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1}) 228 return resp, err 229 }) 230 } 231 232 func TestOrganizationsService_UpdateCodeSecurityConfiguration(t *testing.T) { 233 t.Parallel() 234 ctx := context.Background() 235 client, mux, _ := setup(t) 236 237 input := &CodeSecurityConfiguration{ 238 Name: Ptr("config1"), 239 CodeScanningDefaultSetup: Ptr("enabled"), 240 } 241 242 mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) { 243 v := new(CodeSecurityConfiguration) 244 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 245 246 if !reflect.DeepEqual(v, input) { 247 t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body = %+v, want %+v", v, input) 248 } 249 250 fmt.Fprint(w, `{ 251 "id":1, 252 "name":"config1", 253 "code_scanning_default_setup": "enabled" 254 }`) 255 }) 256 257 configuration, _, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input) 258 if err != nil { 259 t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned error: %v", err) 260 } 261 262 want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")} 263 if !reflect.DeepEqual(configuration, want) { 264 t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned %+v, want %+v", configuration, want) 265 } 266 267 const methodName = "UpdateCodeSecurityConfiguration" 268 testBadOptions(t, methodName, func() (err error) { 269 _, _, err = client.Organizations.UpdateCodeSecurityConfiguration(ctx, "\n", -1, input) 270 return 271 }) 272 273 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 274 got, resp, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input) 275 if got != nil { 276 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 277 } 278 return resp, err 279 }) 280 } 281 282 func TestOrganizationsService_DeleteCodeSecurityConfiguration(t *testing.T) { 283 t.Parallel() 284 ctx := context.Background() 285 client, mux, _ := setup(t) 286 287 mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) { 288 testMethod(t, r, "DELETE") 289 w.WriteHeader(http.StatusNoContent) 290 }) 291 292 resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1) 293 if err != nil { 294 t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned error: %v", err) 295 } 296 297 want := http.StatusNoContent 298 if resp.StatusCode != want { 299 t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, want) 300 } 301 302 const methodName = "DeleteCodeSecurityConfiguration" 303 testBadOptions(t, methodName, func() (err error) { 304 _, err = client.Organizations.DeleteCodeSecurityConfiguration(ctx, "\n", -1) 305 return 306 }) 307 308 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 309 resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1) 310 return resp, err 311 }) 312 } 313 314 func TestOrganizationsService_AttachCodeSecurityConfigurationsToRepositories(t *testing.T) { 315 t.Parallel() 316 ctx := context.Background() 317 client, mux, _ := setup(t) 318 319 mux.HandleFunc("/orgs/o/code-security/configurations/1/attach", func(w http.ResponseWriter, r *http.Request) { 320 testMethod(t, r, "POST") 321 type request struct { 322 Scope string `json:"scope"` 323 SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"` 324 } 325 v := new(request) 326 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 327 if v.Scope != "selected" { 328 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body scope = %s, want selected", v.Scope) 329 } 330 if !reflect.DeepEqual(v.SelectedRepositoryIDs, []int64{5, 20}) { 331 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body selected_repository_ids = %+v, want %+v", v.SelectedRepositoryIDs, []int64{5, 20}) 332 } 333 w.WriteHeader(http.StatusAccepted) 334 }) 335 336 resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", int64(1), "selected", []int64{5, 20}) 337 if err != nil { 338 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned error: %v", err) 339 } 340 341 want := http.StatusAccepted 342 if resp.StatusCode != want { 343 t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned status %d, want %d", resp.StatusCode, want) 344 } 345 346 const methodName = "AttachCodeSecurityConfigurationsToRepositories" 347 testBadOptions(t, methodName, func() (err error) { 348 _, err = client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "\n", -1, "", nil) 349 return 350 }) 351 352 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 353 resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", 1, "selected", []int64{5, 20}) 354 return resp, err 355 }) 356 } 357 358 func TestOrganizationsService_SetDefaultCodeSecurityConfiguration(t *testing.T) { 359 t.Parallel() 360 ctx := context.Background() 361 client, mux, _ := setup(t) 362 363 mux.HandleFunc("/orgs/o/code-security/configurations/1/defaults", func(w http.ResponseWriter, r *http.Request) { 364 testMethod(t, r, "PUT") 365 fmt.Fprint(w, ` 366 { 367 "default_for_new_repos": "all", 368 "configuration": 369 { 370 "id": 1, 371 "name": "config1", 372 "code_scanning_default_setup": "enabled" 373 } 374 }`) 375 }) 376 got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all") 377 if err != nil { 378 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned error: %v", err) 379 } 380 wantStatus := http.StatusOK 381 if resp.StatusCode != wantStatus { 382 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, wantStatus) 383 } 384 want := &CodeSecurityConfigurationWithDefaultForNewRepos{ 385 DefaultForNewRepos: Ptr("all"), 386 Configuration: &CodeSecurityConfiguration{ 387 ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled"), 388 }, 389 } 390 if !reflect.DeepEqual(got, want) { 391 t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned %+v, want %+v", got, want) 392 } 393 394 const methodName = "SetDefaultCodeSecurityConfiguration" 395 testBadOptions(t, methodName, func() (err error) { 396 _, _, err = client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "\n", -1, "") 397 return 398 }) 399 400 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 401 got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all") 402 if got != nil { 403 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 404 } 405 return resp, err 406 }) 407 } 408 409 func TestOrganizationsService_GetRepositoriesForCodeSecurityConfiguration(t *testing.T) { 410 t.Parallel() 411 ctx := context.Background() 412 client, mux, _ := setup(t) 413 414 mux.HandleFunc("/orgs/o/code-security/configurations/1/repositories", func(w http.ResponseWriter, r *http.Request) { 415 testMethod(t, r, "GET") 416 fmt.Fprint(w, `[ 417 { 418 "id":8, 419 "name":"repo8" 420 }, 421 { 422 "id":42, 423 "name":"repo42" 424 }]`) 425 }) 426 427 repositories, _, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1) 428 if err != nil { 429 t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned error: %v", err) 430 } 431 432 want := []*Repository{ 433 {ID: Ptr(int64(8)), Name: Ptr("repo8")}, 434 {ID: Ptr(int64(42)), Name: Ptr("repo42")}, 435 } 436 if !reflect.DeepEqual(repositories, want) { 437 t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned %+v, want %+v", repositories, want) 438 } 439 440 const methodName = "GetRepositoriesForCodeSecurityConfiguration" 441 testBadOptions(t, methodName, func() (err error) { 442 _, _, err = client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "\n", -1) 443 return 444 }) 445 446 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 447 got, resp, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1) 448 if got != nil { 449 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 450 } 451 return resp, err 452 }) 453 } 454 455 func TestOrganizationsService_GetCodeSecurityConfigurationForRepository(t *testing.T) { 456 t.Parallel() 457 ctx := context.Background() 458 client, mux, _ := setup(t) 459 460 mux.HandleFunc("/repos/o/repo8/code-security-configuration", func(w http.ResponseWriter, r *http.Request) { 461 testMethod(t, r, "GET") 462 fmt.Fprint(w, `{ 463 "state": "attached", 464 "configuration": { 465 "id":42, 466 "name":"config42", 467 "code_scanning_default_setup": "enabled" 468 } 469 }`) 470 }) 471 472 rc, _, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8") 473 if err != nil { 474 t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned error: %v", err) 475 } 476 c := &CodeSecurityConfiguration{ID: Ptr(int64(42)), Name: Ptr("config42"), CodeScanningDefaultSetup: Ptr("enabled")} 477 want := &RepositoryCodeSecurityConfiguration{ 478 State: Ptr("attached"), 479 Configuration: c, 480 } 481 if !reflect.DeepEqual(rc, want) { 482 t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned %+v, want %+v", rc, want) 483 } 484 485 const methodName = "GetCodeSecurityConfigurationForRepository" 486 testBadOptions(t, methodName, func() (err error) { 487 _, _, err = client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "\n", "\n") 488 return 489 }) 490 491 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 492 got, resp, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8") 493 if got != nil { 494 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 495 } 496 return resp, err 497 }) 498 }