github.com/google/go-github/v57@v57.0.0/github/orgs_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 TestOrganizationsService_GetAllOrganizationRulesets(t *testing.T) { 18 client, mux, _, teardown := setup() 19 defer teardown() 20 21 mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { 22 testMethod(t, r, "GET") 23 fmt.Fprint(w, `[{ 24 "id": 26110, 25 "name": "test ruleset", 26 "target": "branch", 27 "source_type": "Organization", 28 "source": "o", 29 "enforcement": "active", 30 "bypass_mode": "none", 31 "node_id": "nid", 32 "_links": { 33 "self": { 34 "href": "https://api.github.com/orgs/o/rulesets/26110" 35 } 36 } 37 }]`) 38 }) 39 40 ctx := context.Background() 41 rulesets, _, err := client.Organizations.GetAllOrganizationRulesets(ctx, "o") 42 if err != nil { 43 t.Errorf("Organizations.GetAllOrganizationRulesets returned error: %v", err) 44 } 45 46 want := []*Ruleset{{ 47 ID: Int64(26110), 48 Name: "test ruleset", 49 Target: String("branch"), 50 SourceType: String("Organization"), 51 Source: "o", 52 Enforcement: "active", 53 NodeID: String("nid"), 54 Links: &RulesetLinks{ 55 Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, 56 }, 57 }} 58 if !cmp.Equal(rulesets, want) { 59 t.Errorf("Organizations.GetAllOrganizationRulesets returned %+v, want %+v", rulesets, want) 60 } 61 62 const methodName = "GetAllOrganizationRulesets" 63 64 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 65 got, resp, err := client.Organizations.GetAllOrganizationRulesets(ctx, "o") 66 if got != nil { 67 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 68 } 69 return resp, err 70 }) 71 } 72 73 func TestOrganizationsService_CreateOrganizationRuleset_RepoNames(t *testing.T) { 74 client, mux, _, teardown := setup() 75 defer teardown() 76 77 mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { 78 testMethod(t, r, "POST") 79 fmt.Fprint(w, `{ 80 "id": 21, 81 "name": "ruleset", 82 "target": "branch", 83 "source_type": "Organization", 84 "source": "o", 85 "enforcement": "active", 86 "bypass_actors": [ 87 { 88 "actor_id": 234, 89 "actor_type": "Team" 90 } 91 ], 92 "conditions": { 93 "ref_name": { 94 "include": [ 95 "refs/heads/main", 96 "refs/heads/master" 97 ], 98 "exclude": [ 99 "refs/heads/dev*" 100 ] 101 }, 102 "repository_name": { 103 "include": [ 104 "important_repository", 105 "another_important_repository" 106 ], 107 "exclude": [ 108 "unimportant_repository" 109 ], 110 "protected": true 111 } 112 }, 113 "rules": [ 114 { 115 "type": "creation" 116 }, 117 { 118 "type": "update", 119 "parameters": { 120 "update_allows_fetch_and_merge": true 121 } 122 }, 123 { 124 "type": "deletion" 125 }, 126 { 127 "type": "required_linear_history" 128 }, 129 { 130 "type": "required_deployments", 131 "parameters": { 132 "required_deployment_environments": ["test"] 133 } 134 }, 135 { 136 "type": "required_signatures" 137 }, 138 { 139 "type": "pull_request", 140 "parameters": { 141 "dismiss_stale_reviews_on_push": true, 142 "require_code_owner_review": true, 143 "require_last_push_approval": true, 144 "required_approving_review_count": 1, 145 "required_review_thread_resolution": true 146 } 147 }, 148 { 149 "type": "required_status_checks", 150 "parameters": { 151 "required_status_checks": [ 152 { 153 "context": "test", 154 "integration_id": 1 155 } 156 ], 157 "strict_required_status_checks_policy": true 158 } 159 }, 160 { 161 "type": "non_fast_forward" 162 }, 163 { 164 "type": "commit_message_pattern", 165 "parameters": { 166 "name": "avoid test commits", 167 "negate": true, 168 "operator": "starts_with", 169 "pattern": "[test]" 170 } 171 }, 172 { 173 "type": "commit_author_email_pattern", 174 "parameters": { 175 "operator": "contains", 176 "pattern": "github" 177 } 178 }, 179 { 180 "type": "committer_email_pattern", 181 "parameters": { 182 "name": "avoid commit emails", 183 "negate": true, 184 "operator": "ends_with", 185 "pattern": "abc" 186 } 187 }, 188 { 189 "type": "branch_name_pattern", 190 "parameters": { 191 "name": "avoid branch names", 192 "negate": true, 193 "operator": "regex", 194 "pattern": "github$" 195 } 196 }, 197 { 198 "type": "tag_name_pattern", 199 "parameters": { 200 "name": "avoid tag names", 201 "negate": true, 202 "operator": "contains", 203 "pattern": "github" 204 } 205 } 206 ] 207 }`) 208 }) 209 210 ctx := context.Background() 211 ruleset, _, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", &Ruleset{ 212 ID: Int64(21), 213 Name: "ruleset", 214 Target: String("branch"), 215 SourceType: String("Organization"), 216 Source: "o", 217 Enforcement: "active", 218 BypassActors: []*BypassActor{ 219 { 220 ActorID: Int64(234), 221 ActorType: String("Team"), 222 }, 223 }, 224 Conditions: &RulesetConditions{ 225 RefName: &RulesetRefConditionParameters{ 226 Include: []string{"refs/heads/main", "refs/heads/master"}, 227 Exclude: []string{"refs/heads/dev*"}, 228 }, 229 RepositoryName: &RulesetRepositoryNamesConditionParameters{ 230 Include: []string{"important_repository", "another_important_repository"}, 231 Exclude: []string{"unimportant_repository"}, 232 Protected: Bool(true), 233 }, 234 }, 235 Rules: []*RepositoryRule{ 236 NewCreationRule(), 237 NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ 238 UpdateAllowsFetchAndMerge: true, 239 }), 240 NewDeletionRule(), 241 NewRequiredLinearHistoryRule(), 242 NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ 243 RequiredDeploymentEnvironments: []string{"test"}, 244 }), 245 NewRequiredSignaturesRule(), 246 NewPullRequestRule(&PullRequestRuleParameters{ 247 RequireCodeOwnerReview: true, 248 RequireLastPushApproval: true, 249 RequiredApprovingReviewCount: 1, 250 RequiredReviewThreadResolution: true, 251 DismissStaleReviewsOnPush: true, 252 }), 253 NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ 254 RequiredStatusChecks: []RuleRequiredStatusChecks{ 255 { 256 Context: "test", 257 IntegrationID: Int64(1), 258 }, 259 }, 260 StrictRequiredStatusChecksPolicy: true, 261 }), 262 NewNonFastForwardRule(), 263 NewCommitMessagePatternRule(&RulePatternParameters{ 264 Name: String("avoid test commits"), 265 Negate: Bool(true), 266 Operator: "starts_with", 267 Pattern: "[test]", 268 }), 269 NewCommitAuthorEmailPatternRule(&RulePatternParameters{ 270 Operator: "contains", 271 Pattern: "github", 272 }), 273 NewCommitterEmailPatternRule(&RulePatternParameters{ 274 Name: String("avoid commit emails"), 275 Negate: Bool(true), 276 Operator: "ends_with", 277 Pattern: "abc", 278 }), 279 NewBranchNamePatternRule(&RulePatternParameters{ 280 Name: String("avoid branch names"), 281 Negate: Bool(true), 282 Operator: "regex", 283 Pattern: "github$", 284 }), 285 NewTagNamePatternRule(&RulePatternParameters{ 286 Name: String("avoid tag names"), 287 Negate: Bool(true), 288 Operator: "contains", 289 Pattern: "github", 290 }), 291 }, 292 }) 293 if err != nil { 294 t.Errorf("Organizations.CreateOrganizationRuleset returned error: %v", err) 295 } 296 297 want := &Ruleset{ 298 ID: Int64(21), 299 Name: "ruleset", 300 Target: String("branch"), 301 SourceType: String("Organization"), 302 Source: "o", 303 Enforcement: "active", 304 BypassActors: []*BypassActor{ 305 { 306 ActorID: Int64(234), 307 ActorType: String("Team"), 308 }, 309 }, 310 Conditions: &RulesetConditions{ 311 RefName: &RulesetRefConditionParameters{ 312 Include: []string{"refs/heads/main", "refs/heads/master"}, 313 Exclude: []string{"refs/heads/dev*"}, 314 }, 315 RepositoryName: &RulesetRepositoryNamesConditionParameters{ 316 Include: []string{"important_repository", "another_important_repository"}, 317 Exclude: []string{"unimportant_repository"}, 318 Protected: Bool(true), 319 }, 320 }, 321 Rules: []*RepositoryRule{ 322 NewCreationRule(), 323 NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ 324 UpdateAllowsFetchAndMerge: true, 325 }), 326 NewDeletionRule(), 327 NewRequiredLinearHistoryRule(), 328 NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ 329 RequiredDeploymentEnvironments: []string{"test"}, 330 }), 331 NewRequiredSignaturesRule(), 332 NewPullRequestRule(&PullRequestRuleParameters{ 333 RequireCodeOwnerReview: true, 334 RequireLastPushApproval: true, 335 RequiredApprovingReviewCount: 1, 336 RequiredReviewThreadResolution: true, 337 DismissStaleReviewsOnPush: true, 338 }), 339 NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ 340 RequiredStatusChecks: []RuleRequiredStatusChecks{ 341 { 342 Context: "test", 343 IntegrationID: Int64(1), 344 }, 345 }, 346 StrictRequiredStatusChecksPolicy: true, 347 }), 348 NewNonFastForwardRule(), 349 NewCommitMessagePatternRule(&RulePatternParameters{ 350 Name: String("avoid test commits"), 351 Negate: Bool(true), 352 Operator: "starts_with", 353 Pattern: "[test]", 354 }), 355 NewCommitAuthorEmailPatternRule(&RulePatternParameters{ 356 Operator: "contains", 357 Pattern: "github", 358 }), 359 NewCommitterEmailPatternRule(&RulePatternParameters{ 360 Name: String("avoid commit emails"), 361 Negate: Bool(true), 362 Operator: "ends_with", 363 Pattern: "abc", 364 }), 365 NewBranchNamePatternRule(&RulePatternParameters{ 366 Name: String("avoid branch names"), 367 Negate: Bool(true), 368 Operator: "regex", 369 Pattern: "github$", 370 }), 371 NewTagNamePatternRule(&RulePatternParameters{ 372 Name: String("avoid tag names"), 373 Negate: Bool(true), 374 Operator: "contains", 375 Pattern: "github", 376 }), 377 }, 378 } 379 if !cmp.Equal(ruleset, want) { 380 t.Errorf("Organizations.CreateOrganizationRuleset returned %+v, want %+v", ruleset, want) 381 } 382 383 const methodName = "CreateOrganizationRuleset" 384 385 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 386 got, resp, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", nil) 387 if got != nil { 388 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 389 } 390 return resp, err 391 }) 392 } 393 394 func TestOrganizationsService_CreateOrganizationRuleset_RepoIDs(t *testing.T) { 395 client, mux, _, teardown := setup() 396 defer teardown() 397 398 mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { 399 testMethod(t, r, "POST") 400 fmt.Fprint(w, `{ 401 "id": 21, 402 "name": "ruleset", 403 "target": "branch", 404 "source_type": "Organization", 405 "source": "o", 406 "enforcement": "active", 407 "bypass_actors": [ 408 { 409 "actor_id": 234, 410 "actor_type": "Team" 411 } 412 ], 413 "conditions": { 414 "ref_name": { 415 "include": [ 416 "refs/heads/main", 417 "refs/heads/master" 418 ], 419 "exclude": [ 420 "refs/heads/dev*" 421 ] 422 }, 423 "repository_id": { 424 "repository_ids": [ 123, 456 ] 425 } 426 }, 427 "rules": [ 428 { 429 "type": "creation" 430 }, 431 { 432 "type": "update", 433 "parameters": { 434 "update_allows_fetch_and_merge": true 435 } 436 }, 437 { 438 "type": "deletion" 439 }, 440 { 441 "type": "required_linear_history" 442 }, 443 { 444 "type": "required_deployments", 445 "parameters": { 446 "required_deployment_environments": ["test"] 447 } 448 }, 449 { 450 "type": "required_signatures" 451 }, 452 { 453 "type": "pull_request", 454 "parameters": { 455 "dismiss_stale_reviews_on_push": true, 456 "require_code_owner_review": true, 457 "require_last_push_approval": true, 458 "required_approving_review_count": 1, 459 "required_review_thread_resolution": true 460 } 461 }, 462 { 463 "type": "required_status_checks", 464 "parameters": { 465 "required_status_checks": [ 466 { 467 "context": "test", 468 "integration_id": 1 469 } 470 ], 471 "strict_required_status_checks_policy": true 472 } 473 }, 474 { 475 "type": "non_fast_forward" 476 }, 477 { 478 "type": "commit_message_pattern", 479 "parameters": { 480 "name": "avoid test commits", 481 "negate": true, 482 "operator": "starts_with", 483 "pattern": "[test]" 484 } 485 }, 486 { 487 "type": "commit_author_email_pattern", 488 "parameters": { 489 "operator": "contains", 490 "pattern": "github" 491 } 492 }, 493 { 494 "type": "committer_email_pattern", 495 "parameters": { 496 "name": "avoid commit emails", 497 "negate": true, 498 "operator": "ends_with", 499 "pattern": "abc" 500 } 501 }, 502 { 503 "type": "branch_name_pattern", 504 "parameters": { 505 "name": "avoid branch names", 506 "negate": true, 507 "operator": "regex", 508 "pattern": "github$" 509 } 510 }, 511 { 512 "type": "tag_name_pattern", 513 "parameters": { 514 "name": "avoid tag names", 515 "negate": true, 516 "operator": "contains", 517 "pattern": "github" 518 } 519 } 520 ] 521 }`) 522 }) 523 524 ctx := context.Background() 525 ruleset, _, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", &Ruleset{ 526 ID: Int64(21), 527 Name: "ruleset", 528 Target: String("branch"), 529 SourceType: String("Organization"), 530 Source: "o", 531 Enforcement: "active", 532 BypassActors: []*BypassActor{ 533 { 534 ActorID: Int64(234), 535 ActorType: String("Team"), 536 }, 537 }, 538 Conditions: &RulesetConditions{ 539 RefName: &RulesetRefConditionParameters{ 540 Include: []string{"refs/heads/main", "refs/heads/master"}, 541 Exclude: []string{"refs/heads/dev*"}, 542 }, 543 RepositoryID: &RulesetRepositoryIDsConditionParameters{ 544 RepositoryIDs: []int64{123, 456}, 545 }, 546 }, 547 Rules: []*RepositoryRule{ 548 NewCreationRule(), 549 NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ 550 UpdateAllowsFetchAndMerge: true, 551 }), 552 NewDeletionRule(), 553 NewRequiredLinearHistoryRule(), 554 NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ 555 RequiredDeploymentEnvironments: []string{"test"}, 556 }), 557 NewRequiredSignaturesRule(), 558 NewPullRequestRule(&PullRequestRuleParameters{ 559 RequireCodeOwnerReview: true, 560 RequireLastPushApproval: true, 561 RequiredApprovingReviewCount: 1, 562 RequiredReviewThreadResolution: true, 563 DismissStaleReviewsOnPush: true, 564 }), 565 NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ 566 RequiredStatusChecks: []RuleRequiredStatusChecks{ 567 { 568 Context: "test", 569 IntegrationID: Int64(1), 570 }, 571 }, 572 StrictRequiredStatusChecksPolicy: true, 573 }), 574 NewNonFastForwardRule(), 575 NewCommitMessagePatternRule(&RulePatternParameters{ 576 Name: String("avoid test commits"), 577 Negate: Bool(true), 578 Operator: "starts_with", 579 Pattern: "[test]", 580 }), 581 NewCommitAuthorEmailPatternRule(&RulePatternParameters{ 582 Operator: "contains", 583 Pattern: "github", 584 }), 585 NewCommitterEmailPatternRule(&RulePatternParameters{ 586 Name: String("avoid commit emails"), 587 Negate: Bool(true), 588 Operator: "ends_with", 589 Pattern: "abc", 590 }), 591 NewBranchNamePatternRule(&RulePatternParameters{ 592 Name: String("avoid branch names"), 593 Negate: Bool(true), 594 Operator: "regex", 595 Pattern: "github$", 596 }), 597 NewTagNamePatternRule(&RulePatternParameters{ 598 Name: String("avoid tag names"), 599 Negate: Bool(true), 600 Operator: "contains", 601 Pattern: "github", 602 }), 603 }, 604 }) 605 if err != nil { 606 t.Errorf("Organizations.CreateOrganizationRuleset returned error: %v", err) 607 } 608 609 want := &Ruleset{ 610 ID: Int64(21), 611 Name: "ruleset", 612 Target: String("branch"), 613 SourceType: String("Organization"), 614 Source: "o", 615 Enforcement: "active", 616 BypassActors: []*BypassActor{ 617 { 618 ActorID: Int64(234), 619 ActorType: String("Team"), 620 }, 621 }, 622 Conditions: &RulesetConditions{ 623 RefName: &RulesetRefConditionParameters{ 624 Include: []string{"refs/heads/main", "refs/heads/master"}, 625 Exclude: []string{"refs/heads/dev*"}, 626 }, 627 RepositoryID: &RulesetRepositoryIDsConditionParameters{ 628 RepositoryIDs: []int64{123, 456}, 629 }, 630 }, 631 Rules: []*RepositoryRule{ 632 NewCreationRule(), 633 NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ 634 UpdateAllowsFetchAndMerge: true, 635 }), 636 NewDeletionRule(), 637 NewRequiredLinearHistoryRule(), 638 NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ 639 RequiredDeploymentEnvironments: []string{"test"}, 640 }), 641 NewRequiredSignaturesRule(), 642 NewPullRequestRule(&PullRequestRuleParameters{ 643 RequireCodeOwnerReview: true, 644 RequireLastPushApproval: true, 645 RequiredApprovingReviewCount: 1, 646 RequiredReviewThreadResolution: true, 647 DismissStaleReviewsOnPush: true, 648 }), 649 NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ 650 RequiredStatusChecks: []RuleRequiredStatusChecks{ 651 { 652 Context: "test", 653 IntegrationID: Int64(1), 654 }, 655 }, 656 StrictRequiredStatusChecksPolicy: true, 657 }), 658 NewNonFastForwardRule(), 659 NewCommitMessagePatternRule(&RulePatternParameters{ 660 Name: String("avoid test commits"), 661 Negate: Bool(true), 662 Operator: "starts_with", 663 Pattern: "[test]", 664 }), 665 NewCommitAuthorEmailPatternRule(&RulePatternParameters{ 666 Operator: "contains", 667 Pattern: "github", 668 }), 669 NewCommitterEmailPatternRule(&RulePatternParameters{ 670 Name: String("avoid commit emails"), 671 Negate: Bool(true), 672 Operator: "ends_with", 673 Pattern: "abc", 674 }), 675 NewBranchNamePatternRule(&RulePatternParameters{ 676 Name: String("avoid branch names"), 677 Negate: Bool(true), 678 Operator: "regex", 679 Pattern: "github$", 680 }), 681 NewTagNamePatternRule(&RulePatternParameters{ 682 Name: String("avoid tag names"), 683 Negate: Bool(true), 684 Operator: "contains", 685 Pattern: "github", 686 }), 687 }, 688 } 689 if !cmp.Equal(ruleset, want) { 690 t.Errorf("Organizations.CreateOrganizationRuleset returned %+v, want %+v", ruleset, want) 691 } 692 693 const methodName = "CreateOrganizationRuleset" 694 695 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 696 got, resp, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", nil) 697 if got != nil { 698 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 699 } 700 return resp, err 701 }) 702 } 703 704 func TestOrganizationsService_GetOrganizationRuleset(t *testing.T) { 705 client, mux, _, teardown := setup() 706 defer teardown() 707 708 mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { 709 testMethod(t, r, "GET") 710 fmt.Fprint(w, `{ 711 "id": 26110, 712 "name": "test ruleset", 713 "target": "branch", 714 "source_type": "Organization", 715 "source": "o", 716 "enforcement": "active", 717 "bypass_mode": "none", 718 "node_id": "nid", 719 "_links": { 720 "self": { 721 "href": "https://api.github.com/orgs/o/rulesets/26110" 722 } 723 }, 724 "conditions": { 725 "ref_name": { 726 "include": [ 727 "refs/heads/main", 728 "refs/heads/master" 729 ], 730 "exclude": [ 731 "refs/heads/dev*" 732 ] 733 }, 734 "repository_name": { 735 "include": [ 736 "important_repository", 737 "another_important_repository" 738 ], 739 "exclude": [ 740 "unimportant_repository" 741 ], 742 "protected": true 743 } 744 }, 745 "rules": [ 746 { 747 "type": "creation" 748 } 749 ] 750 }`) 751 }) 752 753 ctx := context.Background() 754 rulesets, _, err := client.Organizations.GetOrganizationRuleset(ctx, "o", 26110) 755 if err != nil { 756 t.Errorf("Organizations.GetOrganizationRepositoryRuleset returned error: %v", err) 757 } 758 759 want := &Ruleset{ 760 ID: Int64(26110), 761 Name: "test ruleset", 762 Target: String("branch"), 763 SourceType: String("Organization"), 764 Source: "o", 765 Enforcement: "active", 766 NodeID: String("nid"), 767 Links: &RulesetLinks{ 768 Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, 769 }, 770 Conditions: &RulesetConditions{ 771 RefName: &RulesetRefConditionParameters{ 772 Include: []string{"refs/heads/main", "refs/heads/master"}, 773 Exclude: []string{"refs/heads/dev*"}, 774 }, 775 RepositoryName: &RulesetRepositoryNamesConditionParameters{ 776 Include: []string{"important_repository", "another_important_repository"}, 777 Exclude: []string{"unimportant_repository"}, 778 Protected: Bool(true), 779 }, 780 }, 781 Rules: []*RepositoryRule{ 782 NewCreationRule(), 783 }, 784 } 785 if !cmp.Equal(rulesets, want) { 786 t.Errorf("Organizations.GetOrganizationRuleset returned %+v, want %+v", rulesets, want) 787 } 788 789 const methodName = "GetOrganizationRuleset" 790 791 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 792 got, resp, err := client.Organizations.GetOrganizationRuleset(ctx, "o", 26110) 793 if got != nil { 794 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 795 } 796 return resp, err 797 }) 798 } 799 800 func TestOrganizationsService_UpdateOrganizationRuleset(t *testing.T) { 801 client, mux, _, teardown := setup() 802 defer teardown() 803 804 mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { 805 testMethod(t, r, "PUT") 806 fmt.Fprint(w, `{ 807 "id": 26110, 808 "name": "test ruleset", 809 "target": "branch", 810 "source_type": "Organization", 811 "source": "o", 812 "enforcement": "active", 813 "bypass_mode": "none", 814 "node_id": "nid", 815 "_links": { 816 "self": { 817 "href": "https://api.github.com/orgs/o/rulesets/26110" 818 } 819 }, 820 "conditions": { 821 "ref_name": { 822 "include": [ 823 "refs/heads/main", 824 "refs/heads/master" 825 ], 826 "exclude": [ 827 "refs/heads/dev*" 828 ] 829 }, 830 "repository_name": { 831 "include": [ 832 "important_repository", 833 "another_important_repository" 834 ], 835 "exclude": [ 836 "unimportant_repository" 837 ], 838 "protected": true 839 } 840 }, 841 "rules": [ 842 { 843 "type": "creation" 844 } 845 ] 846 }`) 847 }) 848 849 ctx := context.Background() 850 rulesets, _, err := client.Organizations.UpdateOrganizationRuleset(ctx, "o", 26110, &Ruleset{ 851 Name: "test ruleset", 852 Target: String("branch"), 853 Enforcement: "active", 854 Conditions: &RulesetConditions{ 855 RefName: &RulesetRefConditionParameters{ 856 Include: []string{"refs/heads/main", "refs/heads/master"}, 857 Exclude: []string{"refs/heads/dev*"}, 858 }, 859 RepositoryName: &RulesetRepositoryNamesConditionParameters{ 860 Include: []string{"important_repository", "another_important_repository"}, 861 Exclude: []string{"unimportant_repository"}, 862 Protected: Bool(true), 863 }, 864 }, 865 Rules: []*RepositoryRule{ 866 NewCreationRule(), 867 }, 868 }) 869 870 if err != nil { 871 t.Errorf("Organizations.UpdateOrganizationRuleset returned error: %v", err) 872 } 873 874 want := &Ruleset{ 875 ID: Int64(26110), 876 Name: "test ruleset", 877 Target: String("branch"), 878 SourceType: String("Organization"), 879 Source: "o", 880 Enforcement: "active", 881 NodeID: String("nid"), 882 Links: &RulesetLinks{ 883 Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, 884 }, 885 Conditions: &RulesetConditions{ 886 RefName: &RulesetRefConditionParameters{ 887 Include: []string{"refs/heads/main", "refs/heads/master"}, 888 Exclude: []string{"refs/heads/dev*"}, 889 }, 890 RepositoryName: &RulesetRepositoryNamesConditionParameters{ 891 Include: []string{"important_repository", "another_important_repository"}, 892 Exclude: []string{"unimportant_repository"}, 893 Protected: Bool(true), 894 }, 895 }, 896 Rules: []*RepositoryRule{ 897 NewCreationRule(), 898 }, 899 } 900 if !cmp.Equal(rulesets, want) { 901 t.Errorf("Organizations.UpdateOrganizationRuleset returned %+v, want %+v", rulesets, want) 902 } 903 904 const methodName = "UpdateOrganizationRuleset" 905 906 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 907 got, resp, err := client.Organizations.UpdateOrganizationRuleset(ctx, "o", 26110, nil) 908 if got != nil { 909 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 910 } 911 return resp, err 912 }) 913 } 914 915 func TestOrganizationsService_DeleteOrganizationRuleset(t *testing.T) { 916 client, mux, _, teardown := setup() 917 defer teardown() 918 919 mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { 920 testMethod(t, r, "DELETE") 921 }) 922 923 ctx := context.Background() 924 _, err := client.Organizations.DeleteOrganizationRuleset(ctx, "o", 26110) 925 if err != nil { 926 t.Errorf("Organizations.DeleteOrganizationRuleset returned error: %v", err) 927 } 928 929 const methodName = "DeleteOrganizationRuleset" 930 931 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 932 return client.Organizations.DeleteOrganizationRuleset(ctx, "0", 26110) 933 }) 934 }