package opts import ( "fmt" "os" "runtime" "testing" "gotest.tools/v3/assert" ) func TestValidateEnv(t *testing.T) { type testCase struct { value string expected string err error } tests := []testCase{ { value: "a", expected: "a", }, { value: "something", expected: "something", }, { value: "_=a", expected: "_=a", }, { value: "env1=value1", expected: "env1=value1", }, { value: "_env1=value1", expected: "_env1=value1", }, { value: "env2=value2=value3", expected: "env2=value2=value3", }, { value: "env3=abc!qwe", expected: "env3=abc!qwe", }, { value: "env_4=value 4", expected: "env_4=value 4", }, { value: "PATH", expected: fmt.Sprintf("PATH=%v", os.Getenv("PATH")), }, { value: "=a", err: fmt.Errorf("invalid environment variable: =a"), }, { value: "PATH=", expected: "PATH=", }, { value: "PATH=something", expected: "PATH=something", }, { value: "asd!qwe", expected: "asd!qwe", }, { value: "1asd", expected: "1asd", }, { value: "123", expected: "123", }, { value: "some space", expected: "some space", }, { value: " some space before", expected: " some space before", }, { value: "some space after ", expected: "some space after ", }, { value: "=", err: fmt.Errorf("invalid environment variable: ="), }, } if runtime.GOOS == "windows" { // Environment variables are case in-sensitive on Windows tests = append(tests, testCase{ value: "PaTh", expected: fmt.Sprintf("PaTh=%v", os.Getenv("PATH")), err: nil, }) } for _, tc := range tests { tc := tc t.Run(tc.value, func(t *testing.T) { actual, err := ValidateEnv(tc.value) if tc.err == nil { assert.NilError(t, err) } else { assert.Error(t, err, tc.err.Error()) } assert.Equal(t, actual, tc.expected) }) } }