github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/ddevapp/envfile_test.go (about)

     1  package ddevapp_test
     2  
     3  import (
     4  	"github.com/ddev/ddev/pkg/ddevapp"
     5  	"github.com/ddev/ddev/pkg/fileutil"
     6  	asrt "github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  func TestWriteProjectEnvFile(t *testing.T) {
    15  	assert := asrt.New(t)
    16  
    17  	origDir, _ := os.Getwd()
    18  
    19  	site := TestSites[0]
    20  	app, err := ddevapp.NewApp(site.Dir, false)
    21  	require.NoError(t, err)
    22  
    23  	t.Cleanup(func() {
    24  		_ = os.RemoveAll(app.GetConfigPath(".env"))
    25  	})
    26  
    27  	testEnvFiles, err := fileutil.ListFilesInDirFullPath(filepath.Join(origDir, "testdata", t.Name()))
    28  	require.NoError(t, err)
    29  	appEnvFile := filepath.Join(app.AppRoot, ".env")
    30  	for _, envFileName := range testEnvFiles {
    31  		_ = os.RemoveAll(appEnvFile)
    32  		err = fileutil.CopyFile(envFileName, appEnvFile)
    33  		require.NoError(t, err)
    34  		readEnvMap, readEnvText, err := ddevapp.ReadProjectEnvFile(appEnvFile)
    35  		require.NoError(t, err)
    36  		_ = readEnvMap
    37  
    38  		// Override with some new items
    39  		writeEnvMap := map[string]string{
    40  			"DB_VAL_DIDNOTEXIST": "new_db_val_didnotexist",
    41  			"DB_HOST":            "newdbhost",
    42  			"DB_DATABASE":        "newdbdatabase",
    43  			"DB_USERNAME":        "newdbusername",
    44  			"DB_PASSWORD":        "newdbpassword",
    45  			"DB_CONNECTION":      "new_mysql://root:root@somehost/somedb",
    46  		}
    47  		err = ddevapp.WriteProjectEnvFile(appEnvFile, writeEnvMap, readEnvText)
    48  		require.NoError(t, err)
    49  
    50  		postWriteEnvMap, postWriteEnvText, err := ddevapp.ReadProjectEnvFile(appEnvFile)
    51  		require.NoError(t, err)
    52  
    53  		// Make sure that the values we intended to change got changed
    54  		for k := range writeEnvMap {
    55  			assert.Equal(writeEnvMap[k], postWriteEnvMap[k], "Expected values for %s to match but writeEnvMap[%s]='%s' and postWriteEnvMap[%s]='%s' (envfile=%s)", k, k, writeEnvMap[k], k, postWriteEnvMap[k], envFileName)
    56  		}
    57  
    58  		// Now examine all values that should not have been changed
    59  		for k := range readEnvMap {
    60  			if _, ok := writeEnvMap[k]; ok {
    61  				// If we intended to write the var, don't test, as we deliberately overwrite and tested above.
    62  				continue
    63  			}
    64  			assert.Equal(readEnvMap[k], postWriteEnvMap[k], "Expected (unchanged) values for %s to match but readEnvMap[%s]='%s' and postWriteEnvMap[%s]='%s' (envfile=%s)", k, k, readEnvMap[k], k, postWriteEnvMap[k], envFileName)
    65  		}
    66  
    67  		// Look for comments that should have been preserved
    68  		origLines := strings.Split(readEnvText, "\n")
    69  		newLines := strings.Split(postWriteEnvText, "\n")
    70  		for i, l := range origLines {
    71  			if strings.HasPrefix(l, `#`) {
    72  				assert.Equal(l, newLines[i], "comment '%s' in original .env expected in revised .env but doesn't match (envfile=%s)", l, envFileName)
    73  			}
    74  		}
    75  
    76  	}
    77  }