package sdk import ( "testing" libhelmrelease "github.com/portainer/portainer/pkg/libhelm/release" "github.com/stretchr/testify/assert" "helm.sh/helm/v3/pkg/chart" sdkrelease "helm.sh/helm/v3/pkg/release" ) func Test_Convert(t *testing.T) { t.Run("successfully maps a sdk release to a release", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "releaseName", Version: 1, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "chartName", Version: "chartVersion", AppVersion: "chartAppVersion", }, }, } values := libhelmrelease.Values{ UserSuppliedValues: `{"key": "value"}`, ComputedValues: `{"key": "value"}`, } result := convert(&release, values) is.Equal(release.Name, result.Name) }) t.Run("extracts stack ID from annotations", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "stack-release", Namespace: "app-namespace", Version: 2, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "myapp", Version: "2.1.0", Annotations: map[string]string{ StackIDAnnotation: "123", ChartPathAnnotation: "charts/myapp", RepoURLAnnotation: "https://github.com/company/charts", }, }, }, } result := convert(&release, libhelmrelease.Values{}) is.NotNil(result) is.Equal(123, result.StackID) is.Equal("charts/myapp", result.ChartReference.ChartPath) is.Equal("https://github.com/company/charts", result.ChartReference.RepoURL) }) t.Run("handles invalid stack ID gracefully", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "release", Namespace: "default", Version: 1, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "chart", Version: "1.0.0", Annotations: map[string]string{ StackIDAnnotation: "not-a-number", }, }, }, } result := convert(&release, libhelmrelease.Values{}) is.NotNil(result) // Should default to 0 when parsing fails is.Equal(0, result.StackID) }) t.Run("handles empty stack ID annotation", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "release", Namespace: "default", Version: 1, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "chart", Version: "1.0.0", Annotations: map[string]string{ StackIDAnnotation: "", }, }, }, } result := convert(&release, libhelmrelease.Values{}) is.NotNil(result) is.Equal(0, result.StackID) }) t.Run("handles missing annotations", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "release", Namespace: "default", Version: 1, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "chart", Version: "1.0.0", Annotations: nil, }, }, } result := convert(&release, libhelmrelease.Values{}) is.NotNil(result) is.Equal(0, result.StackID) }) // Note: We don't test nil chart metadata or nil chart cases because // the Helm SDK never returns releases in those states. The convert function // assumes valid Helm SDK releases, which is acceptable for internal use. t.Run("extracts registry ID from annotations", func(t *testing.T) { is := assert.New(t) release := sdkrelease.Release{ Name: "release", Namespace: "default", Version: 1, Info: &sdkrelease.Info{ Status: "deployed", }, Chart: &chart.Chart{ Metadata: &chart.Metadata{ Name: "chart", Version: "1.0.0", Annotations: map[string]string{ RegistryIDAnnotation: "42", ChartPathAnnotation: "oci://registry.example.com/charts/myapp", }, }, }, } result := convert(&release, libhelmrelease.Values{}) is.NotNil(result) is.Equal(int64(42), result.ChartReference.RegistryID) is.Equal("oci://registry.example.com/charts/myapp", result.ChartReference.ChartPath) }) }