-
Notifications
You must be signed in to change notification settings - Fork 0
/
env_test.go
162 lines (145 loc) · 2.93 KB
/
env_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package env_test
import (
"fmt"
"log"
"os"
"strings"
"testing"
"github.com/GeorgeNewby/env"
)
func Example() {
// .env file
// HOST=localhost
// PORT=8080
// Errors ignored for brevity
env.Load()
config := struct {
Host string `env:"HOST"`
Port int `env:"PORT"`
}{}
env.Unmarshal(&config)
fmt.Printf("HOST: %s\n", config.Host)
fmt.Printf("PORT: %d\n", config.Port)
// Output: HOST: localhost
// PORT: 8080
}
func TestLoad(t *testing.T) {
if err := env.Load(); err != nil {
log.Fatal(err)
}
host := os.Getenv("HOST")
if host != "localhost" {
t.Fatalf("HOST: expected localhost, got %s", host)
}
port := os.Getenv("PORT")
if port != "8080" {
t.Fatalf("PORT: expected 8080, got %s", port)
}
}
func TestParse(t *testing.T) {
tt := []struct {
Name string
Input string
Vars map[string]string
}{
{
Name: "Empty file",
Input: ``,
Vars: map[string]string{},
},
{
Name: "One variable",
Input: `FOO=foo`,
Vars: map[string]string{
"FOO": "foo",
},
},
{
Name: "Multiple variables",
Input: `
FOO=foo
BAR=bar
`,
Vars: map[string]string{
"FOO": "foo",
"BAR": "bar",
},
},
{
Name: "Variable with gaps",
Input: ` FOO = foo `,
Vars: map[string]string{
"FOO": "foo",
},
},
{
Name: "Comments",
Input: `
# This is a comment
FOO=foo
#BAR=bar
`,
Vars: map[string]string{
"FOO": "foo",
},
},
{
Name: "Variable with space",
Input: `FOO=foo bar`,
Vars: map[string]string{
"FOO": "foo bar",
},
},
}
for _, tc := range tt {
t.Run(tc.Name, func(t *testing.T) {
r := strings.NewReader(tc.Input)
if err := env.Parse(r); err != nil {
t.Fatalf("failed to parse: %v", err)
}
for k, v := range tc.Vars {
env, ok := os.LookupEnv(k)
if !ok {
t.Fatalf("var %s not set, expected %s", k, v)
}
if v != env {
t.Errorf("var %s expected %s, got %s", k, v, env)
}
}
})
}
}
func TestUnmarshal(t *testing.T) {
t.Run("Valid struct", func(t *testing.T) {
os.Setenv("STRING", "foo")
os.Setenv("INTEGER", "5")
os.Setenv("FLOAT_32", "51.432434")
os.Setenv("FLOAT_64", "51.43243344285539")
os.Setenv("BOOLEAN", "true")
s := struct {
String string `env:"STRING"`
Integer int `env:"INTEGER"`
Float32 float32 `env:"FLOAT_32"`
Float64 float32 `env:"FLOAT_64"`
Boolean bool `env:"BOOLEAN"`
}{}
if err := env.Unmarshal(&s); err != nil {
t.Fatalf("failed to unmarshal: %v", err)
}
if s.String != "foo" {
t.Errorf("STRING: expected foo, got %v", s.String)
}
if s.Integer != 5 {
t.Errorf("INTEGER: expected 5, got %v", s.Integer)
}
if s.Float32 != 51.432434 {
t.Errorf("FLOAT_32: expected 51.432434, got %v", s.Float32)
}
if s.Float64 != 51.43243344285539 {
t.Errorf("FLOAT_64: expected 51.43243344285539, got %v", s.Float64)
}
if s.Boolean != true {
t.Errorf("BOOLEAN: expected true, got %v", s.Boolean)
}
})
}