github.com/42z-io/confik@v0.0.2-0.20231103050132-21d8f377356c/env_test.go (about) 1 package confik 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestParseEnvVar(t *testing.T) { 13 name, value, err := parseEnvVar("VARIABLE=") 14 assert.Nil(t, err) 15 assert.Equal(t, "VARIABLE", name) 16 assert.Equal(t, "", value) 17 } 18 19 func TestFindEnvFile(t *testing.T) { 20 cwd, _ := os.Getwd() 21 defer func() { 22 os.Chdir(cwd) 23 }() 24 os.Chdir("testdata/folder1/folder2/folder3") 25 path, err := findEnvFile() 26 assert.Nil(t, err) 27 absPath := filepath.Join(cwd, "testdata/folder1/.env") 28 assert.Equal(t, absPath, path) 29 } 30 31 func TestFindEnvFileNotFound(t *testing.T) { 32 cwd, _ := os.Getwd() 33 defer func() { 34 os.Chdir(cwd) 35 }() 36 os.Chdir("/") 37 path, err := findEnvFile() 38 assert.Nil(t, err) 39 assert.Equal(t, "", path) 40 } 41 42 func TestLoadEnvFileNoEnvFile(t *testing.T) { 43 cwd, _ := os.Getwd() 44 os.Chdir("/") 45 defer func() { 46 os.Chdir(cwd) 47 }() 48 49 kv, err := loadEnvFile(Config[testAllTypes]{}) 50 assert.Nil(t, err) 51 assert.Equal(t, map[string]string{}, kv) 52 } 53 54 func TestLoadEnvFileDoesNotExist(t *testing.T) { 55 _, err := loadEnvFile(Config[testAllTypes]{ 56 EnvFilePath: ".fake", 57 }) 58 if assert.Error(t, err) { 59 assert.Equal(t, "environment file does not exist: .fake", err.Error()) 60 } 61 } 62 63 func TestLoadEnvFileInvalid(t *testing.T) { 64 _, err := loadEnvFile(Config[testAllTypes]{ 65 EnvFilePath: "testdata/.invalid", 66 }) 67 if assert.Error(t, err) { 68 assert.Equal(t, "invalid expression in env file: INVALID", err.Error()) 69 } 70 } 71 72 func TestParseEnvFile(t *testing.T) { 73 input := ` 74 // Comment 75 TC_UNQUOTED=1 76 TC_QUOTED="hello world" 77 TC_SPACES = hello world 78 TC_LONG_NAME_1=test 79 # Comment 80 81 82 ` 83 kv, err := parseEnvFile(strings.NewReader(input)) 84 assert.Nil(t, err) 85 expected := map[string]string{ 86 "TC_UNQUOTED": "1", 87 "TC_QUOTED": "hello world", 88 "TC_SPACES": "hello world", 89 "TC_LONG_NAME_1": "test", 90 } 91 assert.Equal(t, len(expected), len(kv)) 92 for testK, testV := range expected { 93 value, exists := kv[testK] 94 assert.True(t, exists, "expected to find key %s", testK) 95 assert.Equal(t, testV, value, "invalid value for key %s", testK) 96 } 97 } 98 99 func TestParseEnvFileInvalid(t *testing.T) { 100 input := "BLAH" 101 _, err := parseEnvFile(strings.NewReader(input)) 102 if assert.Error(t, err) { 103 assert.Equal(t, "invalid expression in env file: BLAH", err.Error()) 104 } 105 } 106 107 func BenchmarkParseEnvFile(b *testing.B) { 108 input := ` 109 // Comment 110 TC_UNQUOTED=1 111 TC_QUOTED="hello world" 112 TC_SPACES=hello world 113 TC_LONG_NAME_1=test 114 # Comment 115 116 117 ` 118 reader := strings.NewReader(input) 119 for n := 0; n < b.N; n++ { 120 _, err := parseEnvFile(reader) 121 if err != nil { 122 panic(err) 123 } 124 } 125 }