Exemplo n.º 1
0
func Test_Tree_Match(t *testing.T) {
	type result struct {
		pattern string
		reqUrl  string
		params  map[string]string
	}

	cases := []result{
		{"/:id", "/123", map[string]string{":id": "123"}},
		{"/hello/?:id", "/hello", map[string]string{":id": ""}},
		{"/", "/", nil},
		{"", "", nil},
		{"/customer/login", "/customer/login", nil},
		{"/customer/login", "/customer/login.json", map[string]string{":ext": "json"}},
		{"/*", "/customer/123", map[string]string{":splat": "customer/123"}},
		{"/*", "/customer/2009/12/11", map[string]string{":splat": "customer/2009/12/11"}},
		{"/aa/*/bb", "/aa/2009/bb", map[string]string{":splat": "2009"}},
		{"/cc/*/dd", "/cc/2009/11/dd", map[string]string{":splat": "2009/11"}},
		{"/ee/:year/*/ff", "/ee/2009/11/ff", map[string]string{":year": "2009", ":splat": "11"}},
		{"/thumbnail/:size/uploads/*", "/thumbnail/100x100/uploads/items/2014/04/20/dPRCdChkUd651t1Hvs18.jpg",
			map[string]string{":size": "100x100", ":splat": "items/2014/04/20/dPRCdChkUd651t1Hvs18.jpg"}},
		{"/*.*", "/nice/api.json", map[string]string{":path": "nice/api", ":ext": "json"}},
		{"/:name/*.*", "/nice/api.json", map[string]string{":name": "nice", ":path": "api", ":ext": "json"}},
		{"/:name/test/*.*", "/nice/test/api.json", map[string]string{":name": "nice", ":path": "api", ":ext": "json"}},
		{"/dl/:width:int/:height:int/*.*", "/dl/48/48/05ac66d9bda00a3acf948c43e306fc9a.jpg",
			map[string]string{":width": "48", ":height": "48", ":ext": "jpg", ":path": "05ac66d9bda00a3acf948c43e306fc9a"}},
		{"/v1/shop/:id:int", "/v1/shop/123", map[string]string{":id": "123"}},
		{"/:year:int/:month:int/:id/:endid", "/1111/111/aaa/aaa", map[string]string{":year": "1111", ":month": "111", ":id": "aaa", ":endid": "aaa"}},
		{"/v1/shop/:id/:name", "/v1/shop/123/nike", map[string]string{":id": "123", ":name": "nike"}},
		{"/v1/shop/:id/account", "/v1/shop/123/account", map[string]string{":id": "123"}},
		{"/v1/shop/:name:string", "/v1/shop/nike", map[string]string{":name": "nike"}},
		{"/v1/shop/:id([0-9]+)", "/v1/shop//123", map[string]string{":id": "123"}},
		{"/v1/shop/:id([0-9]+)_:name", "/v1/shop/123_nike", map[string]string{":id": "123", ":name": "nike"}},
		{"/v1/shop/:id(.+)_cms.html", "/v1/shop/123_cms.html", map[string]string{":id": "123"}},
		{"/v1/shop/cms_:id(.+)_:page(.+).html", "/v1/shop/cms_123_1.html", map[string]string{":id": "123", ":page": "1"}},
		{"/v1/:v/cms/aaa_:id(.+)_:page(.+).html", "/v1/2/cms/aaa_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}},
		{"/v1/:v/cms_:id(.+)_:page(.+).html", "/v1/2/cms_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}},
		{"/v1/:v(.+)_cms/ttt_:id(.+)_:page(.+).html", "/v1/2_cms/ttt_123_1.html", map[string]string{":v": "2", ":id": "123", ":page": "1"}},
	}

	Convey("Match routers in tree", t, func() {
		for _, c := range cases {
			t := NewTree()
			t.AddRouter(c.pattern, nil)
			_, params := t.Match(c.reqUrl)
			if params != nil {
				for k, v := range c.params {
					vv, ok := params[k]
					So(ok, ShouldBeTrue)
					So(vv, ShouldEqual, v)
				}

				So(MatchTest(c.pattern, c.reqUrl), ShouldBeTrue)
			}
		}
	})
}