-
Notifications
You must be signed in to change notification settings - Fork 0
/
controller_test.go
101 lines (89 loc) · 2.83 KB
/
controller_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
package stgin
import (
"fmt"
"net/http"
"net/url"
"testing"
"time"
)
type msg struct {
Message string `json:"message"`
}
var ping Route = GET("/ping", func(_ RequestContext) Status {
return Ok(Json(&msg{Message: "PONG!"}))
})
func TestNewController(t *testing.T) {
controller := NewController("TestSuite", "test")
if controller.Name != "TestSuite" || controller.prefix != "/test/" {
t.Error("controller configuration mismatch")
}
}
func TestControllerListeners(t *testing.T) {
var apiLogToTerminalString string
var dummyQuery string
var statusIncrementor ResponseListener = func(status Status) Status {
status.StatusCode = status.StatusCode + 1
return status
}
var addDummyQuery RequestListener = func(request RequestContext) RequestContext {
request.QueryParams = Queries{map[string][]string{"dummy": {"yes"}}}
return request
}
var addApiLog APIListener = func(request RequestContext, status Status) {
apiLogToTerminalString = fmt.Sprintf("request with path %v completed with status %d", request.Url, status.StatusCode)
dummyQuery = request.QueryParams.MustGet("dummy")
}
controller := NewController("TestSuite", "/test")
controller.AddRoutes(ping)
controller.AddRequestListeners(addDummyQuery)
controller.AddResponseListener(statusIncrementor)
controller.AddAPIListeners(addApiLog)
uri, _ := url.Parse("/test/ping")
rawRequest := http.Request{
Method: "GET",
URL: uri,
RequestURI: "/test/ping",
}
res := controller.executeInternal(&rawRequest)
if res.StatusCode != 201 {
t.Fatalf("response listener could not mutate api response")
}
time.Sleep(200 * time.Millisecond) // since api listeners are now executed async, we should wait a little :)
expectedLog := fmt.Sprintf("request with path %v completed with status %d", "/test/ping", 201)
if apiLogToTerminalString != expectedLog {
t.Fatalf("api listener did not work properly")
}
if dummyQuery != "yes" {
t.Fatalf("request listener did not work properly")
}
if res.Entity.ContentType() != "application/json" {
t.Fatal("content type is not as expected")
}
}
func TestController_Timeout(t *testing.T) {
controller := NewController("Timeout controller", "")
timeConsumingTask := func(request RequestContext) Status {
time.Sleep(1 * time.Second)
return Ok(Empty())
}
timeout := 200 * time.Millisecond
controller.AddRoutes(GET("/timeout", timeConsumingTask))
controller.SetTimeout(timeout)
result := controller.executeInternal(mkDummyRequest("/timeout"))
if result.StatusCode != http.StatusRequestTimeout {
t.Fatalf("controller could not interrupt")
}
}
func BenchmarkPing(b *testing.B) {
controller := NewController("Test", "")
controller.AddRoutes(ping)
uri, _ := url.Parse("/ping")
req := http.Request{
Method: "GET",
URL: uri,
RequestURI: "/ping",
}
for i := 0; i < b.N; i++ {
controller.executeInternal(&req)
}
}