2014-04-12 05:18:18 +00:00
|
|
|
// Beego (http://beego.me/)
|
|
|
|
// @description beego is an open-source, high-performance web framework for the Go programming language.
|
|
|
|
// @link http://github.com/astaxie/beego for the canonical source repository
|
|
|
|
// @license http://github.com/astaxie/beego/blob/master/LICENSE
|
|
|
|
// @authors astaxie
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
package beego
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
2014-06-08 12:24:01 +00:00
|
|
|
|
beego: support more router
//design model
beego.Get(router, beego.FilterFunc)
beego.Post(router, beego.FilterFunc)
beego.Put(router, beego.FilterFunc)
beego.Head(router, beego.FilterFunc)
beego.Options(router, beego.FilterFunc)
beego.Delete(router, beego.FilterFunc)
beego.Handler(router, http.Handler)
//example
beego.Get("/user", func(ctx *context.Context) {
ctx.Output.Body([]byte("Get userlist"))
})
beego.Post("/user", func(ctx *context.Context) {
ctx.Output.Body([]byte("add userlist"))
})
beego.Delete("/user/:id", func(ctx *context.Context) {
ctx.Output.Body([]byte([]byte(ctx.Input.Param(":id")))
})
import (
"http"
"github.com/gorilla/rpc"
"github.com/gorilla/rpc/json"
)
func init() {
s := rpc.NewServer()
s.RegisterCodec(json.NewCodec(), "application/json")
s.RegisterService(new(HelloService), "")
beego.Handler("/rpc", s)
}
2014-05-16 02:18:15 +00:00
|
|
|
"github.com/astaxie/beego/context"
|
2013-09-11 07:49:12 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type TestController struct {
|
|
|
|
Controller
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *TestController) Get() {
|
|
|
|
this.Data["Username"] = "astaxie"
|
|
|
|
this.Ctx.Output.Body([]byte("ok"))
|
|
|
|
}
|
|
|
|
|
2014-04-10 14:33:32 +00:00
|
|
|
func (this *TestController) Post() {
|
|
|
|
this.Ctx.Output.Body([]byte(this.Ctx.Input.Query(":name")))
|
|
|
|
}
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
func (this *TestController) List() {
|
|
|
|
this.Ctx.Output.Body([]byte("i am list"))
|
|
|
|
}
|
|
|
|
|
2013-12-18 02:00:52 +00:00
|
|
|
func (this *TestController) Params() {
|
|
|
|
this.Ctx.Output.Body([]byte(this.Ctx.Input.Params["0"] + this.Ctx.Input.Params["1"] + this.Ctx.Input.Params["2"]))
|
|
|
|
}
|
|
|
|
|
2013-09-22 03:12:37 +00:00
|
|
|
func (this *TestController) Myext() {
|
2013-11-26 06:13:23 +00:00
|
|
|
this.Ctx.Output.Body([]byte(this.Ctx.Input.Param(":ext")))
|
2013-09-22 03:12:37 +00:00
|
|
|
}
|
|
|
|
|
2013-11-10 15:05:07 +00:00
|
|
|
func (this *TestController) GetUrl() {
|
|
|
|
this.Ctx.Output.Body([]byte(this.UrlFor(".Myext")))
|
|
|
|
}
|
|
|
|
|
2014-05-19 10:52:48 +00:00
|
|
|
func (t *TestController) GetParams() {
|
|
|
|
t.Ctx.WriteString(t.Ctx.Input.Query(":last") + "+" +
|
|
|
|
t.Ctx.Input.Query(":first") + "+" + t.Ctx.Input.Query("learn"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *TestController) GetManyRouter() {
|
|
|
|
t.Ctx.WriteString(t.Ctx.Input.Query(":id") + t.Ctx.Input.Query(":page"))
|
|
|
|
}
|
|
|
|
|
2013-11-26 09:09:23 +00:00
|
|
|
type ResStatus struct {
|
|
|
|
Code int
|
|
|
|
Msg string
|
|
|
|
}
|
|
|
|
|
|
|
|
type JsonController struct {
|
|
|
|
Controller
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *JsonController) Prepare() {
|
|
|
|
this.Data["json"] = "prepare"
|
|
|
|
this.ServeJson(true)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *JsonController) Get() {
|
|
|
|
this.Data["Username"] = "astaxie"
|
|
|
|
this.Ctx.Output.Body([]byte("ok"))
|
|
|
|
}
|
|
|
|
|
2013-11-10 15:05:07 +00:00
|
|
|
func TestUrlFor(t *testing.T) {
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Add("/api/list", &TestController{}, "*:List")
|
|
|
|
handler.Add("/person/:last/:first", &TestController{})
|
|
|
|
handler.AddAuto(&TestController{})
|
|
|
|
if handler.UrlFor("TestController.List") != "/api/list" {
|
2014-06-08 12:24:01 +00:00
|
|
|
Info(handler.UrlFor("TestController.List"))
|
2013-11-10 15:05:07 +00:00
|
|
|
t.Errorf("TestController.List must equal to /api/list")
|
|
|
|
}
|
|
|
|
if handler.UrlFor("TestController.Get", ":last", "xie", ":first", "asta") != "/person/xie/asta" {
|
|
|
|
t.Errorf("TestController.Get must equal to /person/xie/asta")
|
|
|
|
}
|
2014-06-08 12:24:01 +00:00
|
|
|
if handler.UrlFor("TestController.Myext") != "/test/myext" {
|
|
|
|
t.Errorf("TestController.Myext must equal to /test/myext")
|
2013-11-10 15:05:07 +00:00
|
|
|
}
|
2014-06-08 12:24:01 +00:00
|
|
|
if handler.UrlFor("TestController.GetUrl") != "/test/geturl" {
|
|
|
|
t.Errorf("TestController.GetUrl must equal to /test/geturl")
|
2013-11-10 15:05:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
func TestUserFunc(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/api/list", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Add("/api/list", &TestController{}, "*:List")
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "i am list" {
|
|
|
|
t.Errorf("user define func can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-10 14:33:32 +00:00
|
|
|
func TestPostFunc(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("POST", "/astaxie", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Add("/:name", &TestController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "astaxie" {
|
|
|
|
t.Errorf("post func should astaxie")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
func TestAutoFunc(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/test/list", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.AddAuto(&TestController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "i am list" {
|
|
|
|
t.Errorf("user define func can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-18 02:00:52 +00:00
|
|
|
func TestAutoFuncParams(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/test/params/2009/11/12", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.AddAuto(&TestController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "20091112" {
|
|
|
|
t.Errorf("user define func can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-22 03:12:37 +00:00
|
|
|
func TestAutoExtFunc(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/test/myext.json", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.AddAuto(&TestController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "json" {
|
|
|
|
t.Errorf("user define func can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
func TestRouteOk(t *testing.T) {
|
|
|
|
|
|
|
|
r, _ := http.NewRequest("GET", "/person/anderson/thomas?learn=kungfu", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
2014-05-19 10:52:48 +00:00
|
|
|
handler.Add("/person/:last/:first", &TestController{}, "get:GetParams")
|
2013-09-11 07:49:12 +00:00
|
|
|
handler.ServeHTTP(w, r)
|
2014-05-19 10:52:48 +00:00
|
|
|
body := w.Body.String()
|
|
|
|
if body != "anderson+thomas+kungfu" {
|
|
|
|
t.Errorf("url param set to [%s];", body)
|
2013-09-11 07:49:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-13 03:22:14 +00:00
|
|
|
func TestManyRoute(t *testing.T) {
|
|
|
|
|
|
|
|
r, _ := http.NewRequest("GET", "/beego32-12.html", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
2014-05-19 10:52:48 +00:00
|
|
|
handler.Add("/beego:id([0-9]+)-:page([0-9]+).html", &TestController{}, "get:GetManyRouter")
|
2013-09-13 03:22:14 +00:00
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
|
2014-05-19 10:52:48 +00:00
|
|
|
body := w.Body.String()
|
2013-09-13 03:22:14 +00:00
|
|
|
|
2014-05-19 10:52:48 +00:00
|
|
|
if body != "3212" {
|
|
|
|
t.Errorf("url param set to [%s];", body)
|
2013-09-13 03:22:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-11 07:49:12 +00:00
|
|
|
func TestNotFound(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
|
|
|
|
if w.Code != http.StatusNotFound {
|
|
|
|
t.Errorf("Code set to [%v]; want [%v]", w.Code, http.StatusNotFound)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestStatic tests the ability to serve static
|
|
|
|
// content from the filesystem
|
|
|
|
func TestStatic(t *testing.T) {
|
2013-11-10 15:26:28 +00:00
|
|
|
r, _ := http.NewRequest("GET", "/static/js/jquery.js", nil)
|
2013-09-11 07:49:12 +00:00
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
|
2013-11-10 15:26:28 +00:00
|
|
|
if w.Code != 404 {
|
2013-09-11 07:49:12 +00:00
|
|
|
t.Errorf("handler.Static failed to serve file")
|
|
|
|
}
|
|
|
|
}
|
2013-11-26 09:09:23 +00:00
|
|
|
|
|
|
|
func TestPrepare(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/json/list", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Add("/json/list", &JsonController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != `"prepare"` {
|
|
|
|
t.Errorf(w.Body.String() + "user define func can't run")
|
|
|
|
}
|
|
|
|
}
|
2014-01-01 09:57:57 +00:00
|
|
|
|
|
|
|
func TestAutoPrefix(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/admin/test/list", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.AddAutoPrefix("/admin", &TestController{})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "i am list" {
|
|
|
|
t.Errorf("TestAutoPrefix can't run")
|
|
|
|
}
|
|
|
|
}
|
beego: support more router
//design model
beego.Get(router, beego.FilterFunc)
beego.Post(router, beego.FilterFunc)
beego.Put(router, beego.FilterFunc)
beego.Head(router, beego.FilterFunc)
beego.Options(router, beego.FilterFunc)
beego.Delete(router, beego.FilterFunc)
beego.Handler(router, http.Handler)
//example
beego.Get("/user", func(ctx *context.Context) {
ctx.Output.Body([]byte("Get userlist"))
})
beego.Post("/user", func(ctx *context.Context) {
ctx.Output.Body([]byte("add userlist"))
})
beego.Delete("/user/:id", func(ctx *context.Context) {
ctx.Output.Body([]byte([]byte(ctx.Input.Param(":id")))
})
import (
"http"
"github.com/gorilla/rpc"
"github.com/gorilla/rpc/json"
)
func init() {
s := rpc.NewServer()
s.RegisterCodec(json.NewCodec(), "application/json")
s.RegisterService(new(HelloService), "")
beego.Handler("/rpc", s)
}
2014-05-16 02:18:15 +00:00
|
|
|
|
|
|
|
func TestRouterGet(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("GET", "/user", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Get("/user", func(ctx *context.Context) {
|
|
|
|
ctx.Output.Body([]byte("Get userlist"))
|
|
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "Get userlist" {
|
|
|
|
t.Errorf("TestRouterGet can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRouterPost(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("POST", "/user/123", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Post("/user/:id", func(ctx *context.Context) {
|
|
|
|
ctx.Output.Body([]byte(ctx.Input.Param(":id")))
|
|
|
|
})
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "123" {
|
|
|
|
t.Errorf("TestRouterPost can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func sayhello(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Write([]byte("sayhello"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRouterHandler(t *testing.T) {
|
|
|
|
r, _ := http.NewRequest("POST", "/sayhi", nil)
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
handler := NewControllerRegistor()
|
|
|
|
handler.Handler("/sayhi", http.HandlerFunc(sayhello))
|
|
|
|
handler.ServeHTTP(w, r)
|
|
|
|
if w.Body.String() != "sayhello" {
|
|
|
|
t.Errorf("TestRouterHandler can't run")
|
|
|
|
}
|
|
|
|
}
|
2014-05-20 10:20:44 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
// Benchmarks NewApp:
|
|
|
|
//
|
|
|
|
|
|
|
|
func beegoFilterFunc(ctx *context.Context) {
|
|
|
|
ctx.WriteString("hello")
|
|
|
|
}
|
|
|
|
|
|
|
|
type AdminController struct {
|
|
|
|
Controller
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *AdminController) Get() {
|
|
|
|
a.Ctx.WriteString("hello")
|
|
|
|
}
|
|
|
|
|
2014-06-09 02:11:37 +00:00
|
|
|
func TestRouterFunc(t *testing.T) {
|
|
|
|
mux := NewControllerRegistor()
|
|
|
|
mux.Get("/action", beegoFilterFunc)
|
|
|
|
mux.Post("/action", beegoFilterFunc)
|
|
|
|
rw, r := testRequest("GET", "/action")
|
|
|
|
mux.ServeHTTP(rw, r)
|
|
|
|
if rw.Body.String() != "hello" {
|
|
|
|
t.Errorf("TestRouterFunc can't run")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-20 10:20:44 +00:00
|
|
|
func BenchmarkFunc(b *testing.B) {
|
|
|
|
mux := NewControllerRegistor()
|
|
|
|
mux.Get("/action", beegoFilterFunc)
|
|
|
|
rw, r := testRequest("GET", "/action")
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
mux.ServeHTTP(rw, r)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkController(b *testing.B) {
|
|
|
|
mux := NewControllerRegistor()
|
|
|
|
mux.Add("/action", &AdminController{})
|
|
|
|
rw, r := testRequest("GET", "/action")
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
mux.ServeHTTP(rw, r)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testRequest(method, path string) (*httptest.ResponseRecorder, *http.Request) {
|
|
|
|
request, _ := http.NewRequest(method, path, nil)
|
|
|
|
recorder := httptest.NewRecorder()
|
|
|
|
|
|
|
|
return recorder, request
|
|
|
|
}
|