package testhelper import ( "encoding/json" "io/ioutil" "net/http" "net/http/httptest" "net/url" "reflect" "testing" ) var ( // Mux is a multiplexer that can be used to register handlers. Mux *http.ServeMux // Server is an in-memory HTTP server for testing. Server *httptest.Server ) // SetupHTTP prepares the Mux and Server. func SetupHTTP() { Mux = http.NewServeMux() Server = httptest.NewServer(Mux) } // TeardownHTTP releases HTTP-related resources. func TeardownHTTP() { Server.Close() } // Endpoint returns a fake endpoint that will actually target the Mux. func Endpoint() string { return Server.URL + "/" } // TestFormValues ensures that all the URL parameters given to the http.Request are the same as values. func TestFormValues(t *testing.T, r *http.Request, values map[string]string) { want := url.Values{} for k, v := range values { want.Add(k, v) } r.ParseForm() if !reflect.DeepEqual(want, r.Form) { t.Errorf("Request parameters = %v, want %v", r.Form, want) } } // TestMethod checks that the Request has the expected method (e.g. GET, POST). func TestMethod(t *testing.T, r *http.Request, expected string) { if expected != r.Method { t.Errorf("Request method = %v, expected %v", r.Method, expected) } } // TestHeader checks that the header on the http.Request matches the expected value. func TestHeader(t *testing.T, r *http.Request, header string, expected string) { if actual := r.Header.Get(header); expected != actual { t.Errorf("Header %s = %s, expected %s", header, actual, expected) } } // TestBody verifies that the request body matches an expected body. func TestBody(t *testing.T, r *http.Request, expected string) { b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read body: %v", err) } str := string(b) if expected != str { t.Errorf("Body = %s, expected %s", str, expected) } } // TestJSONRequest verifies that the JSON payload of a request matches an expected structure, without asserting things about // whitespace or ordering. func TestJSONRequest(t *testing.T, r *http.Request, expected string) { b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read request body: %v", err) } var actualJSON interface{} err = json.Unmarshal(b, &actualJSON) if err != nil { t.Errorf("Unable to parse request body as JSON: %v", err) } CheckJSONEquals(t, expected, actualJSON) }