2015-03-27 23:35:15 +02:00
|
|
|
package echo
|
|
|
|
|
|
|
|
import (
|
2015-03-30 16:38:53 +02:00
|
|
|
"bytes"
|
2015-03-27 23:35:15 +02:00
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
user struct {
|
2015-03-31 05:54:38 +02:00
|
|
|
ID string `json:"id"`
|
|
|
|
Name string `json:"name"`
|
2015-03-27 23:35:15 +02:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-04-05 23:21:03 +02:00
|
|
|
var u1 = user{
|
2015-03-27 23:35:15 +02:00
|
|
|
ID: "1",
|
|
|
|
Name: "Joe",
|
|
|
|
}
|
|
|
|
|
2015-04-06 05:08:52 +02:00
|
|
|
// TODO: Improve me!
|
2015-03-27 23:35:15 +02:00
|
|
|
func TestEchoMaxParam(t *testing.T) {
|
2015-03-30 08:35:08 +02:00
|
|
|
e := New()
|
2015-05-20 03:54:31 +02:00
|
|
|
e.SetMaxParam(8)
|
2015-03-30 08:35:08 +02:00
|
|
|
if e.maxParam != 8 {
|
|
|
|
t.Errorf("max param should be 8, found %d", e.maxParam)
|
2015-03-27 23:35:15 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestEchoIndex(t *testing.T) {
|
2015-03-30 08:35:08 +02:00
|
|
|
e := New()
|
2015-05-18 22:41:50 +02:00
|
|
|
e.Index("examples/website/public/index.html")
|
2015-03-27 23:35:15 +02:00
|
|
|
w := httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
2015-05-15 01:25:49 +02:00
|
|
|
if w.Code != http.StatusOK {
|
2015-03-27 23:35:15 +02:00
|
|
|
t.Errorf("status code should be 200, found %d", w.Code)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-14 00:20:09 +02:00
|
|
|
func TestEchoFavicon(t *testing.T) {
|
|
|
|
e := New()
|
2015-05-18 22:41:50 +02:00
|
|
|
e.Favicon("examples/website/public/favicon.ico")
|
2015-05-14 00:20:09 +02:00
|
|
|
w := httptest.NewRecorder()
|
|
|
|
r, _ := http.NewRequest(GET, "/favicon.ico", nil)
|
|
|
|
e.ServeHTTP(w, r)
|
2015-05-15 01:25:49 +02:00
|
|
|
if w.Code != http.StatusOK {
|
2015-05-14 00:20:09 +02:00
|
|
|
t.Errorf("status code should be 200, found %d", w.Code)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-27 23:35:15 +02:00
|
|
|
func TestEchoStatic(t *testing.T) {
|
2015-03-30 08:35:08 +02:00
|
|
|
e := New()
|
2015-05-18 22:41:50 +02:00
|
|
|
e.Static("/scripts", "examples/website/public/scripts")
|
2015-03-27 23:35:15 +02:00
|
|
|
w := httptest.NewRecorder()
|
2015-04-11 19:09:41 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/scripts/main.js", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
2015-05-15 01:25:49 +02:00
|
|
|
if w.Code != http.StatusOK {
|
2015-03-27 23:35:15 +02:00
|
|
|
t.Errorf("status code should be 200, found %d", w.Code)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-30 05:44:55 +02:00
|
|
|
func TestEchoMiddleware(t *testing.T) {
|
2015-03-30 08:35:08 +02:00
|
|
|
e := New()
|
2015-03-30 16:38:53 +02:00
|
|
|
b := new(bytes.Buffer)
|
2015-03-30 05:44:55 +02:00
|
|
|
|
2015-05-11 06:09:28 +02:00
|
|
|
// MiddlewareFunc
|
|
|
|
e.Use(MiddlewareFunc(func(h HandlerFunc) HandlerFunc {
|
2015-05-20 23:38:51 +02:00
|
|
|
return func(c *Context) error {
|
2015-05-11 06:09:28 +02:00
|
|
|
b.WriteString("a")
|
|
|
|
return h(c)
|
|
|
|
}
|
|
|
|
}))
|
2015-04-19 01:47:48 +02:00
|
|
|
|
2015-05-12 05:41:28 +02:00
|
|
|
// func(echo.HandlerFunc) echo.HandlerFunc
|
2015-04-19 06:46:00 +02:00
|
|
|
e.Use(func(h HandlerFunc) HandlerFunc {
|
2015-05-20 23:38:51 +02:00
|
|
|
return func(c *Context) error {
|
2015-05-11 06:09:28 +02:00
|
|
|
b.WriteString("b")
|
2015-04-19 01:47:48 +02:00
|
|
|
return h(c)
|
2015-04-19 06:46:00 +02:00
|
|
|
}
|
2015-03-30 05:44:55 +02:00
|
|
|
})
|
|
|
|
|
2015-05-20 23:38:51 +02:00
|
|
|
// func(*echo.Context) error
|
|
|
|
e.Use(func(c *Context) error {
|
2015-05-11 06:09:28 +02:00
|
|
|
b.WriteString("c")
|
|
|
|
return nil
|
|
|
|
})
|
2015-03-30 05:44:55 +02:00
|
|
|
|
|
|
|
// func(http.Handler) http.Handler
|
2015-04-21 08:17:21 +02:00
|
|
|
e.Use(func(h http.Handler) http.Handler {
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
2015-05-12 05:41:28 +02:00
|
|
|
b.WriteString("d")
|
2015-04-21 08:17:21 +02:00
|
|
|
h.ServeHTTP(w, r)
|
|
|
|
})
|
|
|
|
})
|
2015-03-30 05:44:55 +02:00
|
|
|
|
2015-05-11 06:09:28 +02:00
|
|
|
// http.Handler
|
|
|
|
e.Use(http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
2015-05-12 05:41:28 +02:00
|
|
|
b.WriteString("e")
|
2015-05-11 06:09:28 +02:00
|
|
|
})))
|
|
|
|
|
|
|
|
// http.HandlerFunc
|
|
|
|
e.Use(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
2015-05-12 05:41:28 +02:00
|
|
|
b.WriteString("f")
|
2015-05-11 06:09:28 +02:00
|
|
|
}))
|
|
|
|
|
2015-03-30 08:35:08 +02:00
|
|
|
// func(http.ResponseWriter, *http.Request)
|
|
|
|
e.Use(func(w http.ResponseWriter, r *http.Request) {
|
2015-05-12 05:41:28 +02:00
|
|
|
b.WriteString("g")
|
2015-03-30 08:35:08 +02:00
|
|
|
})
|
|
|
|
|
2015-03-30 05:44:55 +02:00
|
|
|
// Route
|
2015-05-20 23:38:51 +02:00
|
|
|
e.Get("/hello", func(c *Context) error {
|
2015-05-12 05:41:28 +02:00
|
|
|
return c.String(http.StatusOK, "world")
|
2015-03-30 05:44:55 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
w := httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/hello", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
2015-05-12 05:41:28 +02:00
|
|
|
if b.String() != "abcdefg" {
|
2015-05-11 06:09:28 +02:00
|
|
|
t.Errorf("buffer should be abcdefghi, found %s", b.String())
|
2015-03-30 16:38:53 +02:00
|
|
|
}
|
2015-03-30 08:35:08 +02:00
|
|
|
if w.Body.String() != "world" {
|
2015-03-30 16:38:53 +02:00
|
|
|
t.Error("body should be world")
|
2015-03-30 08:35:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestEchoHandler(t *testing.T) {
|
|
|
|
e := New()
|
|
|
|
|
2015-04-29 20:22:07 +02:00
|
|
|
// HandlerFunc
|
2015-05-20 23:38:51 +02:00
|
|
|
e.Get("/1", HandlerFunc(func(c *Context) error {
|
2015-04-29 20:22:07 +02:00
|
|
|
return c.String(http.StatusOK, "1")
|
|
|
|
}))
|
2015-03-30 08:35:08 +02:00
|
|
|
w := httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/1", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "1" {
|
2015-03-30 16:38:53 +02:00
|
|
|
t.Error("body should be 1")
|
2015-03-30 08:35:08 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 23:38:51 +02:00
|
|
|
// func(*echo.Context) error
|
|
|
|
e.Get("/2", func(c *Context) error {
|
2015-04-29 20:22:07 +02:00
|
|
|
return c.String(http.StatusOK, "2")
|
2015-04-19 01:47:48 +02:00
|
|
|
})
|
2015-03-30 08:35:08 +02:00
|
|
|
w = httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ = http.NewRequest(GET, "/2", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "2" {
|
2015-03-30 16:38:53 +02:00
|
|
|
t.Error("body should be 2")
|
2015-03-30 08:35:08 +02:00
|
|
|
}
|
|
|
|
|
2015-05-12 05:41:28 +02:00
|
|
|
// http.Handler/http.HandlerFunc
|
|
|
|
e.Get("/3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Write([]byte("3"))
|
|
|
|
}))
|
2015-03-30 08:35:08 +02:00
|
|
|
w = httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ = http.NewRequest(GET, "/3", nil)
|
2015-03-30 08:35:08 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "3" {
|
2015-03-30 16:38:53 +02:00
|
|
|
t.Error("body should be 3")
|
2015-03-30 08:35:08 +02:00
|
|
|
}
|
2015-04-19 01:47:48 +02:00
|
|
|
|
2015-05-12 05:41:28 +02:00
|
|
|
// func(http.ResponseWriter, *http.Request)
|
|
|
|
e.Get("/4", func(w http.ResponseWriter, r *http.Request) {
|
2015-04-19 01:47:48 +02:00
|
|
|
w.Write([]byte("4"))
|
2015-05-12 05:41:28 +02:00
|
|
|
})
|
2015-04-19 01:47:48 +02:00
|
|
|
w = httptest.NewRecorder()
|
|
|
|
r, _ = http.NewRequest(GET, "/4", nil)
|
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "4" {
|
|
|
|
t.Error("body should be 4")
|
|
|
|
}
|
2015-03-30 05:44:55 +02:00
|
|
|
}
|
|
|
|
|
2015-04-07 22:02:23 +02:00
|
|
|
func TestEchoGroup(t *testing.T) {
|
2015-04-02 14:02:52 +02:00
|
|
|
b := new(bytes.Buffer)
|
|
|
|
e := New()
|
2015-05-20 23:38:51 +02:00
|
|
|
e.Use(func(*Context) error {
|
2015-04-02 14:02:52 +02:00
|
|
|
b.WriteString("1")
|
2015-05-12 05:41:28 +02:00
|
|
|
return nil
|
2015-04-02 14:02:52 +02:00
|
|
|
})
|
2015-05-20 23:38:51 +02:00
|
|
|
e.Get("/users", func(*Context) error { return nil })
|
2015-04-02 14:02:52 +02:00
|
|
|
w := httptest.NewRecorder()
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/users", nil)
|
2015-04-02 14:02:52 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if b.String() != "1" {
|
|
|
|
t.Errorf("should only execute middleware 1, executed %s", b.String())
|
|
|
|
}
|
|
|
|
|
2015-04-07 22:02:23 +02:00
|
|
|
// Group
|
|
|
|
g1 := e.Group("/group1")
|
2015-05-20 23:38:51 +02:00
|
|
|
g1.Use(func(*Context) error {
|
2015-04-07 22:02:23 +02:00
|
|
|
b.WriteString("2")
|
2015-05-12 05:41:28 +02:00
|
|
|
return nil
|
2015-04-07 22:02:23 +02:00
|
|
|
})
|
2015-05-20 23:38:51 +02:00
|
|
|
g1.Get("/home", func(*Context) error { return nil })
|
2015-04-02 14:02:52 +02:00
|
|
|
b.Reset()
|
|
|
|
w = httptest.NewRecorder()
|
2015-04-07 22:02:23 +02:00
|
|
|
r, _ = http.NewRequest(GET, "/group1/home", nil)
|
2015-04-02 14:02:52 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if b.String() != "12" {
|
|
|
|
t.Errorf("should execute middleware 1 & 2, executed %s", b.String())
|
|
|
|
}
|
2015-04-02 23:41:36 +02:00
|
|
|
|
2015-04-07 22:02:23 +02:00
|
|
|
// Group with no parent middleware
|
2015-05-20 23:38:51 +02:00
|
|
|
g2 := e.Group("/group2", func(*Context) error {
|
2015-04-07 22:02:23 +02:00
|
|
|
b.WriteString("3")
|
2015-05-12 05:41:28 +02:00
|
|
|
return nil
|
2015-04-07 22:02:23 +02:00
|
|
|
})
|
2015-05-20 23:38:51 +02:00
|
|
|
g2.Get("/home", func(*Context) error { return nil })
|
2015-04-02 23:41:36 +02:00
|
|
|
b.Reset()
|
|
|
|
w = httptest.NewRecorder()
|
2015-04-07 22:02:23 +02:00
|
|
|
r, _ = http.NewRequest(GET, "/group2/home", nil)
|
2015-04-02 23:41:36 +02:00
|
|
|
e.ServeHTTP(w, r)
|
|
|
|
if b.String() != "3" {
|
|
|
|
t.Errorf("should execute middleware 3, executed %s", b.String())
|
|
|
|
}
|
2015-04-27 00:27:20 +02:00
|
|
|
|
2015-04-27 03:06:18 +02:00
|
|
|
// Nested group
|
2015-04-27 00:27:20 +02:00
|
|
|
g3 := e.Group("/group3")
|
|
|
|
g4 := g3.Group("/group4")
|
2015-05-20 23:38:51 +02:00
|
|
|
g4.Get("/home", func(c *Context) error {
|
2015-05-12 05:41:28 +02:00
|
|
|
return c.NoContent(http.StatusOK)
|
2015-04-27 00:27:20 +02:00
|
|
|
})
|
|
|
|
w = httptest.NewRecorder()
|
2015-04-27 03:06:18 +02:00
|
|
|
r, _ = http.NewRequest(GET, "/group3/group4/home", nil)
|
2015-04-27 00:27:20 +02:00
|
|
|
e.ServeHTTP(w, r)
|
2015-05-15 01:25:49 +02:00
|
|
|
if w.Code != http.StatusOK {
|
2015-04-27 03:06:18 +02:00
|
|
|
t.Errorf("status code should be 200, found %d", w.Code)
|
2015-04-27 00:27:20 +02:00
|
|
|
}
|
2015-04-02 14:02:52 +02:00
|
|
|
}
|
|
|
|
|
2015-03-31 05:54:38 +02:00
|
|
|
func TestEchoMethod(t *testing.T) {
|
2015-04-06 00:30:03 +02:00
|
|
|
e := New()
|
2015-05-20 23:38:51 +02:00
|
|
|
h := func(*Context) error { return nil }
|
2015-04-19 01:47:48 +02:00
|
|
|
e.Connect("/", h)
|
|
|
|
e.Delete("/", h)
|
|
|
|
e.Get("/", h)
|
|
|
|
e.Head("/", h)
|
|
|
|
e.Options("/", h)
|
|
|
|
e.Patch("/", h)
|
|
|
|
e.Post("/", h)
|
|
|
|
e.Put("/", h)
|
|
|
|
e.Trace("/", h)
|
2015-03-31 05:54:38 +02:00
|
|
|
}
|
|
|
|
|
2015-04-22 07:12:41 +02:00
|
|
|
func TestEchoURL(t *testing.T) {
|
|
|
|
e := New()
|
2015-05-20 23:38:51 +02:00
|
|
|
static := func(*Context) error { return nil }
|
|
|
|
getUser := func(*Context) error { return nil }
|
|
|
|
getFile := func(*Context) error { return nil }
|
2015-04-22 07:12:41 +02:00
|
|
|
e.Get("/static/file", static)
|
|
|
|
e.Get("/users/:id", getUser)
|
|
|
|
e.Get("/users/:uid/files/:fid", getFile)
|
|
|
|
|
|
|
|
if e.URL(static) != "/static/file" {
|
|
|
|
t.Error("uri should be /static/file")
|
|
|
|
}
|
|
|
|
if e.URI(static) != "/static/file" {
|
|
|
|
t.Error("uri should be /static/file")
|
|
|
|
}
|
|
|
|
if e.URI(getUser) != "/users/:id" {
|
|
|
|
t.Error("uri should be /users/:id")
|
|
|
|
}
|
|
|
|
if e.URI(getUser, "1") != "/users/1" {
|
|
|
|
t.Error("uri should be /users/1")
|
|
|
|
}
|
|
|
|
if e.URI(getFile, "1") != "/users/1/files/:fid" {
|
|
|
|
t.Error("uri should be /users/1/files/:fid")
|
|
|
|
}
|
|
|
|
if e.URI(getFile, "1", "1") != "/users/1/files/1" {
|
|
|
|
t.Error("uri should be /users/1/files/1")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-06 05:08:52 +02:00
|
|
|
func TestEchoNotFound(t *testing.T) {
|
2015-03-31 05:54:38 +02:00
|
|
|
e := New()
|
|
|
|
|
2015-04-06 05:08:52 +02:00
|
|
|
// Default NotFound handler
|
2015-04-06 06:49:55 +02:00
|
|
|
r, _ := http.NewRequest(GET, "/files", nil)
|
2015-03-31 05:54:38 +02:00
|
|
|
w := httptest.NewRecorder()
|
|
|
|
e.ServeHTTP(w, r)
|
2015-04-06 05:08:52 +02:00
|
|
|
if w.Code != http.StatusNotFound {
|
|
|
|
t.Errorf("status code should be 404, found %d", w.Code)
|
2015-03-27 23:35:15 +02:00
|
|
|
}
|
2015-03-31 05:54:38 +02:00
|
|
|
}
|
|
|
|
|
2015-04-05 23:21:03 +02:00
|
|
|
func verifyUser(u2 *user, t *testing.T) {
|
|
|
|
if u2.ID != u1.ID {
|
|
|
|
t.Errorf("user id should be %s, found %s", u1.ID, u2.ID)
|
2015-03-27 23:35:15 +02:00
|
|
|
}
|
2015-04-05 23:21:03 +02:00
|
|
|
if u2.Name != u1.Name {
|
|
|
|
t.Errorf("user name should be %s, found %s", u1.Name, u2.Name)
|
2015-03-27 23:35:15 +02:00
|
|
|
}
|
|
|
|
}
|