terraform-provider-woodpecker/internal/resource_repository_cron_test.go

157 lines
5.6 KiB
Go

package internal_test
import (
"errors"
"fmt"
"slices"
"strconv"
"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 TestRepositoryCronResource(t *testing.T) {
t.Parallel()
giteaRepo := createRepo(t)
repo := activateRepo(t, giteaRepo)
branch := createBranch(t, giteaRepo)
newRepo := activateRepo(t, createRepo(t))
name := uuid.NewString()
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
CheckDestroy: checkRepositoryCronResourceDestroy(map[int64][]string{
repo.ID: {name},
newRepo.ID: {name},
}),
Steps: []resource.TestStep{
{ // create cron
Config: fmt.Sprintf(`
resource "woodpecker_repository_cron" "test_cron" {
repository_id = %d
name = "%s"
schedule = "@daily"
}
`, repo.ID, name),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "id"),
resource.TestCheckResourceAttr(
"woodpecker_repository_cron.test_cron",
"repository_id",
strconv.FormatInt(repo.ID, 10),
),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "name", name),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "schedule", "@daily"),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "branch", ""),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "created_at"),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "creator_id"),
),
},
{ // update cron
Config: fmt.Sprintf(`
resource "woodpecker_repository_cron" "test_cron" {
repository_id = %d
name = "%s"
schedule = "@every 5m"
branch = "%s"
}
`, repo.ID, name, branch.Name),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "id"),
resource.TestCheckResourceAttr(
"woodpecker_repository_cron.test_cron",
"repository_id",
strconv.FormatInt(repo.ID, 10),
),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "name", name),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "schedule", "@every 5m"),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "branch", branch.Name),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "created_at"),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "creator_id"),
),
},
{ // update cron
Config: fmt.Sprintf(`
resource "woodpecker_repository_cron" "test_cron" {
repository_id = %d
name = "%s"
schedule = "@daily"
}
//`, repo.ID, name),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "id"),
resource.TestCheckResourceAttr(
"woodpecker_repository_cron.test_cron",
"repository_id",
strconv.FormatInt(repo.ID, 10),
),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "name", name),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "schedule", "@daily"),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "branch", branch.Name),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "created_at"),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "creator_id"),
),
},
{ // import
ResourceName: "woodpecker_repository_cron.test_cron",
ImportState: true,
ImportStateIdPrefix: strconv.FormatInt(repo.ID, 10) + "/",
ImportStateVerify: true,
},
{ // replace cron
Config: fmt.Sprintf(`
resource "woodpecker_repository_cron" "test_cron" {
repository_id = %d
name = "%s"
schedule = "@daily"
}
`, newRepo.ID, name),
ConfigPlanChecks: resource.ConfigPlanChecks{
PreApply: []plancheck.PlanCheck{
plancheck.ExpectResourceAction("woodpecker_repository_cron.test_cron", plancheck.ResourceActionReplace),
},
},
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "id"),
resource.TestCheckResourceAttr(
"woodpecker_repository_cron.test_cron",
"repository_id",
strconv.FormatInt(newRepo.ID, 10),
),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "name", name),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "schedule", "@daily"),
resource.TestCheckResourceAttr("woodpecker_repository_cron.test_cron", "branch", ""),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "created_at"),
resource.TestCheckResourceAttrSet("woodpecker_repository_cron.test_cron", "creator_id"),
),
},
},
})
}
func checkRepositoryCronResourceDestroy(m map[int64][]string) func(state *terraform.State) error {
return func(state *terraform.State) error {
for repoID, names := range m {
crons, err := woodpeckerClient.CronList(repoID)
if err != nil {
return fmt.Errorf("couldn't list cron jobs: %w", err)
}
if slices.ContainsFunc(crons, func(cron *woodpecker.Cron) bool {
return slices.Contains(names, cron.Name)
}) {
return errors.New("at least one of the created cron jobs isn't deleted")
}
}
return nil
}
}