stevenbooru/vendor/src/github.com/drone/routes/exp/routes/routes_test.go

190 lines
5.1 KiB
Go

package routes
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
func HandlerOk(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world")
w.WriteHeader(http.StatusOK)
}
func HandlerSetVar(w http.ResponseWriter, r *http.Request) {
c := NewContext(r)
c.Values.Set("password", "z1on")
}
func HandlerErr(w http.ResponseWriter, r *http.Request) {
http.Error(w, "", http.StatusBadRequest)
}
// TestRouteOk tests that the route is correctly handled, and the URL parameters
// are added to the Context.
func TestRouteOk(t *testing.T) {
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.Get("/person/:last/:first", HandlerOk)
mux.ServeHTTP(w, r)
c := NewContext(r)
lastNameParam := c.Params.Get("last")
firstNameParam := c.Params.Get("first")
if lastNameParam != "anderson" {
t.Errorf("url param set to [%s]; want [%s]", lastNameParam, "anderson")
}
if firstNameParam != "thomas" {
t.Errorf("url param set to [%s]; want [%s]", firstNameParam, "thomas")
}
if w.Body.String() != "hello world" {
t.Errorf("Body set to [%s]; want [%s]", w.Body.String(), "hello world")
}
}
// TestFilter tests that a route is filtered prior to handling
func TestRouteFilter(t *testing.T) {
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.Filter(HandlerSetVar)
mux.Get("/person/:last/:first", HandlerOk)
mux.ServeHTTP(w, r)
c := NewContext(r)
password := c.Values.Get("password")
if password != "z1on" {
t.Errorf("session variable set to [%s]; want [%s]", password, "z1on")
}
if w.Body.String() != "hello world" {
t.Errorf("Body set to [%s]; want [%s]", w.Body.String(), "hello world")
}
}
// TestFilterHalt tests that a route is filtered prior to handling, and then
// halts execution (by writing to the response).
func TestRouteFilterHalt(t *testing.T) {
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.Filter(HandlerErr)
mux.Get("/person/:last/:first", HandlerOk)
mux.ServeHTTP(w, r)
if w.Code != 400 {
t.Errorf("Code set to [%s]; want [%s]", w.Code, http.StatusBadRequest)
}
if w.Body.String() == "hello world" {
t.Errorf("Body set to [%s]; want empty", w.Body.String())
}
}
// TestParam tests the Parameter filter, and ensures the filter is only
// executed when the specified Parameter exists.
func TestParam(t *testing.T) {
// in the first test scenario, the Parameter filter should not
// be triggered because the "codename" variab does not exist
r, _ := http.NewRequest("GET", "/neo", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.Filter(HandlerSetVar)
mux.FilterParam("codename", HandlerErr)
mux.Get("/:nickname", HandlerOk)
mux.ServeHTTP(w, r)
if w.Body.String() != "hello world" {
t.Errorf("Body set to [%s]; want [%s]", w.Body.String(), "hello world")
}
// in this second scenario, the Parameter filter SHOULD fire, and should
// halt the request
w = httptest.NewRecorder()
mux = NewRouter()
mux.Filter(HandlerSetVar)
mux.FilterParam("codename", HandlerErr)
mux.Get("/:codename", HandlerOk)
mux.ServeHTTP(w, r)
if w.Body.String() == "hello world" {
t.Errorf("Body set to [%s]; want empty", w.Body.String())
}
if w.Code != 400 {
t.Errorf("Code set to [%s]; want [%s]", w.Code, http.StatusBadRequest)
}
}
/*
// TestTemplate tests template rendering
func TestTemplate(t *testing.T) {
w := httptest.NewRecorder()
tmpl, _ := template.New("template.html").Parse("<html><head><title>{{ .Title }}</title><body>{{ .Name }}</body></html>")
mux := NewRouter()
mux.Template(tmpl)
mux.Set("Title", "Matrix")
mux.ExecuteTemplate(w, "template.html", map[string]interface{}{ "Name" : "Morpheus" })
if w.Body.String() != "<html><head><title>Matrix</title><body>Morpheus</body></html>" {
t.Errorf("template not rendered correctly [%s]", w.Body.String())
}
}
*/
// TestNotFound tests that a 404 code is returned in the
// response if no route matches the request url.
func TestNotFound(t *testing.T) {
r, _ := http.NewRequest("GET", "/", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.ServeHTTP(w, r)
if w.Code != http.StatusNotFound {
t.Errorf("Code set to [%s]; want [%s]", w.Code, http.StatusNotFound)
}
}
// Benchmark_Routes runs a benchmark against our custom Mux using the
// default settings.
func Benchmark_Routes(b *testing.B) {
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
w := httptest.NewRecorder()
mux := NewRouter()
mux.Get("/person/:last/:first", HandlerOk)
for i := 0; i < b.N; i++ {
mux.ServeHTTP(w, r)
}
}
// Benchmark_ServeMux runs a benchmark against the ServeMux Go function.
// We use this to determine performance impact of our library, when compared
// to the out-of-the-box Mux provided by Go.
func Benchmark_ServeMux(b *testing.B) {
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
w := httptest.NewRecorder()
mux := http.NewServeMux()
mux.HandleFunc("/", HandlerOk)
for i := 0; i < b.N; i++ {
r.URL.Query().Get("learn")
mux.ServeHTTP(w, r)
}
}