@@ -3,46 +3,86 @@ package env
3
3
import (
4
4
"os"
5
5
"testing"
6
+
7
+ "github.com/go-playground/validator/v10"
6
8
)
7
9
10
+ type Config struct {
11
+ Config1 string `env:"CONFIG1"`
12
+ Config2 int `env:"CONFIG2"`
13
+ Config3 string `env:"CONFIG3"`
14
+ }
15
+
8
16
func TestLoad (t * testing.T ) {
9
- // Make sure that the environment variables are not set.
10
- os .Clearenv ()
11
17
12
- t .Setenv ("CONFIG1" , "value1" )
18
+ t .Run ("missing value" , func (t * testing.T ) {
19
+ // Make sure that the environment variables are not set.
20
+ os .Clearenv ()
13
21
14
- type Config struct {
15
- Config1 string `env:"CONFIG1"`
16
- Config2 int `env:"CONFIG2"`
17
- }
22
+ cfg , err := Load [ Config ]()
23
+ if err != nil {
24
+ t . Fatal ( err )
25
+ }
18
26
19
- cfg , err := Load [Config ]("fixtures/test.env" )
20
- if err != nil {
21
- t .Fatal (err )
22
- }
27
+ validate (t , "CONFIG1" , "" , cfg .Config1 )
28
+ validate (t , "CONFIG2" , 0 , cfg .Config2 )
29
+ })
23
30
24
- validate ( t , "CONFIG1" , "value1" , cfg . Config1 )
25
- validate ( t , "CONFIG2" , 2 , cfg . Config2 )
26
- }
31
+ t . Run ( "load from env and file" , func ( t * testing. T ) {
32
+ // Make sure that the environment variables are not set.
33
+ os . Clearenv ()
27
34
28
- func TestLoadMissingConfigFile (t * testing.T ) {
29
- // Make sure that the environment variables are not set.
30
- os .Clearenv ()
35
+ t .Setenv ("CONFIG1" , "value1" )
31
36
32
- t .Setenv ("CONFIG1" , "value1" )
37
+ cfg , err := Load [Config ]("fixtures/test.env" )
38
+ if err != nil {
39
+ t .Fatal (err )
40
+ }
33
41
34
- type Config struct {
35
- Config1 string `env:"CONFIG1"`
36
- Config2 string `env:"CONFIG2"`
37
- }
42
+ validate (t , "CONFIG1" , "value1" , cfg .Config1 )
43
+ validate (t , "CONFIG2" , 2 , cfg .Config2 )
44
+ })
38
45
39
- cfg , err := Load [Config ]("fixtures/missing.env" )
40
- if err != nil {
41
- t .Fatal (err )
42
- }
46
+ t .Run ("env variables take precedence over file" , func (t * testing.T ) {
47
+ // Make sure that the environment variables are not set.
48
+ os .Clearenv ()
49
+
50
+ t .Setenv ("CONFIG2" , "7" )
51
+
52
+ cfg , err := Load [Config ]("fixtures/test.env" )
53
+ if err != nil {
54
+ t .Fatal (err )
55
+ }
56
+
57
+ validate (t , "CONFIG2" , 7 , cfg .Config2 )
58
+ validate (t , "CONFIG3" , "value3" , cfg .Config3 )
59
+ })
60
+
61
+ t .Run ("it fails on validation" , func (t * testing.T ) {
62
+ // Make sure that the environment variables are not set.
63
+ os .Clearenv ()
64
+
65
+ t .Setenv ("NON_ZERO_FLOAT" , "1" )
66
+
67
+ type Config struct {
68
+ NonZeroFoat float32 `env:"NON_ZERO_FLOAT" validate:"required"`
69
+ NonEmptyString string `env:"NON_EMPTY_STRING" validate:"required"`
70
+ NonZeroInt int `env:"NON_ZERO_INT" validate:"required"`
71
+ }
72
+
73
+ _ , err := Load [Config ]()
74
+ if err == nil {
75
+ t .Fatal ("expected error" )
76
+ }
77
+
78
+ errs := err .(validator.ValidationErrors )
79
+ if len (errs ) != 2 {
80
+ t .Fatalf ("expected 2 errors, got %d" , len (errs ))
81
+ }
43
82
44
- validate (t , "CONFIG1" , "value1" , cfg .Config1 )
45
- validate (t , "CONFIG2" , "" , cfg .Config2 )
83
+ validate (t , "NON_ZERO_INT" , "Config.NonEmptyString" , errs [0 ].StructNamespace ())
84
+ validate (t , "NON_EMPTY_STRING" , "Config.NonZeroInt" , errs [1 ].StructNamespace ())
85
+ })
46
86
}
47
87
48
88
func validate [T comparable ](t * testing.T , key string , expected T , got T ) {
0 commit comments