helmfile/pkg/state/oci_chart_version_test.go

136 lines
4.0 KiB
Go

package state
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestOCIChartVersionHandling tests the handling of OCI chart versions (issue #2247)
func TestOCIChartVersionHandling(t *testing.T) {
tests := []struct {
name string
chart string
version string
devel bool
helmVersion string
expectedVersion string
expectedError bool
expectedQualifiedChart string
}{
{
name: "OCI chart with explicit version",
chart: "oci://registry.example.com/my-chart",
version: "1.2.3",
helmVersion: "3.18.0",
expectedVersion: "1.2.3",
expectedError: false,
expectedQualifiedChart: "registry.example.com/my-chart:1.2.3",
},
{
name: "OCI chart with semver range version",
chart: "oci://registry.example.com/my-chart",
version: "^1.0.0",
helmVersion: "3.18.0",
expectedVersion: "^1.0.0",
expectedError: false,
expectedQualifiedChart: "registry.example.com/my-chart:^1.0.0",
},
{
name: "OCI chart without version should use empty string",
chart: "oci://registry.example.com/my-chart",
version: "",
helmVersion: "3.18.0",
expectedVersion: "",
expectedError: false,
expectedQualifiedChart: "registry.example.com/my-chart",
},
{
name: "OCI chart with explicit 'latest' should fail (any Helm version)",
chart: "oci://registry.example.com/my-chart",
version: "latest",
helmVersion: "3.18.0",
expectedVersion: "",
expectedError: true,
expectedQualifiedChart: "",
},
{
name: "OCI chart with explicit 'latest' should also fail on older Helm",
chart: "oci://registry.example.com/my-chart",
version: "latest",
helmVersion: "3.7.0",
expectedVersion: "",
expectedError: true,
expectedQualifiedChart: "",
},
{
name: "OCI chart without version in devel mode",
chart: "oci://registry.example.com/my-chart",
version: "",
devel: true,
helmVersion: "3.18.0",
expectedVersion: "",
expectedError: false,
expectedQualifiedChart: "registry.example.com/my-chart",
},
{
name: "non-OCI chart returns empty qualified name",
chart: "stable/nginx",
version: "",
helmVersion: "3.18.0",
expectedVersion: "",
expectedError: false,
expectedQualifiedChart: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create a minimal HelmState
st := &HelmState{
basePath: "/test",
}
// Create a release
release := &ReleaseSpec{
Name: "test-release",
Chart: tt.chart,
Version: tt.version,
}
if tt.devel {
devel := true
release.Devel = &devel
}
// Call the function
qualifiedChartName, chartName, chartVersion, err := st.getOCIQualifiedChartName(release)
// Check error
if tt.expectedError {
require.Error(t, err)
assert.Contains(t, err.Error(), "semver compliant")
} else {
require.NoError(t, err)
}
// Check version
assert.Equal(t, tt.expectedVersion, chartVersion, "chartVersion mismatch")
// Check qualified chart name
assert.Equal(t, tt.expectedQualifiedChart, qualifiedChartName, "qualifiedChartName mismatch")
// Check chart name extraction for OCI charts
if IsOCIChart(tt.chart) && !tt.expectedError {
assert.Equal(t, "my-chart", chartName, "chartName mismatch")
}
})
}
}
// IsOCIChart is a helper function to check if a chart is OCI-based
func IsOCIChart(chart string) bool {
return len(chart) > 6 && chart[:6] == "oci://"
}