package mooh import ( "fmt" "net/http" "net/url" "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}) 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 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", 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"}, } 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}) router.AddRoute(&Route{Path: "/blog/:year/?:month", Method: "GET", Code: testRoute}) 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}) 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}) router.AddRoute(&Route{Path: "/:foo/bar", Method: "GET", Code: testRoute}) 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) }