diff --git a/fwprovider/test/datasource_version_test.go b/fwprovider/test/datasource_version_test.go index 6084e215..d68f9964 100644 --- a/fwprovider/test/datasource_version_test.go +++ b/fwprovider/test/datasource_version_test.go @@ -10,10 +10,13 @@ package test import ( "fmt" + "regexp" "strings" "testing" + "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/terraform" ) func TestAccDatasourceVersion(t *testing.T) { @@ -28,17 +31,74 @@ func TestAccDatasourceVersion(t *testing.T) { { Config: `data "proxmox_virtual_environment_version" "test" {}`, Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr(datasourceName, "release", "8.4"), - resource.TestCheckResourceAttrSet(datasourceName, "repository_id"), - resource.TestCheckResourceAttrWith(datasourceName, "version", func(value string) error { - if strings.HasPrefix(value, "8.4") { - return nil - } - return fmt.Errorf("version %s does not start with 8.4", value) - }), resource.TestCheckResourceAttrSet(datasourceName, "id"), + resource.TestCheckResourceAttrSet(datasourceName, "repository_id"), + resource.TestCheckResourceAttrWith(datasourceName, "release", validateReleaseVersion), + resource.TestCheckResourceAttrWith(datasourceName, "version", validateFullVersion), + validateVersionReleaseConsistency(datasourceName), ), }, }, }) } + +// validateReleaseVersion validates that the release field matches the expected pattern (e.g., "8.4", "9.0"). +func validateReleaseVersion(value string) error { + releasePattern := regexp.MustCompile(`^[0-9]+\.[0-9]+$`) + if !releasePattern.MatchString(value) { + return fmt.Errorf("release %q does not match expected pattern (major.minor)", value) + } + + // Ensure it's at least the minimum supported version + releaseVer, err := version.NewVersion(value + ".0") // Add patch version for comparison + if err != nil { + return fmt.Errorf("failed to parse release version %q: %w", value, err) + } + + minVersion := version.Must(version.NewVersion("8.0.0")) + if releaseVer.LessThan(minVersion) { + return fmt.Errorf("release version %q is below minimum supported version 8.0", value) + } + + return nil +} + +// validateFullVersion validates that the version field is a valid semantic version. +func validateFullVersion(value string) error { + if strings.TrimSpace(value) == "" { + return fmt.Errorf("version cannot be empty") + } + + _, err := version.NewVersion(value) + if err != nil { + return fmt.Errorf("version %q is not a valid semantic version: %w", value, err) + } + + return nil +} + +// validateVersionReleaseConsistency returns a TestCheckFunc that validates version and release consistency. +func validateVersionReleaseConsistency(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("resource %s not found", resourceName) + } + + release := rs.Primary.Attributes["release"] + version := rs.Primary.Attributes["version"] + + if release == "" { + return fmt.Errorf("release attribute is empty") + } + if version == "" { + return fmt.Errorf("version attribute is empty") + } + + if !strings.HasPrefix(version, release) { + return fmt.Errorf("version %q does not start with release %q", version, release) + } + + return nil + } +}