github.com/bketelsen/buffalo@v0.9.5/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  }