test: add more tests for resolveReleaseValues, renderValuesFileToBytesWithData, and generateTemporaryReleaseValuesFilesWithData

Agent-Logs-Url: https://github.com/helmfile/helmfile/sessions/5da5c9d8-7464-4146-84b5-1433ed6193f3

Co-authored-by: yxxhero <11087727+yxxhero@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-04-26 04:17:06 +00:00 committed by yxxhero
parent c6e74b4394
commit e8fee8b84c
1 changed files with 287 additions and 0 deletions

View File

@ -1096,3 +1096,290 @@ func TestMergedReleaseTemplateData_InlineValues(t *testing.T) {
t.Errorf("expected ingress.enabled to be true, got %v", ingressMap["enabled"])
}
}
func newTestHelmStateWithFiles(t *testing.T, files map[string]string, basePath string) (*HelmState, func()) {
t.Helper()
logger := zaptest.NewLogger(t).Sugar()
valsRuntime, err := vals.New(vals.Options{CacheSize: 32})
require.NoError(t, err)
testFs := testhelper.NewTestFs(files)
testFs.Cwd = basePath
st := &HelmState{
logger: logger,
fs: testFs.ToFileSystem(),
valsRuntime: valsRuntime,
basePath: basePath,
FilePath: basePath + "/helmfile.yaml",
RenderedValues: map[string]any{},
}
return st, func() {}
}
func TestResolveReleaseValues_Empty(t *testing.T) {
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
result, err := st.resolveReleaseValues(release)
require.NoError(t, err)
assert.Empty(t, result)
}
func TestResolveReleaseValues_FromFile(t *testing.T) {
valuesFile := "/project/values.yaml"
valuesContent := `replicaCount: 2
image:
repository: nginx
tag: "1.21"
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
valuesFile: valuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{
Name: "myrelease",
Chart: "mychart",
Values: []any{
"values.yaml",
},
}
result, err := st.resolveReleaseValues(release)
require.NoError(t, err)
assert.Equal(t, 2, result["replicaCount"])
imageMap, ok := result["image"].(map[string]any)
require.True(t, ok, "expected image to be a map")
assert.Equal(t, "nginx", imageMap["repository"])
}
func TestResolveReleaseValues_InlineMap(t *testing.T) {
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{}, "/project")
defer cleanup()
release := &ReleaseSpec{
Name: "myrelease",
Chart: "mychart",
Values: []any{
map[string]any{
"replicaCount": 5,
"service": map[string]any{
"type": "ClusterIP",
"port": 80,
},
},
},
}
result, err := st.resolveReleaseValues(release)
require.NoError(t, err)
assert.Equal(t, 5, result["replicaCount"])
serviceMap, ok := result["service"].(map[string]any)
require.True(t, ok, "expected service to be a map")
assert.Equal(t, "ClusterIP", serviceMap["type"])
}
func TestResolveReleaseValues_MultipleSourcesMerged(t *testing.T) {
baseValuesFile := "/project/base.yaml"
baseValuesContent := `replicaCount: 1
service:
type: ClusterIP
`
overrideValuesFile := "/project/override.yaml"
overrideValuesContent := `replicaCount: 3
ingress:
enabled: true
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
baseValuesFile: baseValuesContent,
overrideValuesFile: overrideValuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{
Name: "myrelease",
Chart: "mychart",
Values: []any{
"base.yaml",
"override.yaml",
},
}
result, err := st.resolveReleaseValues(release)
require.NoError(t, err)
// override.yaml value wins
assert.Equal(t, 3, result["replicaCount"])
// from base.yaml
serviceMap, ok := result["service"].(map[string]any)
require.True(t, ok, "expected service to be a map")
assert.Equal(t, "ClusterIP", serviceMap["type"])
// from override.yaml
ingressMap, ok := result["ingress"].(map[string]any)
require.True(t, ok, "expected ingress to be a map")
assert.Equal(t, true, ingressMap["enabled"])
}
func TestResolveReleaseValues_FileAndInlineMerged(t *testing.T) {
valuesFile := "/project/values.yaml"
valuesContent := `replicaCount: 1
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
valuesFile: valuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{
Name: "myrelease",
Chart: "mychart",
Values: []any{
"values.yaml",
map[string]any{
"extraEnv": "production",
},
},
}
result, err := st.resolveReleaseValues(release)
require.NoError(t, err)
assert.Equal(t, 1, result["replicaCount"])
assert.Equal(t, "production", result["extraEnv"])
}
func TestRenderValuesFileToBytesWithData_PlainYAML(t *testing.T) {
valuesFile := "/project/values.yaml"
valuesContent := `replicaCount: 2
image:
repository: nginx
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
valuesFile: valuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
tmplData := st.createReleaseTemplateData(release, map[string]any{})
result, err := st.renderValuesFileToBytesWithData(valuesFile, tmplData)
require.NoError(t, err)
assert.Contains(t, string(result), "replicaCount: 2")
assert.Contains(t, string(result), "repository: nginx")
}
func TestRenderValuesFileToBytesWithData_WithValuesTemplate(t *testing.T) {
valuesFile := "/project/values.yaml.gotmpl"
valuesContent := `replicaCount: {{ .Values.replicaCount }}
enabled: {{ .Values.ingress.enabled }}
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
valuesFile: valuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
tmplData := st.createReleaseTemplateData(release, map[string]any{
"replicaCount": 3,
"ingress": map[string]any{
"enabled": true,
},
})
result, err := st.renderValuesFileToBytesWithData(valuesFile, tmplData)
require.NoError(t, err)
assert.Contains(t, string(result), "replicaCount: 3")
assert.Contains(t, string(result), "enabled: true")
}
func TestRenderValuesFileToBytesWithData_WithReleaseTemplate(t *testing.T) {
valuesFile := "/project/values.yaml.gotmpl"
valuesContent := `releaseName: {{ .Release.Name }}
releaseNamespace: {{ .Release.Namespace }}
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
valuesFile: valuesContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myapp", Chart: "mychart", Namespace: "production"}
tmplData := st.createReleaseTemplateData(release, map[string]any{})
result, err := st.renderValuesFileToBytesWithData(valuesFile, tmplData)
require.NoError(t, err)
assert.Contains(t, string(result), "releaseName: myapp")
assert.Contains(t, string(result), "releaseNamespace: production")
}
func TestGenerateTemporaryReleaseValuesFilesWithData_StringPath(t *testing.T) {
patchFile := "/project/patch.yaml.gotmpl"
patchContent := `enabled: {{ .Values.ingress.enabled }}
host: {{ .Values.ingress.host }}
`
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{
patchFile: patchContent,
}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
tmplData := st.createReleaseTemplateData(release, map[string]any{
"ingress": map[string]any{
"enabled": true,
"host": "example.com",
},
})
generatedFiles, err := st.generateTemporaryReleaseValuesFilesWithData(
release,
[]any{"patch.yaml.gotmpl"},
tmplData,
)
require.NoError(t, err)
require.Len(t, generatedFiles, 1)
// Read and verify the generated file content
content, err := filesystem.DefaultFileSystem().ReadFile(generatedFiles[0])
require.NoError(t, err)
assert.Contains(t, string(content), "enabled: true")
assert.Contains(t, string(content), "host: example.com")
}
func TestGenerateTemporaryReleaseValuesFilesWithData_InlineMap(t *testing.T) {
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
tmplData := st.createReleaseTemplateData(release, map[string]any{})
inlineValues := map[string]any{
"replicaCount": 5,
"service": map[string]any{
"type": "NodePort",
},
}
generatedFiles, err := st.generateTemporaryReleaseValuesFilesWithData(
release,
[]any{inlineValues},
tmplData,
)
require.NoError(t, err)
require.Len(t, generatedFiles, 1)
content, err := filesystem.DefaultFileSystem().ReadFile(generatedFiles[0])
require.NoError(t, err)
assert.Contains(t, string(content), "replicaCount: 5")
assert.Contains(t, string(content), "NodePort")
}
func TestGenerateTemporaryReleaseValuesFilesWithData_UnknownTypeError(t *testing.T) {
st, cleanup := newTestHelmStateWithFiles(t, map[string]string{}, "/project")
defer cleanup()
release := &ReleaseSpec{Name: "myrelease", Chart: "mychart"}
tmplData := st.createReleaseTemplateData(release, map[string]any{})
// Passing an unsupported type (int) should return an error
_, err := st.generateTemporaryReleaseValuesFilesWithData(
release,
[]any{42},
tmplData,
)
require.Error(t, err)
assert.Contains(t, err.Error(), "unexpected type of value")
}