-
Notifications
You must be signed in to change notification settings - Fork 2
/
request_test.go
116 lines (101 loc) · 2.68 KB
/
request_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
package outline
import (
"context"
"io"
"net"
"net/http"
"net/url"
"strings"
"testing"
"github.com/ioki-mobility/go-outline/internal/testutils"
"github.com/rsjethani/rsling"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_request_failed(t *testing.T) {
client := &http.Client{}
client.Transport = &testutils.MockRoundTripper{
RoundTripFn: func(req *http.Request) (*http.Response, error) {
return nil, &net.DNSError{} // simulate irrecoverable error
},
}
sl := rsling.New().Client(client)
ed, err := request(context.Background(), sl, nil)
assert.NotNil(t, err)
assert.Nil(t, ed)
}
func Test_request_returns_bad_response(t *testing.T) {
u, err := url.Parse("https://test.url")
require.NoError(t, err)
tests := map[string]struct {
body string
expected badResponse
}{
"4XX response": {
body: "HTTP 400",
expected: badResponse{
status: http.StatusBadRequest,
url: u.String(),
clientErr: "HTTP 400",
serverErr: "",
},
},
"5XX response": {
body: "HTTP 503",
expected: badResponse{
status: http.StatusServiceUnavailable,
url: u.String(),
clientErr: "",
serverErr: "HTTP 503",
},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
client := &http.Client{}
client.Transport = &testutils.MockRoundTripper{
RoundTripFn: func(req *http.Request) (*http.Response, error) {
return &http.Response{
Request: req,
StatusCode: test.expected.status,
ContentLength: -1,
Body: io.NopCloser(strings.NewReader(test.body)),
}, nil
},
}
sl := rsling.New().Client(client).Get(test.expected.url)
got, err := request(context.Background(), sl, nil)
assert.Nil(t, err)
assert.Equal(t, test.expected, *got)
})
}
}
func Test_request(t *testing.T) {
type testModel struct {
Field1 string `json:"field_1"`
Field2 float64 `json:"field_2"`
}
// Create HTTP client and override its transport to simulate server returning a good response with valid JSON data
// of testModel type.
client := &http.Client{}
client.Transport = &testutils.MockRoundTripper{
RoundTripFn: func(req *http.Request) (*http.Response, error) {
return &http.Response{
Request: req,
StatusCode: http.StatusOK,
ContentLength: -1,
Body: io.NopCloser(strings.NewReader(`{"field_1":"hello","field_2":5.5}`)),
}, nil
},
}
expected := &testModel{
Field1: "hello",
Field2: 5.5,
}
got := &testModel{}
sl := rsling.New().Client(client).Get("https://some.url")
ed, err := request(context.Background(), sl, got)
assert.Nil(t, err)
assert.Nil(t, ed)
assert.Equal(t, expected, got)
}