1
0
mirror of https://github.com/astaxie/beego.git synced 2024-10-31 22:40:54 +00:00
Beego/tree_test.go

288 lines
12 KiB
Go
Raw Normal View History

2014-08-18 08:41:43 +00:00
// Copyright 2014 beego Author. All Rights Reserved.
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2014-06-04 15:07:57 +00:00
package beego
2015-12-11 05:51:01 +00:00
import (
"testing"
"github.com/astaxie/beego/context"
)
2014-06-04 15:07:57 +00:00
type testinfo struct {
url string
requesturl string
params map[string]string
}
var routers []testinfo
func init() {
routers = make([]testinfo, 0)
2015-09-06 04:17:16 +00:00
routers = append(routers, testinfo{"/topic/?:auth:int", "/topic", nil})
2015-12-11 05:51:01 +00:00
routers = append(routers, testinfo{"/topic/?:auth:int", "/topic/123", map[string]string{":auth": "123"}})
2015-09-06 04:07:12 +00:00
routers = append(routers, testinfo{"/topic/:id/?:auth", "/topic/1", map[string]string{":id": "1"}})
2015-12-11 05:51:01 +00:00
routers = append(routers, testinfo{"/topic/:id/?:auth", "/topic/1/2", map[string]string{":id": "1", ":auth": "2"}})
2015-09-06 04:07:12 +00:00
routers = append(routers, testinfo{"/topic/:id/?:auth:int", "/topic/1", map[string]string{":id": "1"}})
2015-12-11 05:51:01 +00:00
routers = append(routers, testinfo{"/topic/:id/?:auth:int", "/topic/1/123", map[string]string{":id": "1", ":auth": "123"}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/:id", "/123", map[string]string{":id": "123"}})
2014-06-08 12:24:01 +00:00
routers = append(routers, testinfo{"/hello/?:id", "/hello", map[string]string{":id": ""}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/", "/", nil})
routers = append(routers, testinfo{"/customer/login", "/customer/login", nil})
2014-06-08 12:24:01 +00:00
routers = append(routers, testinfo{"/customer/login", "/customer/login.json", map[string]string{":ext": "json"}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/*", "/customer/123", map[string]string{":splat": "customer/123"}})
2014-06-08 12:24:01 +00:00
routers = append(routers, testinfo{"/*", "/customer/2009/12/11", map[string]string{":splat": "customer/2009/12/11"}})
2014-06-23 07:28:53 +00:00
routers = append(routers, testinfo{"/aa/*/bb", "/aa/2009/bb", map[string]string{":splat": "2009"}})
routers = append(routers, testinfo{"/cc/*/dd", "/cc/2009/11/dd", map[string]string{":splat": "2009/11"}})
routers = append(routers, testinfo{"/ee/:year/*/ff", "/ee/2009/11/ff", map[string]string{":year": "2009", ":splat": "11"}})
2014-06-30 15:49:11 +00:00
routers = append(routers, testinfo{"/thumbnail/:size/uploads/*",
"/thumbnail/100x100/uploads/items/2014/04/20/dPRCdChkUd651t1Hvs18.jpg",
map[string]string{":size": "100x100", ":splat": "items/2014/04/20/dPRCdChkUd651t1Hvs18.jpg"}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/*.*", "/nice/api.json", map[string]string{":path": "nice/api", ":ext": "json"}})
2014-06-08 12:24:01 +00:00
routers = append(routers, testinfo{"/:name/*.*", "/nice/api.json", map[string]string{":name": "nice", ":path": "api", ":ext": "json"}})
routers = append(routers, testinfo{"/:name/test/*.*", "/nice/test/api.json", map[string]string{":name": "nice", ":path": "api", ":ext": "json"}})
routers = append(routers, testinfo{"/dl/:width:int/:height:int/*.*",
"/dl/48/48/05ac66d9bda00a3acf948c43e306fc9a.jpg",
map[string]string{":width": "48", ":height": "48", ":ext": "jpg", ":path": "05ac66d9bda00a3acf948c43e306fc9a"}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/v1/shop/:id:int", "/v1/shop/123", map[string]string{":id": "123"}})
2014-06-18 15:32:47 +00:00
routers = append(routers, testinfo{"/:year:int/:month:int/:id/:endid", "/1111/111/aaa/aaa", map[string]string{":year": "1111", ":month": "111", ":id": "aaa", ":endid": "aaa"}})
2014-06-04 15:07:57 +00:00
routers = append(routers, testinfo{"/v1/shop/:id/:name", "/v1/shop/123/nike", map[string]string{":id": "123", ":name": "nike"}})
routers = append(routers, testinfo{"/v1/shop/:id/account", "/v1/shop/123/account", map[string]string{":id": "123"}})
routers = append(routers, testinfo{"/v1/shop/:name:string", "/v1/shop/nike", map[string]string{":name": "nike"}})
routers = append(routers, testinfo{"/v1/shop/:id([0-9]+)", "/v1/shop//123", map[string]string{":id": "123"}})
routers = append(routers, testinfo{"/v1/shop/:id([0-9]+)_:name", "/v1/shop/123_nike", map[string]string{":id": "123", ":name": "nike"}})
2014-06-11 01:33:35 +00:00
routers = append(routers, testinfo{"/v1/shop/:id(.+)_cms.html", "/v1/shop/123_cms.html", map[string]string{":id": "123"}})
routers = append(routers, testinfo{"/v1/shop/cms_:id(.+)_:page(.+).html", "/v1/shop/cms_123_1.html", map[string]string{":id": "123", ":page": "1"}})
2014-06-12 12:50:29 +00:00
routers = append(routers, testinfo{"/v1/:v/cms/aaa_:id(.+)_:page(.+).html", "/v1/2/cms/aaa_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}})
routers = append(routers, testinfo{"/v1/:v/cms_:id(.+)_:page(.+).html", "/v1/2/cms_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}})
routers = append(routers, testinfo{"/v1/:v(.+)_cms/ttt_:id(.+)_:page(.+).html", "/v1/2_cms/ttt_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}})
2014-06-04 15:07:57 +00:00
}
func TestTreeRouters(t *testing.T) {
for _, r := range routers {
tr := NewTree()
tr.AddRouter(r.url, "astaxie")
2015-12-11 05:51:01 +00:00
ctx := context.NewContext()
obj := tr.Match(r.requesturl, ctx)
2014-06-04 15:07:57 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal(r.url + " can't get obj ")
}
if r.params != nil {
for k, v := range r.params {
2015-12-11 05:51:01 +00:00
if vv, ok := ctx.Input.Params[k]; !ok {
2014-06-23 07:28:53 +00:00
t.Fatal(r.url + " " + r.requesturl + " get param empty:" + k)
2014-06-04 15:07:57 +00:00
} else if vv != v {
2014-06-23 07:28:53 +00:00
t.Fatal(r.url + " " + r.requesturl + " should be:" + v + " get param:" + vv)
2014-06-04 15:07:57 +00:00
}
}
}
}
}
2014-06-12 12:50:29 +00:00
func TestAddTree(t *testing.T) {
tr := NewTree()
tr.AddRouter("/shop/:id/account", "astaxie")
tr.AddRouter("/shop/:sd/ttt_:id(.+)_:page(.+).html", "astaxie")
t1 := NewTree()
t1.AddTree("/v1/zl", tr)
2015-12-11 05:51:01 +00:00
ctx := context.NewContext()
obj := t1.Match("/v1/zl/shop/123/account", ctx)
2014-06-12 12:50:29 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/v1/zl/shop/:id/account can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2014-06-12 12:50:29 +00:00
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":id"] != "123" {
2014-06-12 12:50:29 +00:00
t.Fatal("get :id param error")
}
2015-12-11 05:51:01 +00:00
ctx.Input.Reset(ctx)
obj = t1.Match("/v1/zl/shop/123/ttt_1_12.html", ctx)
2014-06-12 12:50:29 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/v1/zl//shop/:sd/ttt_:id(.+)_:page(.+).html can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2014-06-12 12:50:29 +00:00
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":sd"] != "123" || ctx.Input.Params[":id"] != "1" || ctx.Input.Params[":page"] != "12" {
2014-06-12 12:50:29 +00:00
t.Fatal("get :sd :id :page param error")
}
t2 := NewTree()
t2.AddTree("/v1/:shopid", tr)
2015-12-11 05:51:01 +00:00
ctx.Input.Reset(ctx)
obj = t2.Match("/v1/zl/shop/123/account", ctx)
2014-06-12 12:50:29 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/v1/:shopid/shop/:id/account can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2014-06-12 12:50:29 +00:00
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":id"] != "123" || ctx.Input.Params[":shopid"] != "zl" {
2014-06-12 12:50:29 +00:00
t.Fatal("get :id :shopid param error")
}
2015-12-11 05:51:01 +00:00
ctx.Input.Reset(ctx)
obj = t2.Match("/v1/zl/shop/123/ttt_1_12.html", ctx)
2014-06-12 12:50:29 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/v1/:shopid/shop/:sd/ttt_:id(.+)_:page(.+).html can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2014-06-12 12:50:29 +00:00
t.Fatal("get :shopid param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":sd"] != "123" || ctx.Input.Params[":id"] != "1" || ctx.Input.Params[":page"] != "12" || ctx.Input.Params[":shopid"] != "zl" {
2014-06-12 12:50:29 +00:00
t.Fatal("get :sd :id :page :shopid param error")
}
}
func TestAddTree2(t *testing.T) {
tr := NewTree()
tr.AddRouter("/shop/:id/account", "astaxie")
tr.AddRouter("/shop/:sd/ttt_:id(.+)_:page(.+).html", "astaxie")
t3 := NewTree()
t3.AddTree("/:version(v1|v2)/:prefix", tr)
2015-12-11 05:51:01 +00:00
ctx := context.NewContext()
obj := t3.Match("/v1/zl/shop/123/account", ctx)
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/:version(v1|v2)/:prefix/shop/:id/account can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":id"] != "123" || ctx.Input.Params[":prefix"] != "zl" || ctx.Input.Params[":version"] != "v1" {
t.Fatal("get :id :prefix :version param error")
}
}
2015-04-05 15:11:50 +00:00
func TestAddTree3(t *testing.T) {
tr := NewTree()
tr.AddRouter("/create", "astaxie")
tr.AddRouter("/shop/:sd/account", "astaxie")
t3 := NewTree()
t3.AddTree("/table/:num", tr)
2015-12-11 05:51:01 +00:00
ctx := context.NewContext()
obj := t3.Match("/table/123/shop/123/account", ctx)
2015-04-05 15:11:50 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/table/:num/shop/:sd/account can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2015-04-05 15:11:50 +00:00
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":num"] != "123" || ctx.Input.Params[":sd"] != "123" {
2015-04-05 15:11:50 +00:00
t.Fatal("get :num :sd param error")
}
2015-12-11 05:51:01 +00:00
ctx.Input.Reset(ctx)
obj = t3.Match("/table/123/create", ctx)
2015-04-05 15:11:50 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/table/:num/create can't get obj ")
}
}
func TestAddTree4(t *testing.T) {
tr := NewTree()
tr.AddRouter("/create", "astaxie")
tr.AddRouter("/shop/:sd/:account", "astaxie")
t4 := NewTree()
t4.AddTree("/:info:int/:num/:id", tr)
2015-12-11 05:51:01 +00:00
ctx := context.NewContext()
obj := t4.Match("/12/123/456/shop/123/account", ctx)
2015-04-05 15:11:50 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/:info:int/:num/:id/shop/:sd/:account can't get obj ")
}
2015-12-11 05:51:01 +00:00
if len(ctx.Input.Params) == 0 {
2015-04-05 15:11:50 +00:00
t.Fatal("get param error")
}
2015-12-11 05:51:01 +00:00
if ctx.Input.Params[":info"] != "12" || ctx.Input.Params[":num"] != "123" || ctx.Input.Params[":id"] != "456" || ctx.Input.Params[":sd"] != "123" || ctx.Input.Params[":account"] != "account" {
2015-04-05 15:11:50 +00:00
t.Fatal("get :info :num :id :sd :account param error")
}
2015-12-11 05:51:01 +00:00
ctx.Input.Reset(ctx)
obj = t4.Match("/12/123/456/create", ctx)
2015-04-05 15:11:50 +00:00
if obj == nil || obj.(string) != "astaxie" {
t.Fatal("/:info:int/:num/:id/create can't get obj ")
}
}
2014-06-04 15:07:57 +00:00
func TestSplitPath(t *testing.T) {
2014-12-19 07:33:51 +00:00
a := splitPath("")
if len(a) != 0 {
t.Fatal("/ should retrun []")
}
a = splitPath("/")
2014-06-04 15:07:57 +00:00
if len(a) != 0 {
t.Fatal("/ should retrun []")
}
a = splitPath("/admin")
if len(a) != 1 || a[0] != "admin" {
t.Fatal("/admin should retrun [admin]")
}
a = splitPath("/admin/")
if len(a) != 1 || a[0] != "admin" {
t.Fatal("/admin/ should retrun [admin]")
}
a = splitPath("/admin/users")
if len(a) != 2 || a[0] != "admin" || a[1] != "users" {
t.Fatal("/admin should retrun [admin users]")
}
a = splitPath("/admin/:id:int")
if len(a) != 2 || a[0] != "admin" || a[1] != ":id:int" {
t.Fatal("/admin should retrun [admin :id:int]")
}
}
func TestSplitSegment(t *testing.T) {
b, w, r := splitSegment("admin")
if b || len(w) != 0 || r != "" {
t.Fatal("admin should return false, nil, ''")
}
b, w, r = splitSegment("*")
if !b || len(w) != 1 || w[0] != ":splat" || r != "" {
t.Fatal("* should return true, [:splat], ''")
}
b, w, r = splitSegment("*.*")
if !b || len(w) != 3 || w[1] != ":path" || w[2] != ":ext" || w[0] != "." || r != "" {
t.Fatal("admin should return true,[. :path :ext], ''")
}
b, w, r = splitSegment(":id")
if !b || len(w) != 1 || w[0] != ":id" || r != "" {
t.Fatal(":id should return true, [:id], ''")
}
b, w, r = splitSegment("?:id")
if !b || len(w) != 2 || w[0] != ":" || w[1] != ":id" || r != "" {
t.Fatal("?:id should return true, [: :id], ''")
}
b, w, r = splitSegment(":id:int")
if !b || len(w) != 1 || w[0] != ":id" || r != "([0-9]+)" {
t.Fatal(":id:int should return true, [:id], '([0-9]+)'")
}
b, w, r = splitSegment(":name:string")
if !b || len(w) != 1 || w[0] != ":name" || r != `([\w]+)` {
t.Fatal(`:name:string should return true, [:name], '([\w]+)'`)
}
b, w, r = splitSegment(":id([0-9]+)")
if !b || len(w) != 1 || w[0] != ":id" || r != `([0-9]+)` {
t.Fatal(`:id([0-9]+) should return true, [:id], '([0-9]+)'`)
}
b, w, r = splitSegment(":id([0-9]+)_:name")
if !b || len(w) != 2 || w[0] != ":id" || w[1] != ":name" || r != `([0-9]+)_(.+)` {
t.Fatal(`:id([0-9]+)_:name should return true, [:id :name], '([0-9]+)_(.+)'`)
}
2014-06-11 01:33:35 +00:00
b, w, r = splitSegment(":id(.+)_cms.html")
2014-06-04 15:07:57 +00:00
if !b || len(w) != 1 || w[0] != ":id" || r != `(.+)_cms.html` {
t.Fatal(":id_cms.html should return true, [:id], '(.+)_cms.html'")
}
2014-06-11 01:33:35 +00:00
b, w, r = splitSegment("cms_:id(.+)_:page(.+).html")
2014-06-04 15:07:57 +00:00
if !b || len(w) != 2 || w[0] != ":id" || w[1] != ":page" || r != `cms_(.+)_(.+).html` {
t.Fatal(":id_cms.html should return true, [:id :page], cms_(.+)_(.+).html")
}
}