diff --git a/transport.go b/transport.go index 36b0f77..cefc826 100644 --- a/transport.go +++ b/transport.go @@ -274,12 +274,45 @@ func (m *MockTransport) RoundTrip(req *http.Request) (*http.Response, error) { } // NumResponders returns the number of responders currently in use. +// The responder registered with RegisterNoResponder() is not taken +// into account. func (m *MockTransport) NumResponders() int { m.mu.RLock() defer m.mu.RUnlock() return len(m.responders) + len(m.regexpResponders) } +// Responders returns the list of currently registered responders. +// Each responder is listed as a string containing "METHOD URL". +// Non-regexp responders are listed first in alphabetical order +// (sorted by URL then METHOD), then regexp responders in the order +// they have been registered. +// The responder registered with RegisterNoResponder() is not listed. +func (m *MockTransport) Responders() []string { + m.mu.RLock() + defer m.mu.RUnlock() + + rks := make([]internal.RouteKey, 0, len(m.responders)) + for rk := range m.responders { + rks = append(rks, rk) + } + sort.Slice(rks, func(i, j int) bool { + if rks[i].URL == rks[j].URL { + return rks[i].Method < rks[j].Method + } + return rks[i].URL < rks[j].URL + }) + + rs := make([]string, 0, len(m.responders)+len(m.regexpResponders)) + for _, rk := range rks { + rs = append(rs, rk.String()) + } + for _, rr := range m.regexpResponders { + rs = append(rs, rr.method+" "+rr.origRx) + } + return rs +} + func runCancelable(responder Responder, req *http.Request) (*http.Response, error) { ctx := req.Context() if req.Cancel == nil && ctx.Done() == nil { // nolint: staticcheck @@ -383,6 +416,7 @@ func (m *MockTransport) regexpResponderForKey(key internal.RouteKey) (Responder, func isRegexpURL(url string) bool { return strings.HasPrefix(url, regexpPrefix) } + func (m *MockTransport) checkMethod(method string) { if !m.DontCheckMethod && methodProbablyWrong(method) { panic(fmt.Sprintf("You probably want to use method %q instead of %q? If not and so want to disable this check, set MockTransport.DontCheckMethod field to true", @@ -726,9 +760,8 @@ func (m *MockTransport) GetCallCountInfo() map[string]int { // GetTotalCallCount returns the totalCallCount. func (m *MockTransport) GetTotalCallCount() int { m.mu.RLock() - count := m.totalCallCount - m.mu.RUnlock() - return count + defer m.mu.RUnlock() + return m.totalCallCount } // DefaultTransport is the default mock transport used by Activate, diff --git a/transport_test.go b/transport_test.go index 0a002c2..4eac350 100644 --- a/transport_test.go +++ b/transport_test.go @@ -124,15 +124,35 @@ func TestMockTransportReset(t *testing.T) { td.CmpZero(t, DefaultTransport.NumResponders(), "expected no responders at this point") - - RegisterResponder("GET", testURL, NewStringResponder(200, "hey")) - - td.Cmp(t, DefaultTransport.NumResponders(), 1, "expected one responder") + td.Cmp(t, DefaultTransport.Responders(), []string{}) + + r := NewStringResponder(200, "hey") + + RegisterResponder("GET", testURL, r) + RegisterResponder("POST", testURL, r) + RegisterResponder("PATCH", testURL, r) + RegisterResponder("GET", "/pipo/bingo", r) + + RegisterResponder("GET", "=~/pipo/bingo", r) + RegisterResponder("GET", "=~/bingo/pipo", r) + + td.Cmp(t, DefaultTransport.NumResponders(), 6, "expected one responder") + td.Cmp(t, DefaultTransport.Responders(), []string{ + // Sorted by URL then method + "GET /pipo/bingo", + "GET " + testURL, + "PATCH " + testURL, + "POST " + testURL, + // Regexp responders, in the same order they have been registered + "GET =~/pipo/bingo", + "GET =~/bingo/pipo", + }) Reset() td.CmpZero(t, DefaultTransport.NumResponders(), "expected no responders as they were just reset") + td.Cmp(t, DefaultTransport.Responders(), []string{}) } func TestMockTransportNoResponder(t *testing.T) {