From 71dac68d530ac41fca0ac41c3d74997815e883a7 Mon Sep 17 00:00:00 2001 From: gzdaijie Date: Thu, 9 Jan 2020 00:27:57 +0800 Subject: [PATCH] support group prefix nesting and add Group unit tests --- day1-http-base/base3/gee/gee.go | 2 ++ day2-context/gee/gee.go | 2 ++ day3-router/gee/gee.go | 2 ++ day4-group/gee/gee.go | 23 ++++++++++-------- day4-group/gee/gee_test.go | 32 +++++++++++++++++++++++++ day4-group/gee/router_test.go | 38 ++++-------------------------- day5-middleware/gee/gee.go | 16 ++++++++++--- day5-middleware/gee/gee_test.go | 32 +++++++++++++++++++++++++ day6-template/gee/gee.go | 16 ++++++++++--- day6-template/gee/gee_test.go | 32 +++++++++++++++++++++++++ day7-panic-recover/gee/gee.go | 16 ++++++++++--- day7-panic-recover/gee/gee_test.go | 32 +++++++++++++++++++++++++ 12 files changed, 191 insertions(+), 52 deletions(-) create mode 100644 day4-group/gee/gee_test.go create mode 100644 day5-middleware/gee/gee_test.go create mode 100644 day6-template/gee/gee_test.go create mode 100644 day7-panic-recover/gee/gee_test.go diff --git a/day1-http-base/base3/gee/gee.go b/day1-http-base/base3/gee/gee.go index 8c38b4c..3aefd75 100644 --- a/day1-http-base/base3/gee/gee.go +++ b/day1-http-base/base3/gee/gee.go @@ -2,6 +2,7 @@ package gee import ( "fmt" + "log" "net/http" ) @@ -20,6 +21,7 @@ func New() *Engine { func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) { key := method + "-" + pattern + log.Printf("Route %4s - %s", method, pattern) engine.router[key] = handler } diff --git a/day2-context/gee/gee.go b/day2-context/gee/gee.go index ce0d4da..802bb5e 100644 --- a/day2-context/gee/gee.go +++ b/day2-context/gee/gee.go @@ -1,6 +1,7 @@ package gee import ( + "log" "net/http" ) @@ -18,6 +19,7 @@ func New() *Engine { } func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) { + log.Printf("Route %4s - %s", method, pattern) engine.router.addRoute(method, pattern, handler) } diff --git a/day3-router/gee/gee.go b/day3-router/gee/gee.go index ce0d4da..802bb5e 100644 --- a/day3-router/gee/gee.go +++ b/day3-router/gee/gee.go @@ -1,6 +1,7 @@ package gee import ( + "log" "net/http" ) @@ -18,6 +19,7 @@ func New() *Engine { } func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) { + log.Printf("Route %4s - %s", method, pattern) engine.router.addRoute(method, pattern, handler) } diff --git a/day4-group/gee/gee.go b/day4-group/gee/gee.go index 0d7a5ba..604e5be 100644 --- a/day4-group/gee/gee.go +++ b/day4-group/gee/gee.go @@ -1,6 +1,7 @@ package gee import ( + "log" "net/http" ) @@ -36,7 +37,7 @@ func New() *Engine { func (group *RouterGroup) Group(prefix string) *RouterGroup { engine := group.engine newGroup := &RouterGroup{ - prefix: group.prefix + prefix, + prefix: prefix, parent: group, engine: engine, } @@ -45,10 +46,20 @@ func (group *RouterGroup) Group(prefix string) *RouterGroup { } func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) { - pattern := getNestPrefix(group.parent, group.prefix) + comp + pattern := group.getNestPrefix() + comp + log.Printf("Route %4s - %s", method, pattern) group.engine.router.addRoute(method, pattern, handler) } +// Support group nesting +func (group *RouterGroup) getNestPrefix() string { + p := group.prefix + if group.parent == nil { + return p + } + return group.parent.getNestPrefix() + p +} + // GET defines the method to add GET request func (group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler) @@ -68,11 +79,3 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { c := newContext(w, req) engine.router.handle(c) } - -func getNestPrefix(group *RouterGroup, p string) string { - p = strings.Join([]string{group.prefix, p}, "") - if group.parent == nil { - return p - } - return getNestPrefix(group.parent, p) -} diff --git a/day4-group/gee/gee_test.go b/day4-group/gee/gee_test.go new file mode 100644 index 0000000..8c03dc1 --- /dev/null +++ b/day4-group/gee/gee_test.go @@ -0,0 +1,32 @@ +package gee + +import "testing" + +func TestNestingGroup(t *testing.T) { + v1 := &RouterGroup{ + prefix: "/v1", + } + v2 := &RouterGroup{ + prefix: "/v2", + parent: v1, + } + v3 := &RouterGroup{ + prefix: "/v3", + parent: v2, + } + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } + if v3.getNestPrefix() != "/v1/v2/v3" { + t.Fatal("v3 prefix should be /v1/v2/v3") + } +} + +func TestGroup(t *testing.T) { + r := New() + v1 := r.Group("/v1") + v2 := v1.Group("/v2") + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } +} diff --git a/day4-group/gee/router_test.go b/day4-group/gee/router_test.go index a4a6611..f5d6da3 100644 --- a/day4-group/gee/router_test.go +++ b/day4-group/gee/router_test.go @@ -17,20 +17,11 @@ func newTestRouter() *router { } func TestParsePattern(t *testing.T) { - testCases := [][]string{ - parsePattern("/p/:name"), - parsePattern("/p/*"), - parsePattern("/p/*name/*"), - } - wants := [][]string{ - []string{"p", ":name"}, - []string{"p", "*"}, - []string{"p", "*name"}, - } - for index, result := range testCases { - if reflect.DeepEqual(result, wants[index]) { - t.Fatal("test parsePattern failed") - } + ok := reflect.DeepEqual(parsePattern("/p/:name"), []string{"p", ":name"}) + ok = ok && reflect.DeepEqual(parsePattern("/p/*"), []string{"p", "*"}) + ok = ok && reflect.DeepEqual(parsePattern("/p/*name/*"), []string{"p", "*name"}) + if !ok { + t.Fatal("test parsePattern failed") } } @@ -81,22 +72,3 @@ func TestGetRoutes(t *testing.T) { t.Fatal("the number of routes shoule be 4") } } - -func TestNestingGroup(t *testing.T) { - r := &RouterGroup{ - prefix: "/v1", - middleWares: nil, - engine: nil, - parent: nil, - } - r2 := &RouterGroup{ - prefix: "/v2", - middleWares: nil, - engine: nil, - parent: r, - } - res := getNestPrefix(r2, "/hello") - if res != "/v1/v2/hello" { - t.Fatal("match failed") - } -} diff --git a/day5-middleware/gee/gee.go b/day5-middleware/gee/gee.go index e880d19..7ea237b 100644 --- a/day5-middleware/gee/gee.go +++ b/day5-middleware/gee/gee.go @@ -1,6 +1,7 @@ package gee import ( + "log" "net/http" "strings" ) @@ -37,7 +38,7 @@ func New() *Engine { func (group *RouterGroup) Group(prefix string) *RouterGroup { engine := group.engine newGroup := &RouterGroup{ - prefix: group.prefix + prefix, + prefix: prefix, parent: group, engine: engine, } @@ -51,11 +52,20 @@ func (group *RouterGroup) Use(middlewares ...HandlerFunc) { } func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) { - pattern := group.prefix + comp - + pattern := group.getNestPrefix() + comp + log.Printf("Route %4s - %s", method, pattern) group.engine.router.addRoute(method, pattern, handler) } +// Support group nesting +func (group *RouterGroup) getNestPrefix() string { + p := group.prefix + if group.parent == nil { + return p + } + return group.parent.getNestPrefix() + p +} + // GET defines the method to add GET request func (group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler) diff --git a/day5-middleware/gee/gee_test.go b/day5-middleware/gee/gee_test.go new file mode 100644 index 0000000..8c03dc1 --- /dev/null +++ b/day5-middleware/gee/gee_test.go @@ -0,0 +1,32 @@ +package gee + +import "testing" + +func TestNestingGroup(t *testing.T) { + v1 := &RouterGroup{ + prefix: "/v1", + } + v2 := &RouterGroup{ + prefix: "/v2", + parent: v1, + } + v3 := &RouterGroup{ + prefix: "/v3", + parent: v2, + } + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } + if v3.getNestPrefix() != "/v1/v2/v3" { + t.Fatal("v3 prefix should be /v1/v2/v3") + } +} + +func TestGroup(t *testing.T) { + r := New() + v1 := r.Group("/v1") + v2 := v1.Group("/v2") + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } +} diff --git a/day6-template/gee/gee.go b/day6-template/gee/gee.go index 357f6e9..6a56722 100644 --- a/day6-template/gee/gee.go +++ b/day6-template/gee/gee.go @@ -2,6 +2,7 @@ package gee import ( "html/template" + "log" "net/http" "path" "strings" @@ -41,7 +42,7 @@ func New() *Engine { func (group *RouterGroup) Group(prefix string) *RouterGroup { engine := group.engine newGroup := &RouterGroup{ - prefix: group.prefix + prefix, + prefix: prefix, parent: group, engine: engine, } @@ -55,11 +56,20 @@ func (group *RouterGroup) Use(middlewares ...HandlerFunc) { } func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) { - pattern := group.prefix + comp - + pattern := group.getNestPrefix() + comp + log.Printf("Route %4s - %s", method, pattern) group.engine.router.addRoute(method, pattern, handler) } +// Support group nesting +func (group *RouterGroup) getNestPrefix() string { + p := group.prefix + if group.parent == nil { + return p + } + return group.parent.getNestPrefix() + p +} + // GET defines the method to add GET request func (group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler) diff --git a/day6-template/gee/gee_test.go b/day6-template/gee/gee_test.go new file mode 100644 index 0000000..8c03dc1 --- /dev/null +++ b/day6-template/gee/gee_test.go @@ -0,0 +1,32 @@ +package gee + +import "testing" + +func TestNestingGroup(t *testing.T) { + v1 := &RouterGroup{ + prefix: "/v1", + } + v2 := &RouterGroup{ + prefix: "/v2", + parent: v1, + } + v3 := &RouterGroup{ + prefix: "/v3", + parent: v2, + } + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } + if v3.getNestPrefix() != "/v1/v2/v3" { + t.Fatal("v3 prefix should be /v1/v2/v3") + } +} + +func TestGroup(t *testing.T) { + r := New() + v1 := r.Group("/v1") + v2 := v1.Group("/v2") + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } +} diff --git a/day7-panic-recover/gee/gee.go b/day7-panic-recover/gee/gee.go index 9eeb356..4dde8de 100644 --- a/day7-panic-recover/gee/gee.go +++ b/day7-panic-recover/gee/gee.go @@ -2,6 +2,7 @@ package gee import ( "html/template" + "log" "net/http" "path" "strings" @@ -48,7 +49,7 @@ func Default() *Engine { func (group *RouterGroup) Group(prefix string) *RouterGroup { engine := group.engine newGroup := &RouterGroup{ - prefix: group.prefix + prefix, + prefix: prefix, parent: group, engine: engine, } @@ -62,11 +63,20 @@ func (group *RouterGroup) Use(middlewares ...HandlerFunc) { } func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) { - pattern := group.prefix + comp - + pattern := group.getNestPrefix() + comp + log.Printf("Route %4s - %s", method, pattern) group.engine.router.addRoute(method, pattern, handler) } +// Support group nesting +func (group *RouterGroup) getNestPrefix() string { + p := group.prefix + if group.parent == nil { + return p + } + return group.parent.getNestPrefix() + p +} + // GET defines the method to add GET request func (group *RouterGroup) GET(pattern string, handler HandlerFunc) { group.addRoute("GET", pattern, handler) diff --git a/day7-panic-recover/gee/gee_test.go b/day7-panic-recover/gee/gee_test.go new file mode 100644 index 0000000..8c03dc1 --- /dev/null +++ b/day7-panic-recover/gee/gee_test.go @@ -0,0 +1,32 @@ +package gee + +import "testing" + +func TestNestingGroup(t *testing.T) { + v1 := &RouterGroup{ + prefix: "/v1", + } + v2 := &RouterGroup{ + prefix: "/v2", + parent: v1, + } + v3 := &RouterGroup{ + prefix: "/v3", + parent: v2, + } + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } + if v3.getNestPrefix() != "/v1/v2/v3" { + t.Fatal("v3 prefix should be /v1/v2/v3") + } +} + +func TestGroup(t *testing.T) { + r := New() + v1 := r.Group("/v1") + v2 := v1.Group("/v2") + if v2.getNestPrefix() != "/v1/v2" { + t.Fatal("v2 prefix should be /v1/v2") + } +}