-
Notifications
You must be signed in to change notification settings - Fork 10
/
RoundTripperMiddleware.go
83 lines (69 loc) · 2.37 KB
/
RoundTripperMiddleware.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
package httpspec
import (
"context"
"io"
"net/http"
"github.com/adamluzsi/testcase"
)
func ItBehavesLikeRoundTripperMiddleware(s *testcase.Spec, subject MakeRoundTripperFunc) {
testcase.RunSuite(s, RoundTripperMiddlewareContract{
Subject: subject,
MakeCTX: func(t *testcase.T) context.Context {
return context.Background()
},
})
}
type RoundTripperMiddlewareContract struct {
Subject MakeRoundTripperFunc
MakeCTX testcase.VarInit[context.Context]
}
type MakeRoundTripperFunc func(t *testcase.T, next http.RoundTripper) http.RoundTripper
func (c RoundTripperMiddlewareContract) Spec(s *testcase.Spec) {
s.Context(`it behaves like round-tripper`, func(s *testcase.Spec) {
next := testcase.Let(s, func(t *testcase.T) *RoundTripperDouble {
return &RoundTripperDouble{
RoundTripperFunc: func(r *http.Request) (*http.Response, error) {
return Response.Get(t), nil
},
}
})
subject := func(t *testcase.T) http.RoundTripper {
return c.Subject(t, next.Get(t))
}
var (
expectedBody = testcase.Let(s, func(t *testcase.T) string {
return t.Random.String()
})
request = testcase.Let(s, func(t *testcase.T) *http.Request {
r := OutboundRequest.Get(t)
r.Body = asIOReader(t, r.Header, expectedBody.Get(t))
return r
})
)
act := func(t *testcase.T) (*http.Response, error) {
return subject(t).RoundTrip(request.Get(t))
}
s.Test("round tripper act as a middleware in the round trip pipeline", func(t *testcase.T) {
response, err := act(t)
t.Must.Nil(err)
// just some sanity check
t.Must.Equal(Response.Get(t).StatusCode, response.StatusCode)
t.Must.Equal(Response.Get(t).Status, response.Status)
t.Must.ContainExactly(Response.Get(t).Header, response.Header)
})
s.Test("the next round tripper will receive the request", func(t *testcase.T) {
_, err := act(t)
t.Must.Nil(err)
t.Must.Equal(1, len(next.Get(t).ReceivedRequests),
"it should have received only one request")
receivedRequest := next.Get(t).LastReceivedRequest(t)
// just some sanity check
t.Must.Equal(request.Get(t).URL.String(), receivedRequest.URL.String())
t.Must.Equal(request.Get(t).Method, receivedRequest.Method)
t.Must.ContainExactly(request.Get(t).Header, receivedRequest.Header)
actualBody, err := io.ReadAll(receivedRequest.Body)
t.Must.Nil(err)
t.Must.Equal(expectedBody.Get(t), string(actualBody))
})
})
}