136 lines
4.0 KiB
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://"
|
|
}
|