github.com/google/go-github/v74@v74.0.0/github/repos_rules_test.go (about) 1 // Copyright 2023 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 14 "github.com/google/go-cmp/cmp" 15 ) 16 17 func TestRepositoriesService_GetRulesForBranch(t *testing.T) { 18 t.Parallel() 19 client, mux, _ := setup(t) 20 21 mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) { 22 testMethod(t, r, "GET") 23 fmt.Fprint(w, `[ 24 { 25 "ruleset_id": 42069, 26 "ruleset_source_type": "Repository", 27 "ruleset_source": "google/a", 28 "type": "creation" 29 }, 30 { 31 "ruleset_id": 42069, 32 "ruleset_source_type": "Organization", 33 "ruleset_source": "google", 34 "type": "update", 35 "parameters": { 36 "update_allows_fetch_and_merge": true 37 } 38 } 39 ]`) 40 }) 41 42 ctx := context.Background() 43 rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", nil) 44 if err != nil { 45 t.Errorf("Repositories.GetRulesForBranch returned error: %v", err) 46 } 47 48 want := &BranchRules{ 49 Creation: []*BranchRuleMetadata{{RulesetSourceType: RulesetSourceTypeRepository, RulesetSource: "google/a", RulesetID: 42069}}, 50 Update: []*UpdateBranchRule{{BranchRuleMetadata: BranchRuleMetadata{RulesetSourceType: RulesetSourceTypeOrganization, RulesetSource: "google", RulesetID: 42069}, Parameters: UpdateRuleParameters{UpdateAllowsFetchAndMerge: true}}}, 51 } 52 53 if !cmp.Equal(rules, want) { 54 t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", rules, want) 55 } 56 57 const methodName = "GetRulesForBranch" 58 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 59 got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", nil) 60 if got != nil { 61 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 62 } 63 return resp, err 64 }) 65 } 66 67 func TestRepositoriesService_GetRulesForBranch_ListOptions(t *testing.T) { 68 t.Parallel() 69 client, mux, _ := setup(t) 70 71 mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) { 72 testMethod(t, r, "GET") 73 testFormValues(t, r, values{ 74 "page": "2", 75 "per_page": "35", 76 }) 77 fmt.Fprint(w, `[ 78 { 79 "ruleset_id": 42069, 80 "type": "creation" 81 } 82 ]`) 83 }) 84 85 opts := &ListOptions{Page: 2, PerPage: 35} 86 ctx := context.Background() 87 rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", opts) 88 if err != nil { 89 t.Errorf("Repositories.GetRulesForBranch returned error: %v", err) 90 } 91 92 want := &BranchRules{ 93 Creation: []*BranchRuleMetadata{{RulesetID: 42069}}, 94 } 95 96 if !cmp.Equal(rules, want) { 97 t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", rules, want) 98 } 99 100 const methodName = "GetRulesForBranch" 101 testBadOptions(t, methodName, func() (err error) { 102 _, _, err = client.Repositories.GetRulesForBranch(ctx, "\n", "\n", "\n", opts) 103 return err 104 }) 105 106 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 107 got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", opts) 108 if got != nil { 109 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 110 } 111 return resp, err 112 }) 113 } 114 115 func TestRepositoriesService_GetAllRulesets(t *testing.T) { 116 t.Parallel() 117 client, mux, _ := setup(t) 118 119 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 120 testMethod(t, r, "GET") 121 fmt.Fprintf(w, `[ 122 { 123 "id": 42, 124 "name": "ruleset", 125 "source_type": "Repository", 126 "source": "o/repo", 127 "enforcement": "active", 128 "created_at": %[1]s, 129 "updated_at": %[1]s 130 }, 131 { 132 "id": 314, 133 "name": "Another ruleset", 134 "source_type": "Repository", 135 "source": "o/repo", 136 "enforcement": "active", 137 "created_at": %[1]s, 138 "updated_at": %[1]s 139 } 140 ]`, referenceTimeStr) 141 }) 142 143 ctx := context.Background() 144 ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", nil) 145 if err != nil { 146 t.Errorf("Repositories.GetAllRulesets returned error: %v", err) 147 } 148 149 want := []*RepositoryRuleset{ 150 { 151 ID: Ptr(int64(42)), 152 Name: "ruleset", 153 SourceType: Ptr(RulesetSourceTypeRepository), 154 Source: "o/repo", 155 Enforcement: RulesetEnforcementActive, 156 CreatedAt: &Timestamp{referenceTime}, 157 UpdatedAt: &Timestamp{referenceTime}, 158 }, 159 { 160 ID: Ptr(int64(314)), 161 Name: "Another ruleset", 162 SourceType: Ptr(RulesetSourceTypeRepository), 163 Source: "o/repo", 164 Enforcement: RulesetEnforcementActive, 165 CreatedAt: &Timestamp{referenceTime}, 166 UpdatedAt: &Timestamp{referenceTime}, 167 }, 168 } 169 if !cmp.Equal(ruleSet, want) { 170 t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want) 171 } 172 173 const methodName = "GetAllRulesets" 174 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 175 got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", nil) 176 if got != nil { 177 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 178 } 179 return resp, err 180 }) 181 } 182 183 func TestRepositoriesService_GetAllRulesets_ListOptions(t *testing.T) { 184 t.Parallel() 185 client, mux, _ := setup(t) 186 187 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 188 testMethod(t, r, "GET") 189 testFormValues(t, r, values{ 190 "includes_parents": "false", 191 "page": "2", 192 "per_page": "35", 193 }) 194 fmt.Fprint(w, `[ 195 { 196 "id": 42 197 } 198 ]`) 199 }) 200 201 opts := &RepositoryListRulesetsOptions{ 202 IncludesParents: Ptr(false), 203 ListOptions: ListOptions{ 204 Page: 2, 205 PerPage: 35, 206 }, 207 } 208 ctx := context.Background() 209 ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", opts) 210 if err != nil { 211 t.Errorf("Repositories.GetAllRulesets returned error: %v", err) 212 } 213 214 want := []*RepositoryRuleset{ 215 { 216 ID: Ptr(int64(42)), 217 }, 218 } 219 if !cmp.Equal(ruleSet, want) { 220 t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want) 221 } 222 223 const methodName = "GetAllRulesets" 224 testBadOptions(t, methodName, func() (err error) { 225 _, _, err = client.Repositories.GetAllRulesets(ctx, "\n", "\n", opts) 226 return err 227 }) 228 229 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 230 got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", opts) 231 if got != nil { 232 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 233 } 234 return resp, err 235 }) 236 } 237 238 func TestRepositoriesService_CreateRuleset(t *testing.T) { 239 t.Parallel() 240 client, mux, _ := setup(t) 241 242 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 243 testMethod(t, r, "POST") 244 fmt.Fprint(w, `{ 245 "id": 42, 246 "name": "ruleset", 247 "source_type": "Repository", 248 "source": "o/repo", 249 "enforcement": "active" 250 }`) 251 }) 252 253 ctx := context.Background() 254 ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{ 255 Name: "ruleset", 256 Enforcement: RulesetEnforcementActive, 257 }) 258 if err != nil { 259 t.Errorf("Repositories.CreateRuleset returned error: %v", err) 260 } 261 262 want := &RepositoryRuleset{ 263 ID: Ptr(int64(42)), 264 Name: "ruleset", 265 SourceType: Ptr(RulesetSourceTypeRepository), 266 Source: "o/repo", 267 Enforcement: RulesetEnforcementActive, 268 } 269 if !cmp.Equal(ruleSet, want) { 270 t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want) 271 } 272 273 const methodName = "CreateRuleset" 274 275 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 276 got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{}) 277 if got != nil { 278 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 279 } 280 return resp, err 281 }) 282 } 283 284 func TestRepositoriesService_CreateRulesetWithPushRules(t *testing.T) { 285 t.Parallel() 286 client, mux, _ := setup(t) 287 288 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 289 testMethod(t, r, "POST") 290 fmt.Fprint(w, `{ 291 "id": 42, 292 "name": "ruleset", 293 "source_type": "Repository", 294 "source": "o/repo", 295 "enforcement": "active", 296 "target": "push", 297 "rules": [ 298 { 299 "type": "file_path_restriction", 300 "parameters": { 301 "restricted_file_paths": ["/a/file"] 302 } 303 }, 304 { 305 "type": "max_file_path_length", 306 "parameters": { 307 "max_file_path_length": 255 308 } 309 }, 310 { 311 "type": "file_extension_restriction", 312 "parameters": { 313 "restricted_file_extensions": [".exe"] 314 } 315 }, 316 { 317 "type": "max_file_size", 318 "parameters": { 319 "max_file_size": 1024 320 } 321 } 322 ] 323 }`) 324 }) 325 326 ctx := context.Background() 327 ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{ 328 Name: "ruleset", 329 Enforcement: RulesetEnforcementActive, 330 }) 331 if err != nil { 332 t.Errorf("Repositories.CreateRuleset returned error: %v", err) 333 } 334 335 want := &RepositoryRuleset{ 336 ID: Ptr(int64(42)), 337 Name: "ruleset", 338 SourceType: Ptr(RulesetSourceTypeRepository), 339 Source: "o/repo", 340 Target: Ptr(RulesetTargetPush), 341 Enforcement: RulesetEnforcementActive, 342 Rules: &RepositoryRulesetRules{ 343 FilePathRestriction: &FilePathRestrictionRuleParameters{RestrictedFilePaths: []string{"/a/file"}}, 344 MaxFilePathLength: &MaxFilePathLengthRuleParameters{MaxFilePathLength: 255}, 345 FileExtensionRestriction: &FileExtensionRestrictionRuleParameters{RestrictedFileExtensions: []string{".exe"}}, 346 MaxFileSize: &MaxFileSizeRuleParameters{MaxFileSize: 1024}, 347 }, 348 } 349 if !cmp.Equal(ruleSet, want) { 350 t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want) 351 } 352 353 const methodName = "CreateRuleset" 354 355 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 356 got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{}) 357 if got != nil { 358 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 359 } 360 return resp, err 361 }) 362 } 363 364 func TestRepositoriesService_GetRuleset(t *testing.T) { 365 t.Parallel() 366 client, mux, _ := setup(t) 367 368 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 369 testMethod(t, r, "GET") 370 fmt.Fprint(w, `{ 371 "id": 42, 372 "name": "ruleset", 373 "source_type": "Organization", 374 "source": "o", 375 "enforcement": "active", 376 "created_at": `+referenceTimeStr+`, 377 "updated_at": `+referenceTimeStr+` 378 }`) 379 }) 380 381 ctx := context.Background() 382 ruleSet, _, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) 383 if err != nil { 384 t.Errorf("Repositories.GetRuleset returned error: %v", err) 385 } 386 387 want := &RepositoryRuleset{ 388 ID: Ptr(int64(42)), 389 Name: "ruleset", 390 SourceType: Ptr(RulesetSourceTypeOrganization), 391 Source: "o", 392 Enforcement: RulesetEnforcementActive, 393 CreatedAt: &Timestamp{referenceTime}, 394 UpdatedAt: &Timestamp{referenceTime}, 395 } 396 if !cmp.Equal(ruleSet, want) { 397 t.Errorf("Repositories.GetRuleset returned %+v, want %+v", ruleSet, want) 398 } 399 400 const methodName = "GetRuleset" 401 402 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 403 got, resp, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) 404 if got != nil { 405 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 406 } 407 return resp, err 408 }) 409 } 410 411 func TestRepositoriesService_UpdateRuleset(t *testing.T) { 412 t.Parallel() 413 client, mux, _ := setup(t) 414 415 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 416 testMethod(t, r, "PUT") 417 fmt.Fprint(w, `{ 418 "id": 42, 419 "name": "ruleset", 420 "source_type": "Repository", 421 "source": "o/repo", 422 "enforcement": "active" 423 }`) 424 }) 425 426 ctx := context.Background() 427 ruleSet, _, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{ 428 Name: "ruleset", 429 Enforcement: RulesetEnforcementActive, 430 }) 431 if err != nil { 432 t.Errorf("Repositories.UpdateRuleset returned error: %v", err) 433 } 434 435 want := &RepositoryRuleset{ 436 ID: Ptr(int64(42)), 437 Name: "ruleset", 438 SourceType: Ptr(RulesetSourceTypeRepository), 439 Source: "o/repo", 440 Enforcement: "active", 441 } 442 443 if !cmp.Equal(ruleSet, want) { 444 t.Errorf("Repositories.UpdateRuleset returned %+v, want %+v", ruleSet, want) 445 } 446 447 const methodName = "UpdateRuleset" 448 449 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 450 got, resp, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{}) 451 if got != nil { 452 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 453 } 454 return resp, err 455 }) 456 } 457 458 func TestRepositoriesService_UpdateRulesetClearBypassActor(t *testing.T) { 459 t.Parallel() 460 client, mux, _ := setup(t) 461 462 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 463 testMethod(t, r, "PUT") 464 fmt.Fprint(w, `{ 465 "id": 42, 466 "name": "ruleset", 467 "source_type": "Repository", 468 "source": "o/repo", 469 "enforcement": "active" 470 "conditions": { 471 "ref_name": { 472 "include": [ 473 "refs/heads/main", 474 "refs/heads/master" 475 ], 476 "exclude": [ 477 "refs/heads/dev*" 478 ] 479 } 480 }, 481 "rules": [ 482 { 483 "type": "creation" 484 } 485 ] 486 }`) 487 }) 488 489 ctx := context.Background() 490 491 _, err := client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42) 492 if err != nil { 493 t.Errorf("Repositories.UpdateRulesetClearBypassActor returned error: %v \n", err) 494 } 495 496 const methodName = "UpdateRulesetClearBypassActor" 497 498 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 499 return client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42) 500 }) 501 } 502 503 func TestRepositoriesService_UpdateRulesetNoBypassActor(t *testing.T) { 504 t.Parallel() 505 client, mux, _ := setup(t) 506 507 rs := RepositoryRuleset{ 508 Name: "ruleset", 509 Source: "o/repo", 510 Enforcement: RulesetEnforcementActive, 511 } 512 513 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 514 testMethod(t, r, "PUT") 515 fmt.Fprint(w, `{ 516 "id": 42, 517 "name": "ruleset", 518 "source_type": "Repository", 519 "source": "o/repo", 520 "enforcement": "active" 521 }`) 522 }) 523 524 ctx := context.Background() 525 526 ruleSet, _, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, rs) 527 if err != nil { 528 t.Errorf("Repositories.UpdateRulesetNoBypassActor returned error: %v \n", err) 529 } 530 531 want := &RepositoryRuleset{ 532 ID: Ptr(int64(42)), 533 Name: "ruleset", 534 SourceType: Ptr(RulesetSourceTypeRepository), 535 Source: "o/repo", 536 Enforcement: RulesetEnforcementActive, 537 } 538 539 if !cmp.Equal(ruleSet, want) { 540 t.Errorf("Repositories.UpdateRulesetNoBypassActor returned %+v, want %+v", ruleSet, want) 541 } 542 543 const methodName = "UpdateRulesetNoBypassActor" 544 545 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 546 got, resp, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, RepositoryRuleset{}) 547 if got != nil { 548 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 549 } 550 return resp, err 551 }) 552 } 553 554 func TestRepositoriesService_DeleteRuleset(t *testing.T) { 555 t.Parallel() 556 client, mux, _ := setup(t) 557 558 mux.HandleFunc("/repos/o/repo/rulesets/42", func(_ http.ResponseWriter, r *http.Request) { 559 testMethod(t, r, "DELETE") 560 }) 561 562 ctx := context.Background() 563 _, err := client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) 564 if err != nil { 565 t.Errorf("Repositories.DeleteRuleset returned error: %v", err) 566 } 567 568 const methodName = "DeleteRuleset" 569 570 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 571 return client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) 572 }) 573 }