Skip to content

Commit a5102de

Browse files
committed
test: add unit tests for http server
1 parent 88ab1f1 commit a5102de

File tree

3 files changed

+229
-0
lines changed

3 files changed

+229
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package http
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/kilnfi/cardano-validator-watcher/internal/metrics"
9+
"github.com/prometheus/client_golang/prometheus"
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
func TestDefaultHandler(t *testing.T) {
15+
t.Parallel()
16+
17+
t.Run("GoodPath_DefaultHandlerIsOk", func(t *testing.T) {
18+
t.Parallel()
19+
20+
r := httptest.NewRequest(http.MethodGet, "/", nil)
21+
w := httptest.NewRecorder()
22+
23+
server, err := New(
24+
nil,
25+
)
26+
27+
require.NoError(t, err)
28+
server.router.ServeHTTP(w, r)
29+
assert.Equal(t, http.StatusMovedPermanently, w.Code)
30+
})
31+
32+
t.Run("GoodPath_DefaultHandlerShouldReturn404ForUnknownPath", func(t *testing.T) {
33+
t.Parallel()
34+
35+
r := httptest.NewRequest(http.MethodGet, "/fake", nil)
36+
w := httptest.NewRecorder()
37+
38+
server, err := New(
39+
nil,
40+
)
41+
42+
require.NoError(t, err)
43+
server.router.ServeHTTP(w, r)
44+
assert.Equal(t, http.StatusNotFound, w.Code)
45+
})
46+
}
47+
48+
func TestLiveProbe(t *testing.T) {
49+
t.Parallel()
50+
51+
t.Run("GoodPath_LiveProbeIsReady", func(t *testing.T) {
52+
t.Parallel()
53+
54+
r := httptest.NewRequest(http.MethodGet, "/livez", nil)
55+
w := httptest.NewRecorder()
56+
57+
server, err := New(
58+
nil,
59+
)
60+
require.NoError(t, err)
61+
server.router.ServeHTTP(w, r)
62+
63+
assert.Equal(t, http.StatusOK, w.Code)
64+
})
65+
}
66+
67+
func TestReadyProbe(t *testing.T) {
68+
t.Parallel()
69+
70+
t.Run("GoodPath_ReadyProbeIsReady", func(t *testing.T) {
71+
t.Parallel()
72+
73+
r := httptest.NewRequest(http.MethodGet, "/readyz", nil)
74+
w := httptest.NewRecorder()
75+
76+
server, err := New(
77+
nil,
78+
)
79+
require.NoError(t, err)
80+
server.router.ServeHTTP(w, r)
81+
82+
assert.Equal(t, http.StatusOK, w.Code)
83+
})
84+
}
85+
86+
func TestMetricsHandler(t *testing.T) {
87+
t.Parallel()
88+
89+
t.Run("GoodPath_MetricsHandlerIsOk", func(t *testing.T) {
90+
t.Parallel()
91+
92+
r := httptest.NewRequest(http.MethodGet, "/metrics", nil)
93+
w := httptest.NewRecorder()
94+
95+
registry := prometheus.NewRegistry()
96+
metrics := metrics.NewCollection()
97+
metrics.MustRegister(registry)
98+
99+
server, err := New(
100+
registry,
101+
)
102+
103+
require.NoError(t, err)
104+
server.router.ServeHTTP(w, r)
105+
assert.Equal(t, http.StatusOK, w.Code)
106+
})
107+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package http
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestWithHost(t *testing.T) {
12+
t.Parallel()
13+
14+
opts := &options{}
15+
err := WithHost("0.0.0.0")(opts)
16+
17+
require.NoError(t, err)
18+
assert.Equal(t, "0.0.0.0", opts.host)
19+
}
20+
21+
func TestWithPort(t *testing.T) {
22+
t.Parallel()
23+
24+
opts := &options{}
25+
err := WithPort(9090)(opts)
26+
27+
require.NoError(t, err)
28+
assert.Equal(t, 9090, opts.port)
29+
}
30+
31+
func TestWithTimeouts(t *testing.T) {
32+
t.Parallel()
33+
34+
opts := &options{}
35+
err := WithReadTimeout(15 * time.Second)(opts)
36+
require.NoError(t, err)
37+
38+
err = WithWriteTimeout(30 * time.Second)(opts)
39+
require.NoError(t, err)
40+
41+
assert.Equal(t, 15*time.Second, opts.readTimeout)
42+
assert.Equal(t, 30*time.Second, opts.writeTimeout)
43+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package http
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
var (
14+
DefaultReadTimeout = 15 * time.Second
15+
DefaultWriteTimeout = 30 * time.Second
16+
DefaultHost = "0.0.0.0"
17+
DefaultPort = 8000
18+
)
19+
20+
func TestNewServer(t *testing.T) {
21+
t.Parallel()
22+
23+
t.Run("WithOptions", func(t *testing.T) {
24+
t.Parallel()
25+
26+
server, err := New(
27+
nil,
28+
WithHost(DefaultHost),
29+
WithPort(DefaultPort),
30+
WithReadTimeout(DefaultReadTimeout),
31+
WithWriteTimeout(DefaultWriteTimeout),
32+
)
33+
34+
require.NoError(t, err)
35+
assert.Equal(t, DefaultHost, server.options.host)
36+
assert.Equal(t, DefaultPort, server.options.port)
37+
assert.Equal(t, DefaultReadTimeout, server.options.readTimeout)
38+
assert.Equal(t, DefaultWriteTimeout, server.options.writeTimeout)
39+
})
40+
t.Run("WithDefaultOptions", func(t *testing.T) {
41+
t.Parallel()
42+
43+
server, err := New(
44+
nil,
45+
WithHost(ServerDefaultHost),
46+
WithPort(ServerDefaultPort),
47+
WithReadTimeout(ServerDefaultReadTimeout),
48+
WithWriteTimeout(ServerDefaultWriteTimeout),
49+
)
50+
require.NoError(t, err)
51+
assert.Equal(t, ServerDefaultHost, server.options.host)
52+
assert.Equal(t, ServerDefaultPort, server.options.port)
53+
assert.Equal(t, ServerDefaultReadTimeout, server.options.readTimeout)
54+
assert.Equal(t, ServerDefaultWriteTimeout, server.options.writeTimeout)
55+
})
56+
}
57+
58+
func TestStartServer(t *testing.T) {
59+
t.Parallel()
60+
server, err := New(
61+
nil,
62+
WithHost(DefaultHost),
63+
WithPort(DefaultPort),
64+
WithReadTimeout(DefaultReadTimeout),
65+
WithWriteTimeout(DefaultWriteTimeout),
66+
)
67+
require.NoError(t, err)
68+
69+
go func() {
70+
ticker := time.NewTimer(time.Second * 30)
71+
<-ticker.C
72+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
73+
defer cancel()
74+
_ = server.Stop(ctx)
75+
}()
76+
77+
err = server.Start()
78+
require.ErrorIs(t, err, http.ErrServerClosed)
79+
}

0 commit comments

Comments
 (0)