diff options
| author | xuzhang3 <57888764+xuzhang3@users.noreply.github.com> | 2023-01-03 15:28:25 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-03 15:28:25 +0800 |
| commit | f4902898f8f5ac3f2f1159e93c27742a2a5c190c (patch) | |
| tree | f7c242cb9505fc0aa0a3438ee8e21e6b1b578fc2 | |
| parent | d26bcd7d94bd9fe175014ff4742e507bc3933c1d (diff) | |
| parent | a6aec22632b0d33606b7381f162f38889fee49b5 (diff) | |
Merge pull request #672 from jan-mrm/feat/minimum_number_of_reviewers
feat: add attribute minimum_number_of_reviewers to resource azuredevops_branch_policy_auto_reviewers
4 files changed, 124 insertions, 5 deletions
diff --git a/azuredevops/internal/acceptancetests/resource_branchpolicy_test.go b/azuredevops/internal/acceptancetests/resource_branchpolicy_test.go index 3d18b8b3..c7a7cd06 100644 --- a/azuredevops/internal/acceptancetests/resource_branchpolicy_test.go +++ b/azuredevops/internal/acceptancetests/resource_branchpolicy_test.go @@ -126,6 +126,58 @@ func getAutoReviewersHcl(enabled bool, blocking bool, submitterCanVote bool, mes ) } +func TestAccBranchPolicyAutoReviewers_CreateAndUpdate_MinimumApproverCount(t *testing.T) { + autoReviewerTfNode := "azuredevops_branch_policy_auto_reviewers.p" + resource.ParallelTest(t, resource.TestCase{ + Providers: testutils.GetProviders(), + Steps: []resource.TestStep{ + { + Config: getAutoReviewersGroupHcl(true, true, true, "auto reviewer", fmt.Sprintf("\"%s\",\"%s\"", "*/API*.cs", "README.md"), "\"refs/heads/master\"", "Exact", 1), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(autoReviewerTfNode, "enabled", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "blocking", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "settings.0.submitter_can_vote", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "settings.0.minimum_number_of_reviewers", "1"), + ), + }, { + Config: getAutoReviewersGroupHcl(true, true, true, "new auto reviewer", fmt.Sprintf("\"%s\",\"%s\"", "*/API*.cs", "README.md"), "\"refs/heads/master\"", "Exact", 2), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(autoReviewerTfNode, "enabled", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "blocking", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "settings.0.submitter_can_vote", "true"), + resource.TestCheckResourceAttr(autoReviewerTfNode, "settings.0.minimum_number_of_reviewers", "2"), + ), + }, { + ResourceName: autoReviewerTfNode, + ImportStateIdFunc: testutils.ComputeProjectQualifiedResourceImportID(autoReviewerTfNode), + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func getAutoReviewersGroupHcl(enabled bool, blocking bool, submitterCanVote bool, message string, pathFilters string, repositoryRef string, matchType string, numberOfApprovers int) string { + settings := fmt.Sprintf( + ` + auto_reviewer_ids = [azuredevops_group.group.origin_id] + submitter_can_vote = %t + message = "%s" + path_filters = [%s] + minimum_number_of_reviewers = %d + `, submitterCanVote, message, pathFilters, numberOfApprovers, + ) + group := testutils.HclGroupResource("group", "", "test-group") + + return strings.Join( + []string{ + group, + getBranchPolicyHcl("azuredevops_branch_policy_auto_reviewers", enabled, blocking, settings, "azuredevops_git_repository.repository.id", repositoryRef, matchType), + }, + "\n", + ) +} + func TestAccBranchPolicyBuildValidation_CreateAndUpdate(t *testing.T) { buildValidationTfNode := "azuredevops_branch_policy_build_validation.p" resource.ParallelTest(t, resource.TestCase{ diff --git a/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers.go b/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers.go index da13e74f..f29b77ce 100644 --- a/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers.go +++ b/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers.go @@ -11,10 +11,11 @@ import ( ) type autoReviewerPolicySettings struct { - SubmitterCanVote bool `json:"creatorVoteCounts"` - AutoReviewerIds []string `json:"requiredReviewerIds"` - PathFilters []string `json:"filenamePatterns"` - DisplayMessage string `json:"message"` + SubmitterCanVote bool `json:"creatorVoteCounts"` + AutoReviewerIds []string `json:"requiredReviewerIds"` + PathFilters []string `json:"filenamePatterns"` + DisplayMessage string `json:"message"` + MinimumApproverCount int `json:"minimumApproverCount"` } const ( @@ -22,6 +23,7 @@ const ( pathFilters = "path_filters" displayMessage = "message" schemaSubmitterCanVote = "submitter_can_vote" + minimumApproverCount = "minimum_number_of_reviewers" ) // ResourceBranchPolicyAutoReviewers schema and implementation for automatic code reviewer policy resource @@ -59,6 +61,12 @@ func ResourceBranchPolicyAutoReviewers() *schema.Resource { Default: false, Optional: true, } + settingsSchema[minimumApproverCount] = &schema.Schema{ + Type: schema.TypeInt, + Optional: true, + Default: 1, + ValidateFunc: validation.IntAtLeast(1), + } return resource } @@ -86,6 +94,7 @@ func autoReviewersFlattenFunc(d *schema.ResourceData, policyConfig *policy.Polic settings[autoReviewerIds] = policySettings.AutoReviewerIds settings[pathFilters] = policySettings.PathFilters settings[displayMessage] = policySettings.DisplayMessage + settings[minimumApproverCount] = policySettings.MinimumApproverCount _ = d.Set(SchemaSettings, settingsList) return nil } @@ -102,6 +111,7 @@ func autoReviewersExpandFunc(d *schema.ResourceData, typeID uuid.UUID) (*policy. policySettings := policyConfig.Settings.(map[string]interface{}) policySettings["creatorVoteCounts"] = settings[schemaSubmitterCanVote].(bool) policySettings["message"] = settings[displayMessage].(string) + policySettings["minimumApproverCount"] = settings[minimumApproverCount].(int) if value, ok := settings[autoReviewerIds]; ok { var reviewersID []string diff --git a/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers_test.go b/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers_test.go new file mode 100644 index 00000000..07bcfe12 --- /dev/null +++ b/azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers_test.go @@ -0,0 +1,53 @@ +//go:build (all || resource_branchpolicy_auto_reviewers) && !exclude_resource_branchpolicy_auto_reviewers +// +build all resource_branchpolicy_auto_reviewers +// +build !exclude_resource_branchpolicy_auto_reviewers + +package branch + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/stretchr/testify/require" + + "github.com/google/uuid" + "github.com/microsoft/azure-devops-go-api/azuredevops/v6/policy" + "github.com/microsoft/terraform-provider-azuredevops/azuredevops/internal/utils/converter" +) + +// verifies that the flatten/expand round trip path produces repeatable results +func TestBranchPolicyAutoReviewers_ExpandFlatten_Roundtrip(t *testing.T) { + var projectID = uuid.New().String() + var randomUUID = uuid.New() + var testPolicy = &policy.PolicyConfiguration{ + Id: converter.Int(1), + IsEnabled: converter.Bool(true), + IsBlocking: converter.Bool(true), + Type: &policy.PolicyTypeRef{ + Id: &randomUUID, + }, + Settings: map[string]interface{}{ + "scope": []map[string]interface{}{ + { + "repositoryId": "test-repo-id", + "refName": "test-ref-name", + "matchKind": "test-match-kind", + }, + }, + "creatorVoteCounts": false, + "filenamePatterns": []string{"*"}, + "requiredReviewerIds": []string{"some-group"}, + "minimumApproverCount": 1, + "message": "", + }, + } + + resourceData := schema.TestResourceDataRaw(t, ResourceBranchPolicyAutoReviewers().Schema, nil) + err := autoReviewersFlattenFunc(resourceData, testPolicy, &projectID) + require.Nil(t, err) + expandedPolicy, expandedProjectID, err := autoReviewersExpandFunc(resourceData, randomUUID) + require.Nil(t, err) + + require.Equal(t, testPolicy, expandedPolicy) + require.Equal(t, projectID, *expandedProjectID) +} diff --git a/website/docs/r/branch_policy_auto_reviewers.html.markdown b/website/docs/r/branch_policy_auto_reviewers.html.markdown index eb86f263..e275f234 100644 --- a/website/docs/r/branch_policy_auto_reviewers.html.markdown +++ b/website/docs/r/branch_policy_auto_reviewers.html.markdown @@ -65,9 +65,13 @@ The following arguments are supported: - `path_filters` - (Optional) Filter path(s) on which the policy is applied. Supports absolute paths, wildcards and multiple paths. Example: /WebApp/Models/Data.cs, /WebApp/* or *.cs,/WebApp/Models/Data.cs;ClientApp/Models/Data.cs. - `submitter_can_vote` - (Optional) Controls whether or not the submitter's vote counts. Defaults to `false`. - `message` - (Optional) Activity feed message, Message will appear in the activity feed of pull requests with automatically added reviewers. +- `minimum_number_of_reviewers` - (Optional) Minimum number of required reviewers. Defaults to `1`. + +-> **Note** Has to be greater than `0`. Can only be greater than `1` when attribute `auto_reviewer_ids` contains exactly one group! Only has an effect when attribute `blocking` is set to `true`. + - `scope` (Required) Controls which repositories and branches the policy will be enabled for. This block must be defined at least once. - `scope` block supports the following: +A `settings` `scope` block supports the following: - `repository_id` - (Optional) The repository ID. Needed only if the scope of the policy will be limited to a single repository. If `match_type` is `DefaultBranch`, this should not be defined. - `repository_ref` - (Optional) The ref pattern to use for the match when `match_type` other than `DefaultBranch`. If `match_type` is `Exact`, this should be a qualified ref such as `refs/heads/master`. If `match_type` is `Prefix`, this should be a ref path such as `refs/heads/releases`. |
