104 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package state
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/require"
 | |
| 
 | |
| 	"github.com/helmfile/helmfile/pkg/filesystem"
 | |
| 	"github.com/helmfile/helmfile/pkg/tmpl"
 | |
| )
 | |
| 
 | |
| // TestValuesTemplateIsolation tests the fix for the helmfile values templating bug
 | |
| // where changing the order of releases resulted in different values being used
 | |
| func TestValuesTemplateIsolation(t *testing.T) {
 | |
| 	// Create test filesystem
 | |
| 	fs := &filesystem.FileSystem{
 | |
| 		Glob: func(pattern string) ([]string, error) {
 | |
| 			return nil, nil
 | |
| 		},
 | |
| 		ReadFile: func(filename string) ([]byte, error) {
 | |
| 			return nil, nil
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// Create test environment values
 | |
| 	envValues := map[string]any{
 | |
| 		"common": "shared-value",
 | |
| 		"foo": map[string]any{
 | |
| 			"name": "foo-chart",
 | |
| 		},
 | |
| 		"bar": map[string]any{
 | |
| 			"name": "bar-chart",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	st := &HelmState{
 | |
| 		fs:             fs,
 | |
| 		basePath:       "/tmp",
 | |
| 		RenderedValues: envValues,
 | |
| 	}
 | |
| 
 | |
| 	// Create two releases that use valuesTemplate with mergeOverwrite
 | |
| 	fooRelease := &ReleaseSpec{
 | |
| 		Name:  "foo",
 | |
| 		Chart: "charts/foo",
 | |
| 		ValuesTemplate: []any{
 | |
| 			"{{ .Values | get \"foo\" (dict) | mergeOverwrite .Values | toYaml | nindent 8 }}",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	barRelease := &ReleaseSpec{
 | |
| 		Name:  "bar",
 | |
| 		Chart: "charts/bar",
 | |
| 		ValuesTemplate: []any{
 | |
| 			"{{ .Values | get \"bar\" (dict) | mergeOverwrite .Values | toYaml | nindent 8 }}",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// Test: process foo first, then bar
 | |
| 	vals1 := st.Values()
 | |
| 	tmplData1, err := st.createReleaseTemplateData(fooRelease, vals1)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	renderer1 := tmpl.NewFileRenderer(st.fs, st.basePath, tmplData1)
 | |
| 	processedFooFirst, err := fooRelease.ExecuteTemplateExpressions(renderer1)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	vals2 := st.Values()
 | |
| 	tmplData2, err := st.createReleaseTemplateData(barRelease, vals2)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	renderer2 := tmpl.NewFileRenderer(st.fs, st.basePath, tmplData2)
 | |
| 	processedBarSecond, err := barRelease.ExecuteTemplateExpressions(renderer2)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	// Test: process bar first, then foo (reverse order)
 | |
| 	vals3 := st.Values()
 | |
| 	tmplData3, err := st.createReleaseTemplateData(barRelease, vals3)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	renderer3 := tmpl.NewFileRenderer(st.fs, st.basePath, tmplData3)
 | |
| 	processedBarFirst, err := barRelease.ExecuteTemplateExpressions(renderer3)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	vals4 := st.Values()
 | |
| 	tmplData4, err := st.createReleaseTemplateData(fooRelease, vals4)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	renderer4 := tmpl.NewFileRenderer(st.fs, st.basePath, tmplData4)
 | |
| 	processedFooSecond, err := fooRelease.ExecuteTemplateExpressions(renderer4)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	// Verify that the order doesn't matter - results should be consistent
 | |
| 	require.Equal(t, processedFooFirst.Values, processedFooSecond.Values,
 | |
| 		"foo release should produce same values regardless of processing order")
 | |
| 	require.Equal(t, processedBarSecond.Values, processedBarFirst.Values,
 | |
| 		"bar release should produce same values regardless of processing order")
 | |
| 
 | |
| 	// Also verify that the original values are not modified
 | |
| 	originalVals := st.Values()
 | |
| 	require.Equal(t, envValues, originalVals,
 | |
| 		"original values should remain unchanged")
 | |
| }
 |