1
0
mirror of https://github.com/webx-top/echo synced 2021-12-20 05:52:35 +00:00
echo/echo_test.go
2021-09-10 21:42:55 +08:00

247 lines
5.3 KiB
Go

package echo_test
import (
"bytes"
"errors"
"fmt"
"net/http"
"testing"
"github.com/admpub/log"
"github.com/stretchr/testify/assert"
. "github.com/webx-top/echo"
mw "github.com/webx-top/echo/middleware"
test "github.com/webx-top/echo/testing"
)
func init() {
mw.DefaultLogWriter = log.Writer(log.LevelInfo)
}
func request(method, path string, e *Echo, reqRewrite ...func(*http.Request)) (int, string) {
rec := test.Request(method, path, e, reqRewrite...)
return rec.Code, rec.Body.String()
}
func TestEchoMiddleware(t *testing.T) {
e := New()
buf := new(bytes.Buffer)
e.Pre(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Empty(t, c.Path())
buf.WriteString("-1")
return next.Handle(c)
}
})
e.Use(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("1")
return next.Handle(c)
}
})
e.Use(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("2")
return next.Handle(c)
}
})
e.Use(mw.Log(), func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("3")
return next.Handle(c)
}
})
// Route
e.Get("/", func(c Context) error {
return c.String("OK")
})
e.RebuildRouter()
c, b := request(GET, "/", e)
assert.Equal(t, "-1123", buf.String())
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "OK", b)
}
func TestEchoMiddlewareError(t *testing.T) {
e := New()
e.Use(mw.Log(), func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return errors.New("error")
}
})
e.Get("/", NotFoundHandler)
e.RebuildRouter()
c, _ := request(GET, "/", e)
assert.Equal(t, http.StatusInternalServerError, c)
}
func TestEchoRoutePath(t *testing.T) {
e := New()
e.Use(mw.Log())
e.Use(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Equal(t, `/`, c.Path())
return next.Handle(c)
}
})
e.Get("/", func(ctx Context) error {
return ctx.String(ctx.Path())
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Equal(t, `/`, c.Path())
return next.Handle(c)
}
})
e.RebuildRouter()
c, r := request(GET, "/", e)
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, `/`, r)
}
func TestGroupMiddleware(t *testing.T) {
e := New()
buf := new(bytes.Buffer)
e.Pre(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Empty(t, c.Path())
buf.WriteString("-1")
return next.Handle(c)
}
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Empty(t, c.Path())
buf.WriteString("0")
return next.Handle(c)
}
})
e.Pre(func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Empty(t, c.Path())
buf.WriteString("-3")
return next.Handle(c)
}
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
assert.Empty(t, c.Path())
buf.WriteString("-2")
return next.Handle(c)
}
})
e.Use(mw.Log(), func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("1")
return next.Handle(c)
}
})
g := e.Group("/", func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("2")
return next.Handle(c)
}
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("3")
return next.Handle(c)
}
})
// Route
g.Get("", func(c Context) error {
return c.String("OK")
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("4")
return next.Handle(c)
}
}, func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
buf.WriteString("5")
return next.Handle(c)
}
})
e.RebuildRouter()
c, b := request(GET, "/", e)
assert.Equal(t, "-3-2-1012345", buf.String())
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "OK", b)
buf = new(bytes.Buffer)
e.RebuildRouter()
c, b = request(GET, "/", e)
assert.Equal(t, "-3-2-1012345", buf.String())
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "OK", b)
}
func TestEchoHandler(t *testing.T) {
e := New()
// HandlerFunc
e.Get("/ok", func(c Context) error {
return c.String("OK")
})
e.Get("/view/:id", func(c Context) error {
return c.String(c.Param(`id`))
}).SetName(`view`)
e.Get("/file/*", func(c Context) error {
return c.String(c.P(0))
})
e.RebuildRouter()
assert.Equal(t, `/view/8`, e.URI(`view`, 8))
c, b := request(GET, "/ok", e)
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "OK", b)
c, b = request(GET, "/view/123", e)
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "123", b)
c, b = request(POST, "/view/0", e)
assert.Equal(t, http.StatusMethodNotAllowed, c)
assert.Equal(t, "Method Not Allowed", b)
c, b = request(GET, "/file/path/to/file.js", e)
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "path/to/file.js", b)
}
func TestEchoRouter(t *testing.T) {
e := New()
e.Get("/router/:n/list", func(c Context) error {
//Dump(c.Route())
return c.String(c.Param(`n`))
})
e.RebuildRouter()
c, b := request(GET, "/router/123/list", e)
assert.Equal(t, http.StatusOK, c)
assert.Equal(t, "123", b)
}
func TestEchoData(t *testing.T) {
data := NewData(nil)
data.SetCode(0)
assert.Equal(t, 0, data.Code.Int())
assert.Equal(t, `0`, fmt.Sprintf(`%d`, data.Code))
assert.Equal(t, `Failure`, fmt.Sprintf(`%v`, data.Code))
assert.Equal(t, `Failure`, data.State)
}