Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add (*MockTransport).Responders() method #124

Merged
merged 1 commit into from Mar 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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