-
Notifications
You must be signed in to change notification settings - Fork 0
/
main_test.go
161 lines (130 loc) · 4.75 KB
/
main_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
//main_test.go
package main
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func TestHandler(t *testing.T) {
//Here, we form a new HTTP request. This is the request that's going to be
// passed to our handler.
// The first argument is the method, the second argument is the route (which
//we leave blank for now, and will get back to soon), and the third is the
//request body, which we don't have in this case.
req, err := http.NewRequest("GET", "", nil)
// In case there is an error in forming the request, we fail and stop the test
if err != nil {
t.Fatal(err)
}
// We use Go's httptest library to create an http recorder. This recorder
// will act as the target of our http request
// (you can think of it as a mini-browser, which will accept the result of
// the http request that we make)
recorder := httptest.NewRecorder()
// Create an HTTP handler from our handler function. "handler" is the handler
// function defined in our main.go file that we want to test
hf := http.HandlerFunc(handler)
// Serve the HTTP request to our recorder. This is the line that actually
// executes our the handler that we want to test
hf.ServeHTTP(recorder, req)
// Check the status code is what we expect.
if status := recorder.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
// Check the response body is what we expect.
expected := `Hello World!`
actual := recorder.Body.String()
if actual != expected {
t.Errorf("handler returned unexpected body: got %v want %v", actual, expected)
}
}
func TestRouter(t *testing.T) {
// Instantiate the router using the constructor function that
// we defined previously
r := newRouter()
// Create a new server using the "httptest" libraries `NewServer` method
// Documentation : https://golang.org/pkg/net/http/httptest/#NewServer
mockServer := httptest.NewServer(r)
// The mock server we created runs a server and exposes its location in the
// URL attribute
// We make a GET request to the "hello" route we defined in the router
resp, err := http.Get(mockServer.URL + "/hello")
// Handle any unexpected error
if err != nil {
t.Fatal(err)
}
// We want our status to be 200 (ok)
if resp.StatusCode != http.StatusOK {
t.Errorf("Status should be ok, got %d", resp.StatusCode)
}
// In the next few lines, the response body is read, and converted to a string
defer resp.Body.Close()
// read the body into a bunch of bytes (b)
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal(err)
}
// convert the bytes to a string
respString := string(b)
expected := "Hello World!"
// We want our response to match the one defined in our handler.
// If it does happen to be "Hello world!", then it confirms, that the
// route is correct
if respString != expected {
t.Errorf("Response should be %s, got %s", expected, respString)
}
}
func TestRouterForBadRoute(t *testing.T) {
// Instantiate the router using the constructor function that
// we defined previously
r := newRouter()
// Create a new server using the "httptest" libraries `NewServer` method
// Documentation : https://golang.org/pkg/net/http/httptest/#NewServer
mockServer := httptest.NewServer(r)
// We make a POST request to the "hello" route we defined in the router
resp, err := http.Post(mockServer.URL+"/hello", "", nil)
// Handle any unexpected error
if err != nil {
t.Fatal(err)
}
// We want our status to be 405 (ok)
if resp.StatusCode != http.StatusMethodNotAllowed {
t.Errorf("Status should be ok, got %d", resp.StatusCode)
}
// In the next few lines, the response body is read, and converted to a string
defer resp.Body.Close()
// read the body into a bunch of bytes (b)
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal(err)
}
// convert the bytes to a string
respString := string(b)
expected := ""
if respString != expected {
t.Errorf("Response should be %s, got %s", expected, respString)
}
}
func TestStaticFileServer(t *testing.T) {
r := newRouter()
mockServer := httptest.NewServer(r)
// We want to hit the `GET /assets/` route to get the index.html file response
resp, err := http.Get(mockServer.URL + "/assets/")
if err != nil {
t.Fatal(err)
}
// We want our status to be 200 (ok)
if resp.StatusCode != http.StatusOK {
t.Errorf("Status should be 200, got %d", resp.StatusCode)
}
// It isn't wise to test the entire content of the HTML file.
// Instead, we test that the content-type header is "text/html; charset=utf-8"
// so that we know that an html file has been served
contentType := resp.Header.Get("Content-Type")
expectedContentType := "text/html; charset=utf-8"
if expectedContentType != contentType {
t.Errorf("Wrong content type, expected %s, got %s", expectedContentType, contentType)
}
}