about summary refs log tree commit diff
path: root/router_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'router_test.go')
-rw-r--r--router_test.go111
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)