1
0
mirror of https://github.com/labstack/echo.git synced 2025-07-05 00:58:47 +02:00

Enhanced router tests

Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
Vishal Rana
2016-02-24 11:50:28 -08:00
parent feef0c0b8f
commit 30ee5fbb95

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strconv"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -285,11 +284,9 @@ func TestRouterStatic(t *testing.T) {
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
h, _ := r.Find(GET, path, c) h, _ := r.Find(GET, path, c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, path, c.Get("path")) assert.Equal(t, path, c.Get("path"))
} }
}
func TestRouterParam(t *testing.T) { func TestRouterParam(t *testing.T) {
e := New() e := New()
@ -298,11 +295,9 @@ func TestRouterParam(t *testing.T) {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
h, _ := r.Find(GET, "/users/1", c) r.Find(GET, "/users/1", c)
if assert.NotNil(t, h) {
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
} }
}
func TestRouterTwoParam(t *testing.T) { func TestRouterTwoParam(t *testing.T) {
e := New() e := New()
@ -311,45 +306,40 @@ func TestRouterTwoParam(t *testing.T) {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
r.Find(GET, "/users/1/files/1", c)
h, _ := r.Find(GET, "/users/1/files/1", c)
if assert.NotNil(t, h) {
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
assert.Equal(t, "1", c.P(1)) assert.Equal(t, "1", c.P(1))
} }
}
func TestRouterMatchAny(t *testing.T) { func TestRouterMatchAny(t *testing.T) {
e := New() e := New()
r := e.router r := e.router
// Routes // Add
r.Add(GET, "/", func(*Context) error { r.Add(GET, "/", func(*Context) error {
return nil return nil
}, e) }, e)
r.Add(GET, "/*", func(*Context) error { r.Add(GET, "/*", func(*Context) error {
return nil return nil
}, e) }, e)
r.Add(GET, "/users/*", func(*Context) error { r.Add(GET, "/users/*", func(*Context) error {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
h, _ := r.Find(GET, "/", c) // Find
if assert.NotNil(t, h) { r.Find(GET, "/", c)
assert.Equal(t, "", c.P(0)) assert.Equal(t, "", c.P(0))
}
h, _ = r.Find(GET, "/download", c) r.Find(GET, "/download", c)
if assert.NotNil(t, h) {
assert.Equal(t, "download", c.P(0)) assert.Equal(t, "download", c.P(0))
}
h, _ = r.Find(GET, "/users/joe", c) r.Find(GET, "/users/joe", c)
if assert.NotNil(t, h) {
assert.Equal(t, "joe", c.P(0)) assert.Equal(t, "joe", c.P(0))
} }
}
func TestRouterMicroParam(t *testing.T) { func TestRouterMicroParam(t *testing.T) {
e := New() e := New()
@ -358,13 +348,11 @@ func TestRouterMicroParam(t *testing.T) {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
h, _ := r.Find(GET, "/1/2/3", c) r.Find(GET, "/1/2/3", c)
if assert.NotNil(t, h) {
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
assert.Equal(t, "2", c.P(1)) assert.Equal(t, "2", c.P(1))
assert.Equal(t, "3", c.P(2)) assert.Equal(t, "3", c.P(2))
} }
}
func TestRouterMixParamMatchAny(t *testing.T) { func TestRouterMixParamMatchAny(t *testing.T) {
e := New() e := New()
@ -377,40 +365,33 @@ func TestRouterMixParamMatchAny(t *testing.T) {
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
h, _ := r.Find(GET, "/users/joe/comments", c) h, _ := r.Find(GET, "/users/joe/comments", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, "joe", c.P(0)) assert.Equal(t, "joe", c.P(0))
} }
}
func TestRouterMultiRoute(t *testing.T) { func TestRouterMultiRoute(t *testing.T) {
e := New() e := New()
r := e.router r := e.router
// Routes // Add
r.Add(GET, "/users", func(c *Context) error { r.Add(GET, "/users", func(c *Context) error {
c.Set("path", "/users") c.Set("path", "/users")
return nil return nil
}, e) }, e)
r.Add(GET, "/users/:id", func(c *Context) error { r.Add(GET, "/users/:id", func(c *Context) error {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
// Route > /users // Find
h, _ := r.Find(GET, "/users", c) h, _ := r.Find(GET, "/users", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, "/users", c.Get("path")) assert.Equal(t, "/users", c.Get("path"))
}
// Route > /users/:id
h, _ = r.Find(GET, "/users/1", c) h, _ = r.Find(GET, "/users/1", c)
if assert.NotNil(t, h) {
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
}
// Route > /user
h, _ = r.Find(GET, "/user", c) h, _ = r.Find(GET, "/user", c)
if assert.IsType(t, new(HTTPError), h(c)) { if assert.IsType(t, new(HTTPError), h(c)) {
he := h(c).(*HTTPError) he := h(c).(*HTTPError)
@ -422,168 +403,189 @@ func TestRouterPriority(t *testing.T) {
e := New() e := New()
r := e.router r := e.router
// Routes // Add
r.Add(GET, "/users", func(c *Context) error { r.Add(GET, "/users", func(c *Context) error {
c.Set("a", 1) c.Set("a", 1)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/new", func(c *Context) error { r.Add(GET, "/users/new", func(c *Context) error {
c.Set("b", 2) c.Set("b", 2)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/:id", func(c *Context) error { r.Add(GET, "/users/:id", func(c *Context) error {
c.Set("c", 3) c.Set("c", 3)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/dew", func(c *Context) error { r.Add(GET, "/users/dew", func(c *Context) error {
c.Set("d", 4) c.Set("d", 4)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/:id/files", func(c *Context) error { r.Add(GET, "/users/:id/files", func(c *Context) error {
c.Set("e", 5) c.Set("e", 5)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/newsee", func(c *Context) error { r.Add(GET, "/users/newsee", func(c *Context) error {
c.Set("f", 6) c.Set("f", 6)
return nil return nil
}, e) }, e)
r.Add(GET, "/users/*", func(c *Context) error { r.Add(GET, "/users/*", func(c *Context) error {
c.Set("g", 7) c.Set("g", 7)
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
// Route > /users // Find
h, _ := r.Find(GET, "/users", c) h, _ := r.Find(GET, "/users", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 1, c.Get("a")) assert.Equal(t, 1, c.Get("a"))
}
// Route > /users/new
h, _ = r.Find(GET, "/users/new", c) h, _ = r.Find(GET, "/users/new", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 2, c.Get("b")) assert.Equal(t, 2, c.Get("b"))
}
// Route > /users/:id
h, _ = r.Find(GET, "/users/1", c) h, _ = r.Find(GET, "/users/1", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 3, c.Get("c")) assert.Equal(t, 3, c.Get("c"))
}
// Route > /users/dew
h, _ = r.Find(GET, "/users/dew", c) h, _ = r.Find(GET, "/users/dew", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 4, c.Get("d")) assert.Equal(t, 4, c.Get("d"))
}
// Route > /users/:id/files
h, _ = r.Find(GET, "/users/1/files", c) h, _ = r.Find(GET, "/users/1/files", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 5, c.Get("e")) assert.Equal(t, 5, c.Get("e"))
}
// Route > /users/:id
h, _ = r.Find(GET, "/users/news", c) h, _ = r.Find(GET, "/users/news", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 3, c.Get("c")) assert.Equal(t, 3, c.Get("c"))
}
// Route > /users/*
h, _ = r.Find(GET, "/users/joe/books", c) h, _ = r.Find(GET, "/users/joe/books", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, 7, c.Get("g")) assert.Equal(t, 7, c.Get("g"))
assert.Equal(t, "joe/books", c.Param("_*")) assert.Equal(t, "joe/books", c.Param("_*"))
} }
}
// Issue #217, #372 // Issue #217
func TestRouterPriorityNext(t *testing.T) { func TestRouterPriorityParamAny(t *testing.T) {
e := New() e := New()
r := e.router r := e.router
routes := []Route{ // Add
{"GET", "/aa", nil}, r.Add(GET, "/aa", func(c *Context) error {
{"GET", "/ab", nil}, c.Set("a", 1)
{"GET", "/abc", nil},
{"GET", "/abd", nil},
{"GET", "/a/foo", nil},
{"GET", "/a/bar", nil},
{"GET", "/*", nil},
}
for i, route := range routes {
a := strconv.Itoa(i)
r.Add(route.Method, route.Path, func(c *Context) error {
c.Set(a, a)
return nil return nil
}, e) }, e)
}
r.Add(GET, "/ab", func(c *Context) error {
c.Set("b", 2)
return nil
}, e)
r.Add(GET, "/ab/:name", func(c *Context) error {
c.Set("c", 3)
return nil
}, e)
r.Add(GET, "/ab/*", func(c *Context) error {
c.Set("d", 4)
return nil
}, e)
r.Add(GET, "/*", func(c *Context) error {
c.Set("e", 5)
return nil
}, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
for i, route := range routes {
a := strconv.Itoa(i) // Find
h, _ := r.Find(route.Method, route.Path, c) h, _ := r.Find(GET, "/aa", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, a, c.Get(a)) assert.Equal(t, 1, c.Get("a"))
}
h, _ = r.Find(GET, "/ab", c)
h(c)
assert.Equal(t, 2, c.Get("b"))
h, _ = r.Find(GET, "/ab/joe", c)
h(c)
assert.Equal(t, 3, c.Get("c"))
h, _ = r.Find(GET, "/abc.html", c)
h(c)
assert.Equal(t, 5, c.Get("e"))
} }
// Route > /* // Issue #372
h, _ := r.Find(GET, "/abc.html", c) func TestRouterPriorityNotFound(t *testing.T) {
if assert.NotNil(t, h) { e := New()
r := e.router
c := NewContext(nil, nil, e)
// Add
r.Add(GET, "/a/foo", func(c *Context) error {
c.Set("a", 1)
return nil
}, e)
r.Add(GET, "/a/bar", func(c *Context) error {
c.Set("b", 2)
return nil
}, e)
// Find
h, _ := r.Find(GET, "/a/foo", c)
h(c) h(c)
assert.Equal(t, "abc.html", c.P(0)) assert.Equal(t, 1, c.Get("a"))
} h, _ = r.Find(GET, "/a/bar", c)
h(c)
assert.Equal(t, 2, c.Get("b"))
h, _ = r.Find(GET, "/abc/def", c)
he := h(c).(*HTTPError)
assert.Equal(t, http.StatusNotFound, he.Code())
} }
func TestRouterParamNames(t *testing.T) { func TestRouterParamNames(t *testing.T) {
e := New() e := New()
r := e.router r := e.router
// Routes // Add
r.Add(GET, "/users", func(c *Context) error { r.Add(GET, "/users", func(c *Context) error {
c.Set("path", "/users") c.Set("path", "/users")
return nil return nil
}, e) }, e)
r.Add(GET, "/users/:id", func(c *Context) error { r.Add(GET, "/users/:id", func(c *Context) error {
return nil return nil
}, e) }, e)
r.Add(GET, "/users/:uid/files/:fid", func(c *Context) error { r.Add(GET, "/users/:uid/files/:fid", func(c *Context) error {
return nil return nil
}, e) }, e)
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
// Route > /users // Find
h, _ := r.Find(GET, "/users", c) h, _ := r.Find(GET, "/users", c)
if assert.NotNil(t, h) {
h(c) h(c)
assert.Equal(t, "/users", c.Get("path")) assert.Equal(t, "/users", c.Get("path"))
}
// Route > /users/:id r.Find(GET, "/users/1", c)
h, _ = r.Find(GET, "/users/1", c)
if assert.NotNil(t, h) {
assert.Equal(t, "id", c.pnames[0]) assert.Equal(t, "id", c.pnames[0])
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
}
// Route > /users/:uid/files/:fid r.Find(GET, "/users/1/files/1", c)
h, _ = r.Find(GET, "/users/1/files/1", c)
if assert.NotNil(t, h) {
assert.Equal(t, "uid", c.pnames[0]) assert.Equal(t, "uid", c.pnames[0])
assert.Equal(t, "1", c.P(0)) assert.Equal(t, "1", c.P(0))
assert.Equal(t, "fid", c.pnames[1]) assert.Equal(t, "fid", c.pnames[1])
assert.Equal(t, "1", c.P(1)) assert.Equal(t, "1", c.P(1))
} }
}
func TestRouterAPI(t *testing.T) { func TestRouterAPI(t *testing.T) {
e := New() e := New()
@ -596,15 +598,12 @@ func TestRouterAPI(t *testing.T) {
} }
c := NewContext(nil, nil, e) c := NewContext(nil, nil, e)
for _, route := range api { for _, route := range api {
h, _ := r.Find(route.Method, route.Path, c) r.Find(route.Method, route.Path, c)
if assert.NotNil(t, h) {
for i, n := range c.pnames { for i, n := range c.pnames {
if assert.NotEmpty(t, n) { if assert.NotEmpty(t, n) {
assert.Equal(t, ":"+n, c.P(i)) assert.Equal(t, ":"+n, c.P(i))
} }
} }
h(c)
}
} }
} }