summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxuzhang3 <57888764+xuzhang3@users.noreply.github.com>2023-01-03 15:28:25 +0800
committerGitHub <noreply@github.com>2023-01-03 15:28:25 +0800
commitf4902898f8f5ac3f2f1159e93c27742a2a5c190c (patch)
treef7c242cb9505fc0aa0a3438ee8e21e6b1b578fc2
parentd26bcd7d94bd9fe175014ff4742e507bc3933c1d (diff)
parenta6aec22632b0d33606b7381f162f38889fee49b5 (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
-rw-r--r--azuredevops/internal/acceptancetests/resource_branchpolicy_test.go52
-rw-r--r--azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers.go18
-rw-r--r--azuredevops/internal/service/policy/branch/resource_branchpolicy_auto_reviewers_test.go53
-rw-r--r--website/docs/r/branch_policy_auto_reviewers.html.markdown6
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`.