support group prefix nesting

and add Group unit tests
This commit is contained in:
gzdaijie
2020-01-09 00:27:57 +08:00
parent cfc436847e
commit 71dac68d53
12 changed files with 191 additions and 52 deletions
+2
View File
@@ -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
}
+2
View File
@@ -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)
}
+2
View File
@@ -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)
}
+13 -10
View File
@@ -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)
}
+32
View File
@@ -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")
}
}
+5 -33
View File
@@ -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")
}
}
+13 -3
View File
@@ -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)
+32
View File
@@ -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")
}
}
+13 -3
View File
@@ -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)
+32
View File
@@ -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")
}
}
+13 -3
View File
@@ -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)
+32
View File
@@ -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")
}
}