mirror of
https://github.com/geektutu/7days-golang.git
synced 2024-04-21 12:32:11 +00:00
support group prefix nesting
and add Group unit tests
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user