github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/middleware_test.go (about) 1 package buffalo 2 3 import ( 4 "net/http" 5 "testing" 6 7 "github.com/gobuffalo/buffalo/render" 8 "github.com/gobuffalo/httptest" 9 "github.com/stretchr/testify/require" 10 ) 11 12 // Test_App_Use tests that middleware gets added 13 func Test_App_Use(t *testing.T) { 14 r := require.New(t) 15 16 log := []string{} 17 a := New(Options{}) 18 a.Use(func(h Handler) Handler { 19 return func(c Context) error { 20 log = append(log, "start") 21 err := h(c) 22 log = append(log, "end") 23 return err 24 } 25 }) 26 27 a.GET("/", func(c Context) error { 28 log = append(log, "handler") 29 return nil 30 }) 31 32 w := httptest.New(a) 33 w.HTML("/").Get() 34 r.Len(log, 3) 35 r.Equal([]string{"start", "handler", "end"}, log) 36 } 37 38 // Test_Middleware_Replace tests that middleware gets added 39 func Test_Middleware_Replace(t *testing.T) { 40 r := require.New(t) 41 42 log := []string{} 43 a := New(Options{}) 44 mw1 := func(h Handler) Handler { 45 return func(c Context) error { 46 log = append(log, "m1 start") 47 err := h(c) 48 log = append(log, "m1 end") 49 return err 50 } 51 } 52 mw2 := func(h Handler) Handler { 53 return func(c Context) error { 54 log = append(log, "m2 start") 55 err := h(c) 56 log = append(log, "m2 end") 57 return err 58 } 59 } 60 a.Use(mw1) 61 a.Middleware.Replace(mw1, mw2) 62 63 a.GET("/", func(c Context) error { 64 log = append(log, "handler") 65 return nil 66 }) 67 68 w := httptest.New(a) 69 w.HTML("/").Get() 70 r.Len(log, 3) 71 r.Equal([]string{"m2 start", "handler", "m2 end"}, log) 72 } 73 74 // Test_Middleware_Skip tests that middleware gets skipped 75 func Test_Middleware_Skip(t *testing.T) { 76 r := require.New(t) 77 78 log := []string{} 79 a := New(Options{}) 80 mw1 := func(h Handler) Handler { 81 return func(c Context) error { 82 log = append(log, "mw1 start") 83 err := h(c) 84 log = append(log, "mw1 end") 85 return err 86 } 87 } 88 mw2 := func(h Handler) Handler { 89 return func(c Context) error { 90 log = append(log, "mw2 start") 91 err := h(c) 92 log = append(log, "mw2 end") 93 return err 94 } 95 } 96 a.Use(mw1) 97 a.Use(mw2) 98 99 h1 := func(c Context) error { 100 log = append(log, "h1") 101 return nil 102 } 103 h2 := func(c Context) error { 104 log = append(log, "h2") 105 return nil 106 } 107 108 a.GET("/h1", h1) 109 a.GET("/h2", h2) 110 111 a.Middleware.Skip(mw2, h2) 112 113 w := httptest.New(a) 114 115 w.HTML("/h2").Get() 116 r.Len(log, 3) 117 r.Equal([]string{"mw1 start", "h2", "mw1 end"}, log) 118 119 log = []string{} 120 w.HTML("/h1").Get() 121 r.Len(log, 5) 122 r.Equal([]string{"mw1 start", "mw2 start", "h1", "mw2 end", "mw1 end"}, log) 123 } 124 125 type carsResource struct { 126 Resource 127 } 128 129 func (ur *carsResource) Show(c Context) error { 130 return c.Render(http.StatusOK, render.String("show")) 131 } 132 133 func (ur *carsResource) List(c Context) error { 134 return c.Render(http.StatusOK, render.String("list")) 135 } 136 137 // Test_Middleware_Skip tests that middleware gets skipped 138 func Test_Middleware_Skip_Resource(t *testing.T) { 139 r := require.New(t) 140 141 log := []string{} 142 mw1 := func(h Handler) Handler { 143 return func(c Context) error { 144 log = append(log, "mw1 start") 145 err := h(c) 146 log = append(log, "mw1 end") 147 return err 148 } 149 } 150 151 a := New(Options{}) 152 var cr Resource = &carsResource{} 153 g := a.Resource("/autos", cr) 154 g.Use(mw1) 155 156 var ur Resource = &carsResource{} 157 g = a.Resource("/cars", ur) 158 g.Use(mw1) 159 160 // fmt.Println("set up skip") 161 g.Middleware.Skip(mw1, ur.Show) 162 163 w := httptest.New(a) 164 165 // fmt.Println("make autos call") 166 log = []string{} 167 res := w.HTML("/autos/1").Get() 168 r.Len(log, 2) 169 r.Equal("show", res.Body.String()) 170 171 // fmt.Println("make list call") 172 log = []string{} 173 res = w.HTML("/cars").Get() 174 r.Len(log, 2) 175 r.Equal([]string{"mw1 start", "mw1 end"}, log) 176 r.Equal("list", res.Body.String()) 177 178 // fmt.Println("make show call") 179 log = []string{} 180 res = w.HTML("/cars/1").Get() 181 r.Len(log, 0) 182 r.Equal("show", res.Body.String()) 183 184 } 185 186 // Test_Middleware_Clear confirms that middle gets cleared 187 func Test_Middleware_Clear(t *testing.T) { 188 r := require.New(t) 189 mws := newMiddlewareStack() 190 mw := func(h Handler) Handler { return h } 191 mws.Use(mw) 192 mws.Skip(mw, voidHandler) 193 194 r.Len(mws.stack, 1) 195 r.Len(mws.skips, 1) 196 197 mws.Clear() 198 199 r.Len(mws.stack, 0) 200 r.Len(mws.skips, 0) 201 } 202 203 func Test_Middleware_Remove(t *testing.T) { 204 r := require.New(t) 205 log := []string{} 206 207 mw1 := func(h Handler) Handler { 208 log = append(log, "mw1") 209 return h 210 } 211 212 mw2 := func(h Handler) Handler { 213 log = append(log, "mw2") 214 return h 215 } 216 217 a := New(Options{}) 218 a.Use(mw2) 219 a.Use(mw1) 220 221 var cr Resource = &carsResource{} 222 g := a.Resource("/autos", cr) 223 g.Middleware.Remove(mw2) 224 225 a.Resource("/all_log_autos", cr) 226 w := httptest.New(a) 227 228 ng := a.Resource("/no_log_autos", cr) 229 ng.Middleware.Remove(mw1, mw2) 230 231 _ = w.HTML("/autos/1").Get() 232 r.Len(log, 1) 233 r.Equal("mw1", log[0]) 234 235 log = []string{} 236 _ = w.HTML("/all_log_autos/1").Get() 237 r.Len(log, 2) 238 r.Contains(log, "mw2") 239 r.Contains(log, "mw1") 240 241 log = []string{} 242 _ = w.HTML("/no_log_autos/1").Get() 243 r.Len(log, 0) 244 }