|
|
package main
import ( "bytes" "fmt" "io/ioutil" "net/http" "strings"
"maunium.net/go/mautrix/id" )
// newResponse creates a new HTTP response with the given data.
func newResponse(statusCode int, body string) *http.Response { return &http.Response{ StatusCode: statusCode, Body: ioutil.NopCloser(bytes.NewBufferString(body)), } }
// matrixTripper mocks out RoundTrip and calls a registered handler instead.
type matrixTripper struct { handlers map[string]func(req *http.Request) (*http.Response, error) }
func newMatrixTripper() *matrixTripper { return &matrixTripper{ handlers: make(map[string]func(req *http.Request) (*http.Response, error)), } }
func (rt *matrixTripper) RoundTrip(req *http.Request) (*http.Response, error) { key := req.Method + " " + req.URL.Path if handler, ok := rt.handlers[key]; ok { return handler(req) } for strMatch, handler := range rt.handlers { // try to match key with wildcard handlers
if strMatch[len(strMatch)-1] == '*' && strings.HasPrefix(key, strMatch[:len(strMatch)-1]) { return handler(req) } } panic(fmt.Sprintf( "RoundTrip: Unhandled request: %s\nHandlers: %d", key, len(rt.handlers), )) }
func (rt *matrixTripper) Handle(method, path string, handler func(req *http.Request) (*http.Response, error)) { key := method + " " + path if _, exists := rt.handlers[key]; exists { panic(fmt.Sprintf("Test handler with key %s already exists", key)) } rt.handlers[key] = handler }
func (rt *matrixTripper) HandlePOSTFilter(userID id.UserID) { rt.Handle("POST", "/_matrix/client/r0/user/"+userID.String()+"/filter", func(req *http.Request) (*http.Response, error) { return newResponse(200, `{ "filter_id":"abcdef" }`), nil }, ) }
func (rt *matrixTripper) ClearHandlers() { for k := range rt.handlers { delete(rt.handlers, k) } }
|