1
0

chain_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package chain
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "reflect"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. // A constructor for middleware
  10. // that writes its own "tag" into the RW and does nothing else.
  11. // Useful in checking if a chain is behaving in the right order.
  12. func tagMiddleware(tag string) Middleware {
  13. return func(h http.Handler) http.Handler {
  14. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  15. w.Write([]byte(tag))
  16. h.ServeHTTP(w, r)
  17. })
  18. }
  19. }
  20. // Not recommended (https://golang.org/pkg/reflect/#Value.Pointer),
  21. // but the best we can do.
  22. func funcsEqual(f1, f2 any) bool {
  23. val1 := reflect.ValueOf(f1)
  24. val2 := reflect.ValueOf(f2)
  25. return val1.Pointer() == val2.Pointer()
  26. }
  27. var testApp = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  28. w.Write([]byte("app\n"))
  29. })
  30. func TestNew(t *testing.T) {
  31. c1 := func(h http.Handler) http.Handler {
  32. return nil
  33. }
  34. c2 := func(h http.Handler) http.Handler {
  35. return http.StripPrefix("potato", nil)
  36. }
  37. slice := []Middleware{c1, c2}
  38. c := New(slice...)
  39. for k := range slice {
  40. assert.True(t, funcsEqual(c.(chain).middlewares[k], slice[k]),
  41. "New does not add constructors correctly")
  42. }
  43. }
  44. func TestThenWorksWithNoMiddleware(t *testing.T) {
  45. assert.True(t, funcsEqual(New().Then(testApp), testApp),
  46. "Then does not work with no middleware")
  47. }
  48. func TestThenTreatsNilAsDefaultServeMux(t *testing.T) {
  49. assert.Equal(t, http.DefaultServeMux, New().Then(nil),
  50. "Then does not treat nil as DefaultServeMux")
  51. }
  52. func TestThenFuncTreatsNilAsDefaultServeMux(t *testing.T) {
  53. assert.Equal(t, http.DefaultServeMux, New().ThenFunc(nil),
  54. "ThenFunc does not treat nil as DefaultServeMux")
  55. }
  56. func TestThenFuncConstructsHandlerFunc(t *testing.T) {
  57. fn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  58. w.WriteHeader(200)
  59. })
  60. chained := New().ThenFunc(fn)
  61. rec := httptest.NewRecorder()
  62. chained.ServeHTTP(rec, (*http.Request)(nil))
  63. assert.Equal(t, reflect.TypeOf((http.HandlerFunc)(nil)), reflect.TypeOf(chained),
  64. "ThenFunc does not construct HandlerFunc")
  65. }
  66. func TestThenOrdersHandlersCorrectly(t *testing.T) {
  67. t1 := tagMiddleware("t1\n")
  68. t2 := tagMiddleware("t2\n")
  69. t3 := tagMiddleware("t3\n")
  70. chained := New(t1, t2, t3).Then(testApp)
  71. w := httptest.NewRecorder()
  72. r, err := http.NewRequest("GET", "/", http.NoBody)
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. chained.ServeHTTP(w, r)
  77. assert.Equal(t, "t1\nt2\nt3\napp\n", w.Body.String(),
  78. "Then does not order handlers correctly")
  79. }
  80. func TestAppendAddsHandlersCorrectly(t *testing.T) {
  81. c := New(tagMiddleware("t1\n"), tagMiddleware("t2\n"))
  82. c = c.Append(tagMiddleware("t3\n"), tagMiddleware("t4\n"))
  83. h := c.Then(testApp)
  84. w := httptest.NewRecorder()
  85. r, err := http.NewRequest("GET", "/", http.NoBody)
  86. assert.Nil(t, err)
  87. h.ServeHTTP(w, r)
  88. assert.Equal(t, "t1\nt2\nt3\nt4\napp\n", w.Body.String(),
  89. "Append does not add handlers correctly")
  90. }
  91. func TestExtendAddsHandlersCorrectly(t *testing.T) {
  92. c := New(tagMiddleware("t3\n"), tagMiddleware("t4\n"))
  93. c = c.Prepend(tagMiddleware("t1\n"), tagMiddleware("t2\n"))
  94. h := c.Then(testApp)
  95. w := httptest.NewRecorder()
  96. r, err := http.NewRequest("GET", "/", nil)
  97. assert.Nil(t, err)
  98. h.ServeHTTP(w, r)
  99. assert.Equal(t, "t1\nt2\nt3\nt4\napp\n", w.Body.String(),
  100. "Extend does not add handlers in correctly")
  101. }