Skip to content
Snippets Groups Projects
Commit c4135f95 authored by Will McCutchen's avatar Will McCutchen
Browse files

Simpler, unified redirect tests

parent f250bba4
No related branches found
No related tags found
No related merge requests found
......@@ -735,130 +735,72 @@ func TestResponseHeaders__OverrideContentType(t *testing.T) {
assertContentType(t, w, contentType)
}
func TestRedirect__OK(t *testing.T) {
func TestRedirects__OK(t *testing.T) {
var tests = []struct {
relative bool
n int
location string
requestURL string
expectedLocation string
}{
{true, 1, "/get"},
{true, 2, "/relative-redirect/1"},
{true, 100, "/relative-redirect/99"},
{"/redirect/1", "/get"},
{"/redirect/2", "/relative-redirect/1"},
{"/redirect/100", "/relative-redirect/99"},
{false, 1, "http://host/get"},
{false, 2, "http://host/absolute-redirect/1"},
{false, 100, "http://host/absolute-redirect/99"},
}
for _, test := range tests {
u := fmt.Sprintf("/redirect/%d", test.n)
if !test.relative {
u = fmt.Sprintf("%s?absolute=true", u)
}
r, _ := http.NewRequest("GET", u, nil)
r.Host = "host"
w := httptest.NewRecorder()
handler.ServeHTTP(w, r)
assertStatusCode(t, w, http.StatusFound)
assertHeader(t, w, "Location", test.location)
}
}
func TestRedirect__Errors(t *testing.T) {
var tests = []struct {
relative bool
given interface{}
status int
}{
{true, 3.14, http.StatusBadRequest},
{true, -1, http.StatusBadRequest},
{true, "", http.StatusBadRequest},
{true, "foo", http.StatusBadRequest},
{true, "10/bar", http.StatusNotFound},
{false, 3.14, http.StatusBadRequest},
{false, -1, http.StatusBadRequest},
{false, "", http.StatusBadRequest},
{false, "foo", http.StatusBadRequest},
{false, "10/bar", http.StatusNotFound},
}
{"/redirect/1?absolute=true", "http://host/get"},
{"/redirect/2?absolute=TRUE", "http://host/absolute-redirect/1"},
{"/redirect/100?absolute=True", "http://host/absolute-redirect/99"},
for _, test := range tests {
u := fmt.Sprintf("/redirect/%v", test.given)
if !test.relative {
u = fmt.Sprintf("%s?absolute=true", u)
}
r, _ := http.NewRequest("GET", u, nil)
w := httptest.NewRecorder()
handler.ServeHTTP(w, r)
{"/redirect/100?absolute=t", "/relative-redirect/99"},
{"/redirect/100?absolute=1", "/relative-redirect/99"},
{"/redirect/100?absolute=yes", "/relative-redirect/99"},
assertStatusCode(t, w, test.status)
}
}
{"/relative-redirect/1", "/get"},
{"/relative-redirect/2", "/relative-redirect/1"},
{"/relative-redirect/100", "/relative-redirect/99"},
func TestAbsoluteAndRelativeRedirects__OK(t *testing.T) {
var tests = []struct {
relative bool
n int
location string
}{
{true, 1, "/get"},
{true, 2, "/relative-redirect/1"},
{true, 100, "/relative-redirect/99"},
{false, 1, "http://host/get"},
{false, 2, "http://host/absolute-redirect/1"},
{false, 100, "http://host/absolute-redirect/99"},
{"/absolute-redirect/1", "http://host/get"},
{"/absolute-redirect/2", "http://host/absolute-redirect/1"},
{"/absolute-redirect/100", "http://host/absolute-redirect/99"},
}
for _, test := range tests {
var urlTemplate string
if test.relative {
urlTemplate = "/relative-redirect/%d"
} else {
urlTemplate = "/absolute-redirect/%d"
}
r, _ := http.NewRequest("GET", fmt.Sprintf(urlTemplate, test.n), nil)
r, _ := http.NewRequest("GET", test.requestURL, nil)
r.Host = "host"
w := httptest.NewRecorder()
handler.ServeHTTP(w, r)
assertStatusCode(t, w, http.StatusFound)
assertHeader(t, w, "Location", test.location)
assertHeader(t, w, "Location", test.expectedLocation)
}
}
func TestAbsoluteAndRelativeRedirects__Errors(t *testing.T) {
func TestRedirects__Errors(t *testing.T) {
var tests = []struct {
relative bool
given interface{}
status int
requestURL string
expectedStatus int
}{
{true, 3.14, http.StatusBadRequest},
{true, -1, http.StatusBadRequest},
{true, "", http.StatusBadRequest},
{true, "foo", http.StatusBadRequest},
{true, "10/bar", http.StatusNotFound},
{"/redirect", http.StatusNotFound},
{"/redirect/", http.StatusBadRequest},
{"/redirect/3.14", http.StatusBadRequest},
{"/redirect/foo", http.StatusBadRequest},
{"/redirect/10/foo", http.StatusNotFound},
{"/relative-redirect", http.StatusNotFound},
{"/relative-redirect/", http.StatusBadRequest},
{"/relative-redirect/3.14", http.StatusBadRequest},
{"/relative-redirect/foo", http.StatusBadRequest},
{"/relative-redirect/10/foo", http.StatusNotFound},
{false, 3.14, http.StatusBadRequest},
{false, -1, http.StatusBadRequest},
{false, "", http.StatusBadRequest},
{false, "foo", http.StatusBadRequest},
{false, "10/bar", http.StatusNotFound},
{"/absolute-redirect", http.StatusNotFound},
{"/absolute-redirect/", http.StatusBadRequest},
{"/absolute-redirect/3.14", http.StatusBadRequest},
{"/absolute-redirect/foo", http.StatusBadRequest},
{"/absolute-redirect/10/foo", http.StatusNotFound},
}
for _, test := range tests {
var urlTemplate string
if test.relative {
urlTemplate = "/relative-redirect/%v"
} else {
urlTemplate = "/absolute-redirect/%v"
}
r, _ := http.NewRequest("GET", fmt.Sprintf(urlTemplate, test.given), nil)
r, _ := http.NewRequest("GET", test.requestURL, nil)
w := httptest.NewRecorder()
handler.ServeHTTP(w, r)
assertStatusCode(t, w, test.status)
assertStatusCode(t, w, test.expectedStatus)
}
}
......@@ -64,13 +64,21 @@ func (h *HTTPBin) Handler() http.Handler {
mux.HandleFunc("/ip", h.IP)
mux.HandleFunc("/user-agent", h.UserAgent)
mux.HandleFunc("/headers", h.Headers)
mux.HandleFunc("/status/", h.Status)
mux.HandleFunc("/response-headers", h.ResponseHeaders)
mux.HandleFunc("/status/", h.Status)
mux.HandleFunc("/redirect/", h.Redirect)
mux.HandleFunc("/relative-redirect/", h.RelativeRedirect)
mux.HandleFunc("/absolute-redirect/", h.AbsoluteRedirect)
// Make sure our ServeMux doesn't "helpfully" redirect these invalid
// endpoints by adding a trailing slash. See the ServeMux docs for more
// info: https://golang.org/pkg/net/http/#ServeMux
mux.HandleFunc("/status", http.NotFound)
mux.HandleFunc("/redirect", http.NotFound)
mux.HandleFunc("/relative-redirect", http.NotFound)
mux.HandleFunc("/absolute-redirect", http.NotFound)
return logger(cors(mux))
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment