From 76811fa6f3d84bea5213424eec8845784673b05a Mon Sep 17 00:00:00 2001 From: superatrain Date: Fri, 2 Oct 2020 11:24:59 -0400 Subject: [PATCH] Return HandlerChain from Routes() --- gin.go | 18 ++++++++++-------- gin_test.go | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/gin.go b/gin.go index 1e126179..ff6cef45 100644 --- a/gin.go +++ b/gin.go @@ -42,10 +42,11 @@ func (c HandlersChain) Last() HandlerFunc { // RouteInfo represents a request route's specification which contains method and path and its handler. type RouteInfo struct { - Method string - Path string - Handler string - HandlerFunc HandlerFunc + Method string + Path string + Handler string + HandlerFunc HandlerFunc + HandlersChain []HandlerFunc } // RoutesInfo defines a RouteInfo array. @@ -287,10 +288,11 @@ func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo { if len(root.handlers) > 0 { handlerFunc := root.handlers.Last() routes = append(routes, RouteInfo{ - Method: method, - Path: path, - Handler: nameOfFunction(handlerFunc), - HandlerFunc: handlerFunc, + Method: method, + Path: path, + Handler: nameOfFunction(handlerFunc), + HandlerFunc: handlerFunc, + HandlersChain: root.handlers, }) } for _, child := range root.children { diff --git a/gin_test.go b/gin_test.go index 11bdd79c..d09efcac 100644 --- a/gin_test.go +++ b/gin_test.go @@ -444,7 +444,11 @@ func TestListOfRoutes(t *testing.T) { { group.GET("/", handlerTest2) group.GET("/:id", handlerTest1) - group.POST("/:id", handlerTest2) + } + postGroup := group.Group("") + postGroup.Use(handlerTest1) + { + postGroup.POST("/:id", handlerTest2) } router.Static("/static", ".") @@ -452,29 +456,34 @@ func TestListOfRoutes(t *testing.T) { assert.Len(t, list, 7) assertRoutePresent(t, list, RouteInfo{ - Method: "GET", - Path: "/favicon.ico", - Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + Method: "GET", + Path: "/favicon.ico", + Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + HandlersChain: []HandlerFunc{handlerTest1}, }) assertRoutePresent(t, list, RouteInfo{ - Method: "GET", - Path: "/", - Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + Method: "GET", + Path: "/", + Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + HandlersChain: []HandlerFunc{handlerTest1}, }) assertRoutePresent(t, list, RouteInfo{ - Method: "GET", - Path: "/users/", - Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest2$", + Method: "GET", + Path: "/users/", + Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest2$", + HandlersChain: []HandlerFunc{handlerTest2}, }) assertRoutePresent(t, list, RouteInfo{ - Method: "GET", - Path: "/users/:id", - Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + Method: "GET", + Path: "/users/:id", + Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest1$", + HandlersChain: []HandlerFunc{handlerTest1}, }) assertRoutePresent(t, list, RouteInfo{ - Method: "POST", - Path: "/users/:id", - Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest2$", + Method: "POST", + Path: "/users/:id", + Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handlerTest2$", + HandlersChain: []HandlerFunc{handlerTest1, handlerTest2}, }) } @@ -535,6 +544,7 @@ func TestEngineHandleContextManyReEntries(t *testing.T) { func assertRoutePresent(t *testing.T, gotRoutes RoutesInfo, wantRoute RouteInfo) { for _, gotRoute := range gotRoutes { if gotRoute.Path == wantRoute.Path && gotRoute.Method == wantRoute.Method { + assert.ObjectsAreEqualValues(gotRoute.HandlersChain, wantRoute.HandlersChain) assert.Regexp(t, wantRoute.Handler, gotRoute.Handler) return }