terraform-provider-woodpecker/internal/resource_user_test.go

122 lines
4.4 KiB
Go

package internal_test
import (
"errors"
"fmt"
"slices"
"testing"
"github.com/Kichiyaki/terraform-provider-woodpecker/internal/woodpecker"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/plancheck"
"github.com/hashicorp/terraform-plugin-testing/terraform"
)
func TestUserResource(t *testing.T) {
t.Parallel()
login := uuid.NewString()
newLogin := uuid.NewString()
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
CheckDestroy: checkUserResourceDestroy(login, newLogin),
Steps: []resource.TestStep{
{ // create user
Config: fmt.Sprintf(`
resource "woodpecker_user" "test_user" {
login = "%s"
}
`, login),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_user.test_user", "id"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "login", login),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "email", ""),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "avatar_url", ""),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_active", "false"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_admin", "false"),
),
},
{ // update user
Config: fmt.Sprintf(`
resource "woodpecker_user" "test_user" {
login = "%s"
email = "%s@localhost"
avatar_url = "http://localhost/%s"
is_admin = true
}
`, login, login, login),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_user.test_user", "id"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "login", login),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "email", login+"@localhost"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "avatar_url", "http://localhost/"+login),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_active", "false"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_admin", "true"),
),
},
{ // update user
Config: fmt.Sprintf(`
resource "woodpecker_user" "test_user" {
login = "%s"
is_admin = false
}
`, login),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_user.test_user", "id"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "login", login),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "email", login+"@localhost"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "avatar_url", "http://localhost/"+login),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_active", "false"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_admin", "false"),
),
},
{ // import
ResourceName: "woodpecker_user.test_user",
ImportState: true,
ImportStateId: login,
ImportStateVerify: true,
},
{ // replace user
Config: fmt.Sprintf(`
resource "woodpecker_user" "test_user" {
login = "%s"
}
`, newLogin),
ConfigPlanChecks: resource.ConfigPlanChecks{
PreApply: []plancheck.PlanCheck{
plancheck.ExpectResourceAction("woodpecker_user.test_user", plancheck.ResourceActionReplace),
},
},
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_user.test_user", "id"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "login", newLogin),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "email", ""),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "avatar_url", ""),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_active", "false"),
resource.TestCheckResourceAttr("woodpecker_user.test_user", "is_admin", "false"),
),
},
},
})
}
func checkUserResourceDestroy(logins ...string) func(state *terraform.State) error {
return func(state *terraform.State) error {
users, err := woodpeckerClient.UserList()
if err != nil {
return fmt.Errorf("couldn't list users: %w", err)
}
if slices.ContainsFunc(users, func(user *woodpecker.User) bool {
return slices.Contains(logins, user.Login)
}) {
return errors.New("at least one of the created users isn't deleted")
}
return nil
}
}