@@ -27,70 +27,97 @@ type Request struct {
27
27
JSONRaw string
28
28
}
29
29
30
- // Handler is used with a [httptest.Server] to mock http requests provided by the user.
31
- //
32
- // Request matching is based on the request count, and the user provided request will be
33
- // iterated over.
30
+ // Handler is using a [Server] to mock http requests provided by the user.
34
31
func Handler (t * testing.T , requests []Request ) http.HandlerFunc {
35
32
t .Helper ()
36
33
37
- index := 0
34
+ server := NewServer (t , requests )
35
+ t .Cleanup (server .close )
38
36
39
- t .Cleanup (func () {
40
- assert .EqualValues (t , len (requests ), index , "expected more calls" )
41
- })
37
+ return server .handler
38
+ }
42
39
43
- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
44
- if testing .Verbose () {
45
- t .Logf ("call %d: %s %s\n " , index , r .Method , r .RequestURI )
46
- }
40
+ // NewServer returns a new mock server that closes itself at the end of the test.
41
+ func NewServer (t * testing.T , requests []Request ) * Server {
42
+ t .Helper ()
47
43
48
- if index >= len ( requests ) {
49
- t . Fatalf ( "received unknown call %d" , index )
50
- }
44
+ o := & Server { t : t }
45
+ o . Server = httptest . NewServer ( http . HandlerFunc ( o . handler ) )
46
+ t . Cleanup ( o . close )
51
47
52
- expected := requests [ index ]
48
+ o . Expect ( requests )
53
49
54
- expectedCall := expected .Method
55
- foundCall := r .Method
56
- if expected .Path != "" {
57
- expectedCall += " " + expected .Path
58
- foundCall += " " + r .RequestURI
59
- }
60
- require .Equal (t , expectedCall , foundCall )
50
+ return o
51
+ }
61
52
62
- if expected .Want != nil {
63
- expected .Want (t , r )
64
- }
53
+ // Server embeds a [httptest.Server] that answers HTTP calls with a list of expected [Request].
54
+ //
55
+ // Request matching is based on the request count, and the user provided request will be
56
+ // iterated over.
57
+ //
58
+ // A Server must be created using the [NewServer] function.
59
+ type Server struct {
60
+ * httptest.Server
65
61
66
- switch {
67
- case expected .JSON != nil :
68
- w .Header ().Set ("Content-Type" , "application/json" )
69
- w .WriteHeader (expected .Status )
70
- if err := json .NewEncoder (w ).Encode (expected .JSON ); err != nil {
71
- t .Fatal (err )
72
- }
73
- case expected .JSONRaw != "" :
74
- w .Header ().Set ("Content-Type" , "application/json" )
75
- w .WriteHeader (expected .Status )
76
- _ , err := w .Write ([]byte (expected .JSONRaw ))
77
- if err != nil {
78
- t .Fatal (err )
79
- }
80
- default :
81
- w .WriteHeader (expected .Status )
82
- }
62
+ t * testing.T
83
63
84
- index ++
85
- })
64
+ requests [] Request
65
+ index int
86
66
}
87
67
88
- // Server is a [httptest.Server] wrapping a [Handler] that closes itself at the end of the test.
89
- func Server (t * testing.T , requests []Request ) * httptest.Server {
90
- t .Helper ()
68
+ // Expect adds requests to the list of requests expected by the [Server].
69
+ func (m * Server ) Expect (requests []Request ) {
70
+ m .requests = append (m .requests , requests ... )
71
+ }
72
+
73
+ func (m * Server ) close () {
74
+ m .t .Helper ()
91
75
92
- server := httptest .NewServer (Handler (t , requests ))
93
- t .Cleanup (server .Close )
76
+ m .Server .Close ()
77
+
78
+ assert .EqualValues (m .t , len (m .requests ), m .index , "expected more calls" )
79
+ }
80
+
81
+ func (m * Server ) handler (w http.ResponseWriter , r * http.Request ) {
82
+ if testing .Verbose () {
83
+ m .t .Logf ("call %d: %s %s\n " , m .index , r .Method , r .RequestURI )
84
+ }
85
+
86
+ if m .index >= len (m .requests ) {
87
+ m .t .Fatalf ("received unknown call %d" , m .index )
88
+ }
89
+
90
+ expected := m .requests [m .index ]
91
+
92
+ expectedCall := expected .Method
93
+ foundCall := r .Method
94
+ if expected .Path != "" {
95
+ expectedCall += " " + expected .Path
96
+ foundCall += " " + r .RequestURI
97
+ }
98
+ require .Equal (m .t , expectedCall , foundCall )
99
+
100
+ if expected .Want != nil {
101
+ expected .Want (m .t , r )
102
+ }
103
+
104
+ switch {
105
+ case expected .JSON != nil :
106
+ w .Header ().Set ("Content-Type" , "application/json" )
107
+ w .WriteHeader (expected .Status )
108
+ if err := json .NewEncoder (w ).Encode (expected .JSON ); err != nil {
109
+ m .t .Fatal (err )
110
+ }
111
+ case expected .JSONRaw != "" :
112
+ w .Header ().Set ("Content-Type" , "application/json" )
113
+ w .WriteHeader (expected .Status )
114
+ _ , err := w .Write ([]byte (expected .JSONRaw ))
115
+ if err != nil {
116
+ m .t .Fatal (err )
117
+ }
118
+ default :
119
+ w .WriteHeader (expected .Status )
120
+ }
94
121
95
- return server
122
+ m . index ++
96
123
}
0 commit comments