/
TDApiTest.go
85 lines (69 loc) · 1.84 KB
/
TDApiTest.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
package TDApiTest
import (
"github.com/jeanlebrument/TDApiTest/Godeps/_workspace/src/github.com/stretchr/testify/assert"
"io/ioutil"
"net/http"
"net/http/httptest"
"net/url"
"reflect"
"runtime"
"strings"
"testing"
)
type TestToRun struct {
Desc string
Header map[string]string
Params url.Values
Status int
TestFunc func(*testing.T, string)
}
type TestsToRun []TestToRun
type TestContainer struct {
Method string
Path string
TestsToRun TestsToRun
}
type TestContainers []TestContainer
type AbstractRouter interface {
ServeHTTP(http.ResponseWriter, *http.Request)
}
type TDApiTest struct {
router AbstractRouter
RespRec *httptest.ResponseRecorder
TestContainers TestContainers
}
func init() {
var _ assert.Assertions // Tricks for Godep to import packages needed by tests.
}
func NewTDApiTest(router AbstractRouter) *TDApiTest {
return &TDApiTest{router: router}
}
func (td *TDApiTest) beforeEach() {
td.RespRec = httptest.NewRecorder()
}
func (td *TDApiTest) RunTests(t *testing.T) {
for _, route := range td.TestContainers {
for _, testToRun := range route.TestsToRun {
req, err := http.NewRequest(route.Method, route.Path, nil)
funcName := runtime.FuncForPC(reflect.ValueOf(testToRun.TestFunc).Pointer()).Name()
assert.Nil(t, err)
req.Form = testToRun.Params
for k, v := range testToRun.Header {
req.Header.Set(k, v)
}
td.beforeEach()
if funcName != "" {
t.Logf("Executing test: %s, function called: %s", testToRun.Desc, funcName)
} else {
t.Logf("Executing test: %s", testToRun.Desc)
}
td.router.ServeHTTP(td.RespRec, req)
assert.Equal(t, testToRun.Status, td.RespRec.Code)
content, err := ioutil.ReadAll(td.RespRec.Body)
assert.Nil(t, err)
if testToRun.TestFunc != nil {
testToRun.TestFunc(t, strings.TrimSpace(string(content)))
}
}
}
}