1
1
package env
2
2
3
3
import (
4
- "github.com/stretchr/testify/assert"
5
- "os"
4
+ "slices"
6
5
"strings"
7
6
"testing"
7
+
8
+ "github.com/stretchr/testify/assert"
8
9
)
9
10
10
11
func TestProvider (t * testing.T ) {
12
+ mockEnviron := func () []string {
13
+ return []string {"TEST_FOO=bar" }
14
+ }
11
15
12
16
testCases := []struct {
13
17
name string
@@ -18,6 +22,7 @@ func TestProvider(t *testing.T) {
18
22
expKey string
19
23
expValue string
20
24
cb func (key string ) string
25
+ opt * Opt
21
26
want * Env
22
27
}{
23
28
{
@@ -27,6 +32,7 @@ func TestProvider(t *testing.T) {
27
32
want : & Env {
28
33
prefix : "TESTVAR_" ,
29
34
delim : "." ,
35
+ opt : defaultOpt ,
30
36
},
31
37
},
32
38
{
@@ -43,6 +49,7 @@ func TestProvider(t *testing.T) {
43
49
want : & Env {
44
50
prefix : "TESTVAR_" ,
45
51
delim : "." ,
52
+ opt : defaultOpt ,
46
53
},
47
54
},
48
55
{
@@ -52,6 +59,7 @@ func TestProvider(t *testing.T) {
52
59
want : & Env {
53
60
prefix : "" ,
54
61
delim : "." ,
62
+ opt : defaultOpt ,
55
63
},
56
64
},
57
65
{
@@ -66,50 +74,87 @@ func TestProvider(t *testing.T) {
66
74
return strings .Replace (strings .ToUpper (key ), "_" , "." , - 1 )
67
75
},
68
76
},
77
+ {
78
+ name : "Custom opt" ,
79
+ prefix : "TEST_" ,
80
+ delim : "." ,
81
+ opt : & Opt {
82
+ EnvironFunc : mockEnviron ,
83
+ },
84
+ want : & Env {
85
+ prefix : "TEST_" ,
86
+ delim : "." ,
87
+ opt : & Opt {
88
+ EnvironFunc : mockEnviron ,
89
+ },
90
+ },
91
+ },
69
92
}
70
93
71
94
for _ , tc := range testCases {
72
95
t .Run (tc .name , func (t * testing.T ) {
73
- gotProvider := Provider (tc .prefix , tc .delim , tc .cb )
74
- if tc .cb == nil {
96
+ var gotProvider * Env
97
+ if tc .opt != nil {
98
+ gotProvider = Provider (tc .prefix , tc .delim , tc .cb , tc .opt )
99
+ } else {
100
+ gotProvider = Provider (tc .prefix , tc .delim , tc .cb )
101
+ }
102
+
103
+ if tc .cb == nil && tc .opt == nil {
75
104
assert .Equal (t , tc .want , gotProvider )
105
+ return
76
106
}
107
+
77
108
if tc .cb != nil {
78
109
k , v := gotProvider .cb (tc .key , tc .value )
79
110
assert .Equal (t , tc .expKey , k )
80
111
assert .Equal (t , tc .expValue , v )
81
112
}
113
+ if tc .opt != nil {
114
+ wantEnv := tc .want .opt .EnvironFunc ()
115
+ gotEnv := gotProvider .opt .EnvironFunc ()
116
+ slices .Sort (wantEnv )
117
+ slices .Sort (gotEnv )
118
+ if ! slices .Equal (wantEnv , gotEnv ) {
119
+ assert .Fail (t , "Env vars not equal (omitted from message for security)" ,
120
+ "Want len: %d\n Got len:%d" , len (wantEnv ), len (gotEnv ))
121
+ }
122
+ }
82
123
})
83
124
}
84
125
}
85
126
86
127
func TestProviderWithValue (t * testing.T ) {
128
+ mockEnviron := func () []string {
129
+ return []string {"TEST_FOO=bar" }
130
+ }
131
+
87
132
testCases := []struct {
88
- name string
89
- prefix string
90
- delim string
91
- cb func (key string , value string ) (string , interface {})
92
- nilCallback bool
93
- want * Env
133
+ name string
134
+ prefix string
135
+ delim string
136
+ cb func (key string , value string ) (string , interface {})
137
+ opt * Opt
138
+ want * Env
94
139
}{
95
140
{
96
- name : "Nil cb" ,
97
- prefix : "TEST_" ,
98
- delim : "." ,
99
- nilCallback : true ,
141
+ name : "Nil cb" ,
142
+ prefix : "TEST_" ,
143
+ delim : "." ,
100
144
want : & Env {
101
145
prefix : "TEST_" ,
102
146
delim : "." ,
147
+ opt : defaultOpt ,
103
148
},
104
149
},
105
150
{
106
- name : "Empty string nil cb" ,
107
- prefix : "" ,
108
- delim : "." ,
109
- nilCallback : true ,
151
+ name : "Empty string nil cb" ,
152
+ prefix : "" ,
153
+ delim : "." ,
110
154
want : & Env {
111
155
prefix : "" ,
112
156
delim : "." ,
157
+ opt : defaultOpt ,
113
158
},
114
159
},
115
160
{
@@ -125,6 +170,7 @@ func TestProviderWithValue(t *testing.T) {
125
170
cb : func (key string , value string ) (string , interface {}) {
126
171
return key , value
127
172
},
173
+ opt : defaultOpt ,
128
174
},
129
175
},
130
176
{
@@ -142,23 +188,58 @@ func TestProviderWithValue(t *testing.T) {
142
188
key = strings .Replace (strings .TrimPrefix (strings .ToLower (key ), "test_" ), "_" , "." , - 1 )
143
189
return key , value
144
190
},
191
+ opt : defaultOpt ,
192
+ },
193
+ },
194
+ {
195
+ name : "Custom opt" ,
196
+ prefix : "TEST_" ,
197
+ delim : "." ,
198
+ opt : & Opt {
199
+ EnvironFunc : mockEnviron ,
200
+ },
201
+ want : & Env {
202
+ prefix : "TEST_" ,
203
+ delim : "." ,
204
+ opt : & Opt {
205
+ EnvironFunc : mockEnviron ,
206
+ },
145
207
},
146
208
},
147
209
}
148
210
149
211
for _ , tc := range testCases {
150
212
t .Run (tc .name , func (t * testing.T ) {
151
- got := ProviderWithValue ( tc . prefix , tc . delim , tc . cb )
152
- if tc .nilCallback {
153
- assert . Equal ( t , tc .want , got )
213
+ var got * Env
214
+ if tc .opt != nil {
215
+ got = ProviderWithValue ( tc . prefix , tc .delim , tc . cb , tc . opt )
154
216
} else {
217
+ got = ProviderWithValue (tc .prefix , tc .delim , tc .cb )
218
+ }
219
+ if tc .cb == nil && tc .opt == nil {
220
+ assert .Equal (t , tc .want , got )
221
+ return
222
+ }
223
+
224
+ if tc .cb != nil {
155
225
keyGot , valGot := got .cb ("test_key_env_1" , "test_val" )
156
226
keyWant , valWant := tc .want .cb ("test_key_env_1" , "test_val" )
157
227
assert .Equal (t , tc .prefix , got .prefix )
158
228
assert .Equal (t , tc .delim , got .delim )
159
229
assert .Equal (t , keyWant , keyGot )
160
230
assert .Equal (t , valWant , valGot )
161
231
}
232
+ if tc .opt != nil {
233
+ wantEnv := tc .want .opt .EnvironFunc ()
234
+ gotEnv := got .opt .EnvironFunc ()
235
+ slices .Sort (wantEnv )
236
+ slices .Sort (gotEnv )
237
+ if ! slices .Equal (wantEnv , gotEnv ) {
238
+ assert .Fail (t , "Env vars not equal (omitted from message for security)" ,
239
+ "Want len: %d\n Got len:%d" , len (wantEnv ), len (gotEnv ))
240
+ }
241
+ assert .Equal (t , tc .want .opt .EnvironFunc (), got .opt .EnvironFunc ())
242
+ }
162
243
})
163
244
}
164
245
}
@@ -180,6 +261,7 @@ func TestRead(t *testing.T) {
180
261
expValue : "TEST_VAL" ,
181
262
env : & Env {
182
263
delim : "." ,
264
+ opt : defaultOpt ,
183
265
},
184
266
},
185
267
{
@@ -193,6 +275,7 @@ func TestRead(t *testing.T) {
193
275
cb : func (key string , value string ) (string , interface {}) {
194
276
return strings .Replace (strings .ToLower (key ), "_" , "." , - 1 ), value
195
277
},
278
+ opt : defaultOpt ,
196
279
},
197
280
},
198
281
{
@@ -207,6 +290,7 @@ func TestRead(t *testing.T) {
207
290
cb : func (key string , value string ) (string , interface {}) {
208
291
return strings .Replace (strings .ToLower (key ), "_" , "." , - 1 ), value
209
292
},
293
+ opt : defaultOpt ,
210
294
},
211
295
},
212
296
{
@@ -217,6 +301,7 @@ func TestRead(t *testing.T) {
217
301
expValue : "/test/dir/file" ,
218
302
env : & Env {
219
303
delim : "." ,
304
+ opt : defaultOpt ,
220
305
},
221
306
},
222
307
{
@@ -230,6 +315,7 @@ func TestRead(t *testing.T) {
230
315
cb : func (key string , value string ) (string , interface {}) {
231
316
return key , strings .Replace (strings .ToLower (value ), "/" , "_" , - 1 )
232
317
},
318
+ opt : defaultOpt ,
233
319
},
234
320
},
235
321
{
@@ -240,15 +326,29 @@ func TestRead(t *testing.T) {
240
326
expValue : "" ,
241
327
env : & Env {
242
328
delim : "." ,
329
+ opt : defaultOpt ,
330
+ },
331
+ },
332
+ {
333
+ name : "Environ func provided" ,
334
+ key : "TEST_KEY" ,
335
+ value : "TEST_VAL" ,
336
+ expKey : "TEST_OVERRIDE_KEY" ,
337
+ expValue : "TEST_OVERRIDE_VAL" ,
338
+ env : & Env {
339
+ delim : "." ,
340
+ opt : & Opt {
341
+ EnvironFunc : func () []string {
342
+ return []string {"TEST_OVERRIDE_KEY=TEST_OVERRIDE_VAL" }
343
+ },
344
+ },
243
345
},
244
346
},
245
347
}
246
348
247
349
for _ , tc := range testCases {
248
350
t .Run (tc .name , func (t * testing.T ) {
249
- err := os .Setenv (tc .key , tc .value )
250
- assert .Nil (t , err )
251
- defer os .Unsetenv (tc .key )
351
+ t .Setenv (tc .key , tc .value )
252
352
253
353
envs , err := tc .env .Read ()
254
354
assert .Nil (t , err )
0 commit comments