Skip to content

Commit a692c96

Browse files
committed
add tests
1 parent 61d9f83 commit a692c96

File tree

9 files changed

+306
-40
lines changed

9 files changed

+306
-40
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fresh: clean build
3434

3535

3636
test:
37-
go test -race -v -covermode=atomic --coverprofile=coverage.txt ./...
37+
go test -race -count=1 -v --coverprofile=coverage.txt ./...
3838
go tool cover -func coverage.txt | grep total
3939

4040
cov: test

config/config_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package config
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestConfig(t *testing.T) {
10+
t.Run("inMemory config", func(t *testing.T) {
11+
defer setupEnv(t, "SERVER_STORAGE", "memory")()
12+
config := New()
13+
14+
assert.NotNil(t, config)
15+
assert.Equal(t, "", config.RedisConfig.ConnectionString)
16+
})
17+
t.Run("redis config", func(t *testing.T) {
18+
defer setupEnv(t, "SERVER_STORAGE", "redis")()
19+
defer setupEnv(t, "REDIS_CONNECTION_STRING", "redis")()
20+
config := New()
21+
22+
assert.NotNil(t, config)
23+
assert.Equal(t, "redis", config.RedisConfig.ConnectionString)
24+
})
25+
}

config/helpers.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func getEnv(key, defaultVal string) string {
2626
}
2727

2828
if defaultVal == "" {
29-
log.Fatal().Msgf("%s is not set", key)
29+
log.Panic().Msgf("%s is not set", key)
3030
}
3131

3232
return defaultVal
@@ -53,7 +53,7 @@ func getEnvAsLogLevel(key string) zerolog.Level {
5353
func getEnvAsSlice(key string) []string {
5454
strSlice, _ := os.LookupEnv(key)
5555
if strSlice == "" {
56-
return nil
56+
log.Panic().Msgf("%s is not set", key)
5757
}
5858

5959
return strings.Split(strSlice, ",")
@@ -65,7 +65,7 @@ func getEnvAsInt(key, defaultVal string) int {
6565
if err != nil {
6666
value, err = strconv.Atoi(defaultVal)
6767
if err != nil {
68-
log.Fatal().Msgf("Key: %v not an int. DefaultValue: %v also not an int", key, defaultVal)
68+
log.Panic().Msgf("Key: %v not an int. DefaultValue: %v also not an int", key, defaultVal)
6969
}
7070
}
7171

@@ -79,7 +79,7 @@ func getEnvAsFloat(key, defaultVal string) float64 {
7979
if err != nil {
8080
value, err = strconv.ParseFloat(defaultVal, bitSize)
8181
if err != nil {
82-
log.Fatal().Msgf("Key: %v not an int. DefaultValue: %v also not an int", key, defaultVal)
82+
log.Panic().Msgf("Key: %v not an int. DefaultValue: %v also not an int", key, defaultVal)
8383
}
8484
}
8585

@@ -92,7 +92,7 @@ func getEnvAsBool(key, defaultVal string) bool {
9292
if err != nil {
9393
value, err = strconv.ParseBool(defaultVal)
9494
if err != nil {
95-
log.Fatal().Msgf("Key: %v not a bool. DefaultValue: %v also not a bool", key, defaultVal)
95+
log.Panic().Msgf("Key: %v not a bool. DefaultValue: %v also not a bool", key, defaultVal)
9696
}
9797
}
9898

@@ -103,7 +103,7 @@ func getEnvAsURL(key, defaultVal string) *url.URL {
103103
valueStr := getEnv(key, defaultVal)
104104
downstreamURL, err := url.Parse(valueStr)
105105
if err != nil {
106-
log.Fatal().Msgf("Could not parse downstream url: %s", downstreamURL)
106+
log.Panic().Msgf("Could not parse downstream url: %s", downstreamURL)
107107
}
108108

109109
return downstreamURL

config/helpers_test.go

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package config
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/rs/zerolog"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func unsetEnv(t *testing.T, envVar string) func() {
12+
t.Log("unset Envs")
13+
env := os.Getenv(envVar)
14+
os.Unsetenv(envVar)
15+
16+
return func() {
17+
t.Log("set Env")
18+
os.Setenv(envVar, env)
19+
}
20+
}
21+
22+
func setupEnv(t *testing.T, envVar, value string) func() {
23+
t.Log("setup Envs")
24+
env := os.Getenv(envVar)
25+
os.Setenv(envVar, value)
26+
27+
return func() {
28+
t.Log("unset Env")
29+
os.Setenv(envVar, env)
30+
}
31+
}
32+
33+
func TestConfigHelpers(t *testing.T) {
34+
t.Run("getEnv", func(t *testing.T) {
35+
t.Run("should return the default value if env not set", func(t *testing.T) {
36+
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
37+
got := getEnv("SERVER_LOG_LEVEL", "warn")
38+
39+
assert.Equal(t, "warn", got)
40+
})
41+
t.Run("should panic if env and default value not set", func(t *testing.T) {
42+
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
43+
44+
assert.Panics(t, func() {
45+
getEnv("SERVER_LOG_LEVEL", "")
46+
})
47+
})
48+
})
49+
t.Run("getEnvAsLogLevel", func(t *testing.T) {
50+
t.Run("should default to warn if no logLevel set", func(t *testing.T) {
51+
defer unsetEnv(t, "SERVER_LOG_LEVEL")()
52+
got := getEnvAsLogLevel("SERVER_LOG_LEVEL")
53+
54+
assert.Equal(t, zerolog.WarnLevel, got)
55+
})
56+
t.Run("should set logLevel from environment", func(t *testing.T) {
57+
defer setupEnv(t, "SERVER_LOG_LEVEL", "info")()
58+
got := getEnvAsLogLevel("SERVER_LOG_LEVEL")
59+
60+
assert.Equal(t, zerolog.InfoLevel, got)
61+
})
62+
})
63+
t.Run("getEnvAsSlice", func(t *testing.T) {
64+
t.Run("should return a slice from env", func(t *testing.T) {
65+
defer setupEnv(t, "CACHE_HASH_QUERY_IGNORE", "test,case")()
66+
got := getEnvAsSlice("CACHE_HASH_QUERY_IGNORE")
67+
68+
assert.Equal(t, []string{"test", "case"}, got)
69+
})
70+
t.Run("should panic if env value not set", func(t *testing.T) {
71+
defer unsetEnv(t, "CACHE_HASH_QUERY_IGNORE")()
72+
73+
assert.Panics(t, func() {
74+
getEnvAsSlice("CACHE_HASH_QUERY_IGNORE")
75+
})
76+
})
77+
})
78+
t.Run("getEnvAsInt", func(t *testing.T) {
79+
t.Run("should return an int from env", func(t *testing.T) {
80+
defer setupEnv(t, "TEST", "10")()
81+
got := getEnvAsInt("TEST", "")
82+
83+
assert.Equal(t, 10, got)
84+
})
85+
t.Run("should return default value if not found in env", func(t *testing.T) {
86+
defer unsetEnv(t, "TEST")()
87+
got := getEnvAsInt("TEST", "20")
88+
89+
assert.Equal(t, 20, got)
90+
})
91+
t.Run("should panic if not in env and no default value", func(t *testing.T) {
92+
defer unsetEnv(t, "TEST")()
93+
94+
assert.Panics(t, func() {
95+
getEnvAsInt("TEST", "")
96+
})
97+
})
98+
})
99+
t.Run("getEnvAsFloat", func(t *testing.T) {
100+
t.Run("should return a float from env", func(t *testing.T) {
101+
defer setupEnv(t, "TEST", "10")()
102+
got := getEnvAsFloat("TEST", "")
103+
104+
assert.Equal(t, 10.0, got)
105+
})
106+
t.Run("should return default value if not found in env", func(t *testing.T) {
107+
defer unsetEnv(t, "TEST")()
108+
got := getEnvAsFloat("TEST", "20.0")
109+
110+
assert.Equal(t, 20.0, got)
111+
})
112+
t.Run("should panic if not in env and no default value", func(t *testing.T) {
113+
defer unsetEnv(t, "TEST")()
114+
115+
assert.Panics(t, func() {
116+
getEnvAsFloat("TEST", "")
117+
})
118+
})
119+
})
120+
t.Run("getEnvAsBool", func(t *testing.T) {
121+
t.Run("should return a bool from env", func(t *testing.T) {
122+
defer setupEnv(t, "TEST", "true")()
123+
got := getEnvAsBool("TEST", "")
124+
125+
assert.Equal(t, true, got)
126+
})
127+
t.Run("should return default value if not found in env", func(t *testing.T) {
128+
defer unsetEnv(t, "TEST")()
129+
got := getEnvAsBool("TEST", "false")
130+
131+
assert.Equal(t, false, got)
132+
})
133+
t.Run("should panic if not in env and no default value", func(t *testing.T) {
134+
defer unsetEnv(t, "TEST")()
135+
136+
assert.Panics(t, func() {
137+
getEnvAsBool("TEST", "")
138+
})
139+
})
140+
})
141+
t.Run("getEnvAsURL", func(t *testing.T) {
142+
t.Run("should return an URL from env", func(t *testing.T) {
143+
defer setupEnv(t, "TEST", "http://test.is")()
144+
got := getEnvAsURL("TEST", "")
145+
146+
assert.Equal(t, "test.is", got.Host)
147+
})
148+
t.Run("should return default value as URL if not found in env", func(t *testing.T) {
149+
defer unsetEnv(t, "TEST")()
150+
got := getEnvAsURL("TEST", "http://test.de")
151+
152+
assert.Equal(t, "test.de", got.Host)
153+
})
154+
t.Run("should panic if not found in env and no default value", func(t *testing.T) {
155+
defer unsetEnv(t, "TEST")()
156+
157+
assert.Panics(t, func() {
158+
getEnvAsURL("TEST", "")
159+
})
160+
})
161+
})
162+
}

pkg/http/cache.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,11 @@ func (h handler) cacheResponse(ctx context.Context, hashKey string) func(*http.R
189189
// please see the proxy.ModifyResponse documentation for more information
190190
logger := log.Ctx(ctx)
191191

192-
logger.Debug().Msg("Got response from downstream service")
192+
logger.Debug().Msg("got response from downstream service")
193193
h.metricsCollector.CacheMiss(response.Request.Method, response.StatusCode)
194194

195195
if response.StatusCode >= http.StatusInternalServerError {
196-
logger.Warn().Msg("Won't cache 5XX downstream responses")
196+
logger.Warn().Msg("won't cache 5XX downstream responses")
197197

198198
return nil
199199
}
@@ -203,7 +203,7 @@ func (h handler) cacheResponse(ctx context.Context, hashKey string) func(*http.R
203203
if response.Header.Get("content-encoding") == "gzip" {
204204
reader, err := gzip.NewReader(response.Body)
205205
if err != nil {
206-
logger.Error().Err(err).Msg("Error occurred creating gzip reader")
206+
logger.Error().Err(err).Msg("error occurred creating gzip reader")
207207

208208
return nil
209209
}
@@ -213,7 +213,7 @@ func (h handler) cacheResponse(ctx context.Context, hashKey string) func(*http.R
213213
}
214214

215215
if readErr != nil {
216-
logger.Error().Err(readErr).Msg("Error occurred reading response body")
216+
logger.Error().Err(readErr).Msg("error occurred reading response body")
217217

218218
return nil
219219
}
@@ -227,7 +227,7 @@ func (h handler) cacheResponse(ctx context.Context, hashKey string) func(*http.R
227227
entry := model.Response{Body: body, Header: header, Status: statusCode}
228228

229229
if err := h.cacher.Store(ctx, hashKey, &entry); err != nil {
230-
logger.Error().Err(err).Msg("Error occurred storing response in memory")
230+
logger.Error().Err(err).Msg("error occurred storing response in memory")
231231

232232
return nil
233233
}

pkg/http/cache_test.go

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func mustURL(t *testing.T, downstreamURL string) *url.URL {
6565

6666
func TestCacheHandler(t *testing.T) {
6767
ctrl := gomock.NewController(t)
68-
defer ctrl.Finish()
68+
// defer ctrl.Finish()
6969

7070
proxied := http.StatusUseProxy
7171
endpoint := "/status/200?q=1"
@@ -88,6 +88,30 @@ func TestCacheHandler(t *testing.T) {
8888
req *http.Request
8989
want int
9090
}{
91+
{
92+
name: "cacheLookup error should still forward request to downstream and store response",
93+
handler: handler{
94+
cfg: config.CacheConfig{
95+
DownstreamHost: mustURL(t, downstreamServer.URL),
96+
},
97+
cacher: func() Cacher {
98+
mock := NewMockCacher(ctrl)
99+
mock.EXPECT().LookUp(gomock.Any(), gomock.Any()).Return(nil, errors.New("test-error"))
100+
mock.EXPECT().Store(gomock.Any(), gomock.Any(), gomock.Any())
101+
102+
return mock
103+
}(),
104+
metricsCollector: func() MetricsCollector {
105+
mock := NewMockMetricsCollector(ctrl)
106+
mock.EXPECT().CacheMiss("GET", proxied)
107+
108+
return mock
109+
}(),
110+
},
111+
112+
req: mustRequest(t, endpoint, ""),
113+
want: proxied,
114+
},
91115
{
92116
name: "cache miss",
93117
handler: handler{
@@ -267,14 +291,15 @@ func TestCacheHandler(t *testing.T) {
267291
mock.EXPECT().LookUp(gomock.Any(), gomock.Any()).Return(&model.Response{
268292
Status: http.StatusOK,
269293
Body: []byte("hello"),
270-
}, nil).Times(1)
271-
mock.EXPECT().Store(gomock.Any(), gomock.Any(), gomock.Any()).Times(0)
294+
}, nil)
295+
// mock.EXPECT().Store(gomock.Any(), gomock.Any(), gomock.Any())
272296

273297
return mock
274298
}(),
275299
metricsCollector: func() MetricsCollector {
276300
mock := NewMockMetricsCollector(ctrl)
277-
mock.EXPECT().CacheHit("GET", http.StatusOK).Times(1)
301+
mock.EXPECT().CacheHit("GET", http.StatusOK)
302+
// mock.EXPECT().CacheMiss("GET", proxied)
278303

279304
return mock
280305
}(),
@@ -283,30 +308,6 @@ func TestCacheHandler(t *testing.T) {
283308
req: mustRequest(t, endpoint, ""),
284309
want: http.StatusOK,
285310
},
286-
{
287-
name: "cacheLookup error should still forward request to downstream",
288-
handler: handler{
289-
cfg: config.CacheConfig{
290-
DownstreamHost: mustURL(t, downstreamServer.URL),
291-
},
292-
cacher: func() Cacher {
293-
mock := NewMockCacher(ctrl)
294-
mock.EXPECT().LookUp(gomock.Any(), gomock.Any()).Return(nil, errors.New("test-error")).Times(1)
295-
mock.EXPECT().Store(gomock.Any(), gomock.Any(), gomock.Any()).Times(1)
296-
297-
return mock
298-
}(),
299-
metricsCollector: func() MetricsCollector {
300-
mock := NewMockMetricsCollector(ctrl)
301-
mock.EXPECT().CacheMiss("GET", proxied).Times(1)
302-
303-
return mock
304-
}(),
305-
},
306-
307-
req: mustRequest(t, endpoint, ""),
308-
want: proxied,
309-
},
310311
}
311312

312313
for _, tt := range tests {

0 commit comments

Comments
 (0)