Skip to content

Commit

Permalink
Merge pull request #124 from jarcoal/responders
Browse files Browse the repository at this point in the history
feat: add (*MockTransport).Responders() method
  • Loading branch information
maxatome committed Mar 13, 2022
2 parents a79634b + 9bab136 commit 0be0f8b
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 7 deletions.
39 changes: 36 additions & 3 deletions transport.go
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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,
Expand Down
28 changes: 24 additions & 4 deletions transport_test.go
Expand Up @@ -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) {
Expand Down

0 comments on commit 0be0f8b

Please sign in to comment.