routergroup_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package gin
  5. import (
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func init() {
  10. SetMode(TestMode)
  11. }
  12. func TestRouterGroupBasic(t *testing.T) {
  13. router := New()
  14. group := router.Group("/hola", func(c *Context) {})
  15. group.Use(func(c *Context) {})
  16. assert.Len(t, group.Handlers, 2)
  17. assert.Equal(t, group.BasePath(), "/hola")
  18. assert.Equal(t, group.engine, router)
  19. group2 := group.Group("manu")
  20. group2.Use(func(c *Context) {}, func(c *Context) {})
  21. assert.Len(t, group2.Handlers, 4)
  22. assert.Equal(t, group2.BasePath(), "/hola/manu")
  23. assert.Equal(t, group2.engine, router)
  24. }
  25. func TestRouterGroupBasicHandle(t *testing.T) {
  26. performRequestInGroup(t, "GET")
  27. performRequestInGroup(t, "POST")
  28. performRequestInGroup(t, "PUT")
  29. performRequestInGroup(t, "PATCH")
  30. performRequestInGroup(t, "DELETE")
  31. performRequestInGroup(t, "HEAD")
  32. performRequestInGroup(t, "OPTIONS")
  33. }
  34. func performRequestInGroup(t *testing.T, method string) {
  35. router := New()
  36. v1 := router.Group("v1", func(c *Context) {})
  37. assert.Equal(t, v1.BasePath(), "/v1")
  38. login := v1.Group("/login/", func(c *Context) {}, func(c *Context) {})
  39. assert.Equal(t, login.BasePath(), "/v1/login/")
  40. handler := func(c *Context) {
  41. c.String(400, "the method was %s and index %d", c.Request.Method, c.index)
  42. }
  43. switch method {
  44. case "GET":
  45. v1.GET("/test", handler)
  46. login.GET("/test", handler)
  47. case "POST":
  48. v1.POST("/test", handler)
  49. login.POST("/test", handler)
  50. case "PUT":
  51. v1.PUT("/test", handler)
  52. login.PUT("/test", handler)
  53. case "PATCH":
  54. v1.PATCH("/test", handler)
  55. login.PATCH("/test", handler)
  56. case "DELETE":
  57. v1.DELETE("/test", handler)
  58. login.DELETE("/test", handler)
  59. case "HEAD":
  60. v1.HEAD("/test", handler)
  61. login.HEAD("/test", handler)
  62. case "OPTIONS":
  63. v1.OPTIONS("/test", handler)
  64. login.OPTIONS("/test", handler)
  65. default:
  66. panic("unknown method")
  67. }
  68. w := performRequest(router, method, "/v1/login/test")
  69. assert.Equal(t, w.Code, 400)
  70. assert.Equal(t, w.Body.String(), "the method was "+method+" and index 3")
  71. w = performRequest(router, method, "/v1/test")
  72. assert.Equal(t, w.Code, 400)
  73. assert.Equal(t, w.Body.String(), "the method was "+method+" and index 1")
  74. }
  75. func TestRouterGroupInvalidStatic(t *testing.T) {
  76. router := New()
  77. assert.Panics(t, func() {
  78. router.Static("/path/:param", "/")
  79. })
  80. assert.Panics(t, func() {
  81. router.Static("/path/*param", "/")
  82. })
  83. }
  84. func TestRouterGroupInvalidStaticFile(t *testing.T) {
  85. router := New()
  86. assert.Panics(t, func() {
  87. router.StaticFile("/path/:param", "favicon.ico")
  88. })
  89. assert.Panics(t, func() {
  90. router.StaticFile("/path/*param", "favicon.ico")
  91. })
  92. }
  93. func TestRouterGroupTooManyHandlers(t *testing.T) {
  94. router := New()
  95. handlers1 := make([]HandlerFunc, 40)
  96. router.Use(handlers1...)
  97. handlers2 := make([]HandlerFunc, 26)
  98. assert.Panics(t, func() {
  99. router.Use(handlers2...)
  100. })
  101. assert.Panics(t, func() {
  102. router.GET("/", handlers2...)
  103. })
  104. }
  105. func TestRouterGroupBadMethod(t *testing.T) {
  106. router := New()
  107. assert.Panics(t, func() {
  108. router.Handle("get", "/")
  109. })
  110. assert.Panics(t, func() {
  111. router.Handle(" GET", "/")
  112. })
  113. assert.Panics(t, func() {
  114. router.Handle("GET ", "/")
  115. })
  116. assert.Panics(t, func() {
  117. router.Handle("", "/")
  118. })
  119. assert.Panics(t, func() {
  120. router.Handle("PO ST", "/")
  121. })
  122. assert.Panics(t, func() {
  123. router.Handle("1GET", "/")
  124. })
  125. assert.Panics(t, func() {
  126. router.Handle("PATCh", "/")
  127. })
  128. }
  129. func TestRouterGroupPipeline(t *testing.T) {
  130. router := New()
  131. testRoutesInterface(t, router)
  132. v1 := router.Group("/v1")
  133. testRoutesInterface(t, v1)
  134. }
  135. func testRoutesInterface(t *testing.T, r IRoutes) {
  136. handler := func(c *Context) {}
  137. assert.Equal(t, r, r.Use(handler))
  138. assert.Equal(t, r, r.Handle("GET", "/handler", handler))
  139. assert.Equal(t, r, r.Any("/any", handler))
  140. assert.Equal(t, r, r.GET("/", handler))
  141. assert.Equal(t, r, r.POST("/", handler))
  142. assert.Equal(t, r, r.DELETE("/", handler))
  143. assert.Equal(t, r, r.PATCH("/", handler))
  144. assert.Equal(t, r, r.PUT("/", handler))
  145. assert.Equal(t, r, r.OPTIONS("/", handler))
  146. assert.Equal(t, r, r.HEAD("/", handler))
  147. assert.Equal(t, r, r.StaticFile("/file", "."))
  148. assert.Equal(t, r, r.Static("/static", "."))
  149. assert.Equal(t, r, r.StaticFS("/static2", Dir(".", false)))
  150. }