diff options
Diffstat (limited to 'router_test.go')
-rw-r--r-- | router_test.go | 111 |
1 files changed, 102 insertions, 9 deletions
diff --git a/router_test.go b/router_test.go index 8ee2bcc..1a03764 100644 --- a/router_test.go +++ b/router_test.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" "net/url" + "regexp" "testing" ) @@ -15,7 +16,16 @@ func testRoute(req *Request) (Response, error) { func TestBasic(t *testing.T) { router := BuildDispatcher() router.AddRoute(&Route{Method: "GET", Path: "/", Code: testRoute}) - router.AddRoute(&Route{Method: "GET", Path: "/blog/:year/:month/:day", Code: testRoute}) + router.AddRoute(&Route{ + Method: "GET", + Path: "/blog/:year/:month/:day", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "year": regexp.MustCompile("[\\d]{4}"), + "month": regexp.MustCompile("[\\d]{2}"), + "day": regexp.MustCompile("[\\d]{2}"), + }, + }) router.AddRoute(&Route{Method: "GET", Path: "/blog", Code: testRoute}) if router.routes[0].Path != "/" { @@ -29,16 +39,63 @@ func TestBasic(t *testing.T) { } } +func TestWithSimleValidation(t *testing.T) { + router := BuildDispatcher() + router.AddRoute(&Route{ + Path: "/users/:id", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "id": regexp.MustCompile("[\\d]{1}"), + }, + }) + router.AddRoute(&Route{ + Path: "/users/:name", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "name": regexp.MustCompile("[a-zA-Z]+"), + }, + }) + + r := &http.Request{Method: "GET", URL: &url.URL{Path: "/users/1"}} + m, _ := router.Match(r) + if m == nil { + t.Fatal() + } + if m.Route.Path != "/users/:id" { + t.Fatal() + } + + r = &http.Request{Method: "GET", URL: &url.URL{Path: "/users/foo"}} + m, _ = router.Match(r) + if m == nil { + t.Fatal() + } + if m.Route.Path != "/users/:name" { + t.Fatal() + } +} + func TestMatch(t *testing.T) { router := BuildDispatcher() - router.AddRoute(&Route{Method: "GET", Path: "/blog/:year/:month/:day", Code: testRoute}) + router.AddRoute(&Route{ + Method: "GET", + Path: "/blog/:year/:month/:day", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "year": regexp.MustCompile("[\\d]{4}"), + "month": regexp.MustCompile("[\\d]{2}"), + "day": regexp.MustCompile("[\\d]{2}"), + }, + }) router.AddRoute(&Route{Method: "GET", Path: "/blog", Code: testRoute}) pathToTests := []url.URL{ url.URL{Path: "/blog"}, url.URL{Path: "/blog"}, - url.URL{Path: "/blog/2013/4/21"}, - url.URL{Path: "/blog/2013/21/4"}, + url.URL{Path: "/blog/2013/04/21"}, + url.URL{Path: "/blog/2013/21/04"}, } for _, p := range pathToTests { r := &http.Request{URL: &p, Method: "GET"} @@ -53,8 +110,23 @@ func TestMatch(t *testing.T) { func TestMatchOptional(t *testing.T) { router := BuildDispatcher() - router.AddRoute(&Route{Path: "/blog/?:year", Method: "GET", Code: testRoute}) - router.AddRoute(&Route{Path: "/blog/:year/?:month", Method: "GET", Code: testRoute}) + router.AddRoute(&Route{ + Path: "/blog/?:year", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "year": regexp.MustCompile("[\\d]{4}"), + }, + }) + router.AddRoute(&Route{ + Path: "/blog/:year/?:month", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "year": regexp.MustCompile("[\\d]{4}"), + "month": regexp.MustCompile("[\\d]{2}"), + }, + }) pathToTests := []url.URL{ url.URL{Path: "/blog"}, @@ -76,7 +148,14 @@ func TestMatchOptional(t *testing.T) { func TestAmbigiousSimple(t *testing.T) { router := BuildDispatcher() router.AddRoute(&Route{Path: "/foo/bar", Method: "GET", Code: testRoute}) - router.AddRoute(&Route{Path: "/foo/:bar", Method: "GET", Code: testRoute}) + router.AddRoute(&Route{ + Path: "/foo/:bar", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "bar": regexp.MustCompile("[a-zA-Z]{3}"), + }, + }) r := &http.Request{Method: "GET", URL: &url.URL{Path: "/foo/bar"}} m, _ := router.Match(r) @@ -89,8 +168,22 @@ func TestAmbigiousSimple(t *testing.T) { func TestAmbigiousFail(t *testing.T) { router := BuildDispatcher() - router.AddRoute(&Route{Path: "/foo/:bar", Method: "GET", Code: testRoute}) - router.AddRoute(&Route{Path: "/:foo/bar", Method: "GET", Code: testRoute}) + router.AddRoute(&Route{ + Path: "/foo/:bar", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "bar": regexp.MustCompile("[a-zA-Z]{3}"), + }, + }) + router.AddRoute(&Route{ + Path: "/:foo/bar", + Method: "GET", + Code: testRoute, + Validations: map[string]*regexp.Regexp{ + "foo": regexp.MustCompile("[a-zA-Z]{3}"), + }, + }) r := &http.Request{Method: "GET", URL: &url.URL{Path: "/foo/bar"}} m, err := router.Match(r) |