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