@@ -2,59 +2,96 @@ package test_helpers
22
33import (
44 "bytes"
5+ "io"
56
67 "github.com/tarantool/go-tarantool/v3"
78)
89
10+ // MockDoer is an interface for a mock doer used for custom testing.
11+ // It allows building a sequence of responses and inspecting requests
12+ // that were sent via Do calls.
13+ type MockDoer interface {
14+ // AddResponse adds a response with a custom header and a body
15+ // packed inside an io.Reader and returns the MockDoer for chaining.
16+ AddResponse (header tarantool.Header , body io.Reader ) MockDoer
17+ // AddResponseRaw adds a response with an empty header and the given
18+ // data, which is encoded with msgpack, and returns the MockDoer for
19+ // chaining.
20+ AddResponseRaw (data interface {}) MockDoer
21+ // AddResponseError adds an error response and returns the MockDoer for
22+ // chaining.
23+ AddResponseError (err error ) MockDoer
24+ // Requests returns a slice of requests received via Do calls.
25+ Requests () []tarantool.Request
26+ // Do processes the request and returns a Future with the next
27+ // configured response or error. It calls Fatalf on the test if
28+ // no responses are configured.
29+ Do (req tarantool.Request ) tarantool.Future
30+ }
31+
932type doerResponse struct {
1033 resp * MockResponse
1134 err error
1235}
1336
14- // MockDoer is an implementation of the Doer interface
37+ // mockDoer is an implementation of the MockDoer interface
1538// used for testing purposes.
16- type MockDoer struct {
17- // Requests is a slice of received requests.
39+ type mockDoer struct {
40+ // requests is a slice of received requests.
1841 // It could be used to compare incoming requests with expected.
19- Requests []tarantool.Request
42+ requests []tarantool.Request
2043 responses []doerResponse
2144 t T
2245}
2346
24- // NewMockDoer creates a MockDoer by given responses.
25- // Each response could be one of two types: MockResponse or error.
26- func NewMockDoer (t T , responses ... interface {}) MockDoer {
27- t .Helper ()
47+ var _ MockDoer = (* mockDoer )(nil )
2848
29- mockDoer := MockDoer {t : t }
30- for _ , response := range responses {
31- doerResp := doerResponse {}
32-
33- switch resp := response .(type ) {
34- case * MockResponse :
35- doerResp .resp = resp
36- case error :
37- doerResp .err = resp
38- default :
39- t .Fatalf ("unsupported type: %T" , response )
40- }
49+ func (m * mockDoer ) Requests () []tarantool.Request {
50+ return m .requests
51+ }
4152
42- mockDoer .responses = append (mockDoer .responses , doerResp )
53+ func (m * mockDoer ) AddResponse (header tarantool.Header , data io.Reader ) MockDoer {
54+ resp , err := CreateMockResponse (header , data )
55+ if err != nil {
56+ m .t .Fatalf ("failed to create mock response: %v" , err )
4357 }
44- return mockDoer
58+
59+ m .responses = append (m .responses , doerResponse {resp : resp })
60+ return m
61+ }
62+
63+ func (m * mockDoer ) AddResponseRaw (data interface {}) MockDoer {
64+ m .responses = append (m .responses , doerResponse {resp : NewMockResponse (m .t , data )})
65+ return m
66+ }
67+
68+ func (m * mockDoer ) AddResponseError (err error ) MockDoer {
69+ m .responses = append (m .responses , doerResponse {err : err })
70+ return m
71+ }
72+
73+ // NewMockDoer creates a MockDoer for testing. Use AddResponse, AddResponseRaw,
74+ // and AddResponseError methods to configure the sequence of responses.
75+ func NewMockDoer (t T ) MockDoer {
76+ t .Helper ()
77+
78+ return & mockDoer {t : t }
4579}
4680
4781// Do returns a future with the current response or an error.
4882// It saves the current request into MockDoer.Requests.
49- func (doer * MockDoer ) Do (req tarantool.Request ) tarantool.Future {
50- doer .Requests = append (doer .Requests , req )
51-
83+ func (doer * mockDoer ) Do (req tarantool.Request ) tarantool.Future {
5284 mockReq := NewMockRequest ()
5385 var fut tarantool.Future
5486
5587 if len (doer .responses ) == 0 {
56- doer .t .Fatalf ("list of responses is empty" )
88+ doer .t .Fatalf ("MockDoer.Do: no responses configured, %d Do() calls were made" ,
89+ len (doer .requests ))
90+
91+ return fut
5792 }
93+
94+ doer .requests = append (doer .requests , req )
5895 response := doer .responses [0 ]
5996
6097 if response .err != nil {
0 commit comments