github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/opts/parse_test.go (about)

     1  package opts
     2  
     3  import (
     4  	"testing"
     5  
     6  	"gotest.tools/v3/assert"
     7  	"gotest.tools/v3/fs"
     8  )
     9  
    10  func TestReadKVEnvStrings(t *testing.T) {
    11  	emptyEnvFile := fs.NewFile(t, t.Name())
    12  	defer emptyEnvFile.Remove()
    13  
    14  	// EMPTY_VAR should be set, but with an empty string as value
    15  	// FROM_ENV value should be substituted with FROM_ENV in the current environment
    16  	// NO_SUCH_ENV does not exist in the current environment, so should be omitted
    17  	envFile1 := fs.NewFile(t, t.Name(), fs.WithContent(`Z1=z
    18  EMPTY_VAR=
    19  FROM_ENV
    20  NO_SUCH_ENV
    21  `))
    22  	defer envFile1.Remove()
    23  	envFile2 := fs.NewFile(t, t.Name(), fs.WithContent("Z2=z\nA2=a"))
    24  	defer envFile2.Remove()
    25  	t.Setenv("FROM_ENV", "from-env")
    26  
    27  	tests := []struct {
    28  		name      string
    29  		files     []string
    30  		overrides []string
    31  		expected  []string
    32  	}{
    33  		{
    34  			name: "empty",
    35  		},
    36  		{
    37  			name:  "empty file",
    38  			files: []string{emptyEnvFile.Path()},
    39  		},
    40  		{
    41  			name:     "single file",
    42  			files:    []string{envFile1.Path()},
    43  			expected: []string{"Z1=z", "EMPTY_VAR=", "FROM_ENV=from-env"},
    44  		},
    45  		{
    46  			name:     "two files",
    47  			files:    []string{envFile1.Path(), envFile2.Path()},
    48  			expected: []string{"Z1=z", "EMPTY_VAR=", "FROM_ENV=from-env", "Z2=z", "A2=a"},
    49  		},
    50  		{
    51  			name:      "single file and override",
    52  			files:     []string{envFile1.Path()},
    53  			overrides: []string{"Z1=override", "EXTRA=extra"},
    54  			expected:  []string{"Z1=z", "EMPTY_VAR=", "FROM_ENV=from-env", "Z1=override", "EXTRA=extra"},
    55  		},
    56  		{
    57  			name:      "overrides only",
    58  			overrides: []string{"Z1=z", "EMPTY_VAR="},
    59  			expected:  []string{"Z1=z", "EMPTY_VAR="},
    60  		},
    61  	}
    62  
    63  	for _, tc := range tests {
    64  		tc := tc
    65  		t.Run(tc.name, func(t *testing.T) {
    66  			envs, err := ReadKVEnvStrings(tc.files, tc.overrides)
    67  			assert.NilError(t, err)
    68  			assert.DeepEqual(t, tc.expected, envs)
    69  		})
    70  	}
    71  }