middleware_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. "errors"
  7. "testing"
  8. "github.com/manucorporat/sse"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestMiddlewareGeneralCase(t *testing.T) {
  12. signature := ""
  13. router := New()
  14. router.Use(func(c *Context) {
  15. signature += "A"
  16. c.Next()
  17. signature += "B"
  18. })
  19. router.Use(func(c *Context) {
  20. signature += "C"
  21. })
  22. router.GET("/", func(c *Context) {
  23. signature += "D"
  24. })
  25. router.NoRoute(func(c *Context) {
  26. signature += " X "
  27. })
  28. router.NoMethod(func(c *Context) {
  29. signature += " XX "
  30. })
  31. // RUN
  32. w := performRequest(router, "GET", "/")
  33. // TEST
  34. assert.Equal(t, w.Code, 200)
  35. assert.Equal(t, signature, "ACDB")
  36. }
  37. func TestMiddlewareNoRoute(t *testing.T) {
  38. signature := ""
  39. router := New()
  40. router.Use(func(c *Context) {
  41. signature += "A"
  42. c.Next()
  43. signature += "B"
  44. })
  45. router.Use(func(c *Context) {
  46. signature += "C"
  47. c.Next()
  48. c.Next()
  49. c.Next()
  50. c.Next()
  51. signature += "D"
  52. })
  53. router.NoRoute(func(c *Context) {
  54. signature += "E"
  55. c.Next()
  56. signature += "F"
  57. }, func(c *Context) {
  58. signature += "G"
  59. c.Next()
  60. signature += "H"
  61. })
  62. router.NoMethod(func(c *Context) {
  63. signature += " X "
  64. })
  65. // RUN
  66. w := performRequest(router, "GET", "/")
  67. // TEST
  68. assert.Equal(t, w.Code, 404)
  69. assert.Equal(t, signature, "ACEGHFDB")
  70. }
  71. func TestMiddlewareNoMethod(t *testing.T) {
  72. signature := ""
  73. router := New()
  74. router.Use(func(c *Context) {
  75. signature += "A"
  76. c.Next()
  77. signature += "B"
  78. })
  79. router.Use(func(c *Context) {
  80. signature += "C"
  81. c.Next()
  82. signature += "D"
  83. })
  84. router.NoMethod(func(c *Context) {
  85. signature += "E"
  86. c.Next()
  87. signature += "F"
  88. }, func(c *Context) {
  89. signature += "G"
  90. c.Next()
  91. signature += "H"
  92. })
  93. router.NoRoute(func(c *Context) {
  94. signature += " X "
  95. })
  96. router.POST("/", func(c *Context) {
  97. signature += " XX "
  98. })
  99. // RUN
  100. w := performRequest(router, "GET", "/")
  101. // TEST
  102. assert.Equal(t, w.Code, 405)
  103. assert.Equal(t, signature, "ACEGHFDB")
  104. }
  105. func TestMiddlewareAbort(t *testing.T) {
  106. signature := ""
  107. router := New()
  108. router.Use(func(c *Context) {
  109. signature += "A"
  110. })
  111. router.Use(func(c *Context) {
  112. signature += "C"
  113. c.AbortWithStatus(401)
  114. c.Next()
  115. signature += "D"
  116. })
  117. router.GET("/", func(c *Context) {
  118. signature += " X "
  119. c.Next()
  120. signature += " XX "
  121. })
  122. // RUN
  123. w := performRequest(router, "GET", "/")
  124. // TEST
  125. assert.Equal(t, w.Code, 401)
  126. assert.Equal(t, signature, "ACD")
  127. }
  128. func TestMiddlewareAbortHandlersChainAndNext(t *testing.T) {
  129. signature := ""
  130. router := New()
  131. router.Use(func(c *Context) {
  132. signature += "A"
  133. c.Next()
  134. c.AbortWithStatus(410)
  135. signature += "B"
  136. })
  137. router.GET("/", func(c *Context) {
  138. signature += "C"
  139. c.Next()
  140. })
  141. // RUN
  142. w := performRequest(router, "GET", "/")
  143. // TEST
  144. assert.Equal(t, w.Code, 410)
  145. assert.Equal(t, signature, "ACB")
  146. }
  147. // TestFailHandlersChain - ensure that Fail interrupt used middlewares in fifo order as
  148. // as well as Abort
  149. func TestMiddlewareFailHandlersChain(t *testing.T) {
  150. // SETUP
  151. signature := ""
  152. router := New()
  153. router.Use(func(context *Context) {
  154. signature += "A"
  155. context.AbortWithError(500, errors.New("foo"))
  156. })
  157. router.Use(func(context *Context) {
  158. signature += "B"
  159. context.Next()
  160. signature += "C"
  161. })
  162. // RUN
  163. w := performRequest(router, "GET", "/")
  164. // TEST
  165. assert.Equal(t, w.Code, 500)
  166. assert.Equal(t, signature, "A")
  167. }
  168. func TestMiddlewareWrite(t *testing.T) {
  169. router := New()
  170. router.Use(func(c *Context) {
  171. c.String(400, "hola\n")
  172. })
  173. router.Use(func(c *Context) {
  174. c.XML(400, H{"foo": "bar"})
  175. })
  176. router.Use(func(c *Context) {
  177. c.JSON(400, H{"foo": "bar"})
  178. })
  179. router.GET("/", func(c *Context) {
  180. c.JSON(400, H{"foo": "bar"})
  181. }, func(c *Context) {
  182. c.Render(400, sse.Event{
  183. Event: "test",
  184. Data: "message",
  185. })
  186. })
  187. w := performRequest(router, "GET", "/")
  188. assert.Equal(t, w.Code, 400)
  189. assert.Equal(t, w.Body.String(), `hola
  190. <map><foo>bar</foo></map>{"foo":"bar"}
  191. {"foo":"bar"}
  192. event: test
  193. data: message
  194. `)
  195. }