-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhttpparser_test.go
158 lines (119 loc) · 4 KB
/
httpparser_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
package httpparser
import (
"bytes"
"context"
"encoding/json"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"io/ioutil"
"net/http"
"testing"
"time"
)
func mockDo(res *http.Response, errToReturn error) func(req *http.Request) (*http.Response, error) {
return func(req *http.Request) (*http.Response, error) {
return res, errToReturn
}
}
func marshall(v *map[string]interface{}, t interface{}) interface{} {
tempJSON, _ := json.Marshal(v)
json.Unmarshal(tempJSON, t)
return t
}
func TestHttpParser_JSONParse_normal(t *testing.T) {
type nameTest struct {
Name string
}
body := []byte(`{"name": "james"}`)
response := &http.Response{
Body: ioutil.NopCloser(bytes.NewBuffer(body)),
}
jsonparser := NewHTTPParser(nil, 30*time.Second)
jsonparser.Do = mockDo(response, nil)
resultInterface := &nameTest{} // placeholder for the result
request := &http.Request{} // empty request
response1, err := jsonparser.JSONParse(context.TODO(), request)
if err != nil {
t.Error(err)
}
responseStruct := &nameTest{}
marshall(response1, responseStruct)
json.Unmarshal(body, &resultInterface)
assert.Equal(t, responseStruct.Name, resultInterface.Name)
}
func TestHTTPParser_JSONParse_BadJsonFailure(t *testing.T) {
type nameTest struct {
Name string
}
body := []byte(`{"name":}`)
response := &http.Response{
Body: ioutil.NopCloser(bytes.NewBuffer(body)),
}
jsonparser := NewHTTPParser(nil, 30*time.Second)
jsonparser.Do = mockDo(response, nil)
resultInterface := &nameTest{} // placeholder for the result
request := &http.Request{} // empty request
response1, err := jsonparser.JSONParse(context.TODO(), request)
responseStruct := &nameTest{}
marshall(response1, responseStruct)
json.Unmarshal(body, &resultInterface)
assert.NotNil(t, err) // expecting Json parse failure, cannot be empty
assert.EqualError(t, err, "json parse failure")
assert.Equal(t, responseStruct.Name, resultInterface.Name)
}
func TestHTTPParser_JSONParse_BadHTTPCallFailure(t *testing.T) {
type nameTest struct {
Name string
}
body := []byte(`{}`)
response := &http.Response{
Body: ioutil.NopCloser(bytes.NewBuffer(body)),
}
jsonparser := NewHTTPParser(nil, 30*time.Second)
jsonparser.Do = mockDo(response, errors.New("mock http failure"))
resultInterface := &nameTest{} // placeholder for the result
request := &http.Request{} // empty request
response1, err := jsonparser.JSONParse(context.TODO(), request)
responseStruct := &nameTest{}
marshall(response1, responseStruct)
json.Unmarshal(body, &resultInterface)
assert.NotNil(t, err) // expecting Json parse failure, cannot be empty
assert.EqualError(t, err, "mock http failure")
assert.Equal(t, responseStruct.Name, resultInterface.Name)
}
func TestHTTPParser_HTTPGet_normal(t *testing.T) {
body := []byte(`{"name": "james"}`)
response := &http.Response{
Body: ioutil.NopCloser(bytes.NewBuffer(body)),
}
httpparser := NewHTTPParser(nil, 30*time.Second)
httpparser.Do = mockDo(response, nil)
request := &http.Request{} // empty request
result, err := httpparser.HTTPGet(context.TODO(), request)
assert.Nil(t, err)
assert.Equal(t, body, result)
}
func TestHTTPParser_HTTPGet_error(t *testing.T) {
body := []byte(`{"name": "james"}`)
response := &http.Response{
Body: ioutil.NopCloser(bytes.NewBuffer(body)),
}
httpparser := NewHTTPParser(nil, 30*time.Second)
httpparser.Do = mockDo(response, errors.New("mock error"))
request := &http.Request{} // empty request
result, err := httpparser.HTTPGet(context.TODO(), request)
assert.NotNil(t, err)
assert.NotEqual(t, body, result)
assert.Nil(t, result)
}
// this test requires internet connection.
func TestHTTPParser_HTTPGet_timeout(t *testing.T) {
body := []byte(`{"name": "james"}`)
req, _ := http.NewRequest("GET", "http://httpbin.org/delay/3", nil)
httpparser := NewHTTPParser(nil, 1*time.Second)
result, err := httpparser.HTTPGet(req.Context(), req)
// context deadline exceeded error should return
assert.NotNil(t, err)
assert.NotEqual(t, body, result)
assert.Nil(t, result)
}