diff --git a/github/resource_github_organization_ruleset_test.go b/github/resource_github_organization_ruleset_test.go index 9aae9f35b..14435c387 100644 --- a/github/resource_github_organization_ruleset_test.go +++ b/github/resource_github_organization_ruleset_test.go @@ -178,6 +178,74 @@ func TestGithubOrganizationRulesets(t *testing.T) { }) + t.Run("Updates a ruleset required workflow without error", func(t *testing.T) { + oldWorkflowName := fmt.Sprintf(`workflow-%[1]s`, randomID) + newWorkflowName := fmt.Sprintf(`%[1]s-renamed`, randomID) + + config := fmt.Sprintf(` + resource "github_repository" "test" { + name = "tf-acc-test" + auto_init = true + } + + resource "github_organization_ruleset" "test" { + name = "test" + enforcement = "active" + + rules { + required_workflows { + required_workflow { + path = ".github/workflows/%s.yml" + ref = "main" + repository_id = github_repository.test.node_id + } + } + } + } + `, oldWorkflowName) + + checks := map[string]resource.TestCheckFunc{ + "before": resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "github_organization_ruleset.test.rules[0].required_workflows[0].required_workflow", "path", + oldWorkflowName, + ), + ), + "after": resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "github_organization_ruleset.test.rules[0].required_workflows[0].required_workflow", "path", + newWorkflowName, + ), + ), + } + + testCase := func(t *testing.T, mode string) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { skipUnlessMode(t, mode) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: config, + Check: checks["before"], + }, + { + // Rename the ruleset to something else + Config: strings.Replace( + config, + oldWorkflowName, + newWorkflowName, 1), + Check: checks["after"], + }, + }, + }) + } + + t.Run("with an enterprise account", func(t *testing.T) { + testCase(t, enterprise) + }) + + }) + t.Run("Imports rulesets without error", func(t *testing.T) { config := fmt.Sprintf(` diff --git a/github/respository_rules_utils.go b/github/respository_rules_utils.go index 44ccb27de..efa330dbb 100644 --- a/github/respository_rules_utils.go +++ b/github/respository_rules_utils.go @@ -524,6 +524,29 @@ func flattenRules(rules []*github.RepositoryRule, org bool) []interface{} { rule["do_not_enforce_on_create"] = params.DoNotEnforceOnCreate rulesMap[v.Type] = []map[string]interface{}{rule} + case "workflows": + var params github.RequiredWorkflowsRuleParameters + + err := json.Unmarshal(*v.Parameters, ¶ms) + if err != nil { + log.Printf("[INFO] Unexpected error unmarshalling rule %s with parameters: %v", + v.Type, v.Parameters) + } + + requiredWorkflowsSlice := make([]map[string]interface{}, 0) + for _, workflow := range params.RequiredWorkflows { + requiredWorkflowsSlice = append(requiredWorkflowsSlice, map[string]interface{}{ + "repository_id": workflow.RepositoryID, + "path": workflow.Path, + "ref": workflow.Ref, + }) + } + + rule := make(map[string]interface{}) + rule["workflows"] = requiredWorkflowsSlice + rule["do_not_enforce_on_create"] = params.DoNotEnforceOnCreate + rulesMap[v.Type] = []map[string]interface{}{rule} + case "merge_queue": var params github.MergeQueueRuleParameters