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  }