diff --git a/github/resource_github_team_members.go b/github/resource_github_team_members.go index e56bf0ac38..c11aff9a89 100644 --- a/github/resource_github_team_members.go +++ b/github/resource_github_team_members.go @@ -63,13 +63,21 @@ func resourceGithubTeamMembers() *schema.Resource { Type: schema.TypeSet, Required: true, Description: "List of users that should be members of the team.", + Set: func(v any) int { + username, _ := v.(map[string]any)["username"].(string) + return schema.HashString(strings.ToLower(username)) + }, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "username": { Type: schema.TypeString, Required: true, DiffSuppressFunc: caseInsensitive(), - Description: "User to add to the team.", + StateFunc: func(v any) string { + val, _ := v.(string) + return strings.ToLower(val) + }, + Description: "User to add to the team.", }, "role": { Type: schema.TypeString, diff --git a/github/resource_github_team_members_test.go b/github/resource_github_team_members_test.go index fcb6e10253..6cc011f7c7 100644 --- a/github/resource_github_team_members_test.go +++ b/github/resource_github_team_members_test.go @@ -3,8 +3,10 @@ package github import ( "fmt" "strconv" + "strings" "testing" + "github.com/hashicorp/terraform-plugin-testing/compare" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/knownvalue" "github.com/hashicorp/terraform-plugin-testing/plancheck" @@ -18,6 +20,7 @@ func TestAccGithubTeamMembers(t *testing.T) { skipUnlessHasOrgs(t) skipUnlessHasOrgUser1(t) + flippedCaseUsername := flipUsernameCase(testAccConf.testOrgUser1) t.Run("team_by_slug", func(t *testing.T) { t.Parallel() @@ -33,7 +36,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -71,7 +74,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -110,7 +113,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetID(), testAccConf.testOrgUser1) +`, team.GetID(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -148,7 +151,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) configMigrate := fmt.Sprintf(` resource "github_team_members" "test" { @@ -159,7 +162,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -201,7 +204,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetID(), testAccConf.testOrgUser1) +`, team.GetID(), flippedCaseUsername) configMigrate := fmt.Sprintf(` resource "github_team_members" "test" { @@ -212,7 +215,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -257,7 +260,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -296,7 +299,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -326,7 +329,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, testAccConf.testOrgUser1) +`, flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -364,7 +367,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, team.GetSlug(), testAccConf.testOrgUser1) +`, team.GetSlug(), flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -403,7 +406,7 @@ resource "github_team_members" "test" { role = "maintainer" } } -`, testAccConf.testOrgUser1) +`, flippedCaseUsername) resource.Test(t, resource.TestCase{ ProviderFactories: providerFactories, @@ -430,4 +433,49 @@ resource "github_team_members" "test" { }, }) }) + + t.Run("is_case_insensitive", func(t *testing.T) { + t.Parallel() + + team := mustCreateTestTeam(t, nil) + + config := fmt.Sprintf(` +resource "github_team_members" "test" { + team_slug = "%s" + + members { + username = "%%s" + role = "maintainer" + } +} +`, team.GetSlug()) + + usernameIsSameComparer := statecheck.CompareValue(compare.ValuesSame()) + resource.Test(t, resource.TestCase{ + PreCheck: func() { skipUnlessHasOrgs(t) }, + ProviderFactories: providerFactories, + Steps: []resource.TestStep{ + { + Config: fmt.Sprintf(config, flippedCaseUsername), + ConfigStateChecks: []statecheck.StateCheck{ + usernameIsSameComparer.AddStateValue("github_team_members.test", tfjsonpath.New("members").AtSliceIndex(0).AtMapKey("username")), + statecheck.ExpectKnownValue("github_team_members.test", tfjsonpath.New("members"), knownvalue.SetSizeExact(1)), + statecheck.ExpectKnownValue("github_team_members.test", tfjsonpath.New("members").AtSliceIndex(0).AtMapKey("username"), knownvalue.StringExact(strings.ToLower(testAccConf.testOrgUser1))), + }, + }, + { + Config: fmt.Sprintf(config, testAccConf.testOrgUser1), + ConfigPlanChecks: resource.ConfigPlanChecks{ + PreApply: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction("github_team_members.test", plancheck.ResourceActionNoop), + }, + }, + ConfigStateChecks: []statecheck.StateCheck{ + usernameIsSameComparer.AddStateValue("github_team_members.test", tfjsonpath.New("members").AtSliceIndex(0).AtMapKey("username")), + statecheck.ExpectKnownValue("github_team_members.test", tfjsonpath.New("members"), knownvalue.SetSizeExact(1)), + }, + }, + }, + }) + }) }