diff options
Diffstat (limited to 'route_test.go')
-rw-r--r-- | route_test.go | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/route_test.go b/route_test.go new file mode 100644 index 0000000..1a03764 --- /dev/null +++ b/route_test.go @@ -0,0 +1,197 @@ +package mooh + +import ( + "fmt" + "net/http" + "net/url" + "regexp" + "testing" +) + +func testRoute(req *Request) (Response, error) { + resp := Response{} + return resp, nil +} + +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, + 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 != "/" { + t.Fatal() + } + if router.routes[1].Path != "/blog/:year/:month/:day" { + t.Fatal() + } + if router.routes[2].Path != "/blog" { + t.Fatal() + } +} + +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, + 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/04/21"}, + url.URL{Path: "/blog/2013/21/04"}, + } + for _, p := range pathToTests { + r := &http.Request{URL: &p, Method: "GET"} + m, _ := router.Match(r) + if m == nil { + t.Fatal() + } else { + fmt.Println(fmt.Sprintf("%s match for %s", p.Path, m.Path)) + } + } +} + +func TestMatchOptional(t *testing.T) { + router := BuildDispatcher() + 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"}, + url.URL{Path: "/blog"}, + url.URL{Path: "/blog/2013"}, + url.URL{Path: "/blog/2013/21"}, + } + for _, p := range pathToTests { + r := &http.Request{URL: &p, Method: "GET"} + m, _ := router.Match(r) + if m == nil { + t.Fatal() + } else { + fmt.Println(fmt.Sprintf("%s match for %s", p.Path, m.Path)) + } + } +} + +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, + 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) + if m == nil { + t.Fatal() + } else { + fmt.Println(fmt.Sprintf("%s match for %s", r.URL.Path, m.Path)) + } +} + +func TestAmbigiousFail(t *testing.T) { + router := BuildDispatcher() + 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) + if m != nil { + t.Fatal() + } + if err == nil { + t.Fatal() + } + fmt.Println(err) +} |