1package goji
2
3import (
4	"net/http"
5	"testing"
6)
7
8func expectSequence(t *testing.T, ch chan string, seq ...string) {
9	for i, str := range seq {
10		if msg := <-ch; msg != str {
11			t.Errorf("[%d] expected %s, got %s", i, str, msg)
12		}
13	}
14}
15
16func TestMiddleware(t *testing.T) {
17	t.Parallel()
18
19	m := NewMux()
20	ch := make(chan string, 10)
21	m.Use(func(h http.Handler) http.Handler {
22		fn := func(w http.ResponseWriter, r *http.Request) {
23			ch <- "before one"
24			h.ServeHTTP(w, r)
25			ch <- "after one"
26		}
27		return http.HandlerFunc(fn)
28	})
29	m.Use(func(h http.Handler) http.Handler {
30		fn := func(w http.ResponseWriter, r *http.Request) {
31			ch <- "before two"
32			h.ServeHTTP(w, r)
33			ch <- "after two"
34		}
35		return http.HandlerFunc(fn)
36	})
37	m.Handle(boolPattern(true), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
38		ch <- "handler"
39	}))
40
41	m.ServeHTTP(wr())
42
43	expectSequence(t, ch, "before one", "before two", "handler", "after two", "after one")
44}
45
46func makeMiddleware(ch chan string, name string) func(http.Handler) http.Handler {
47	return func(h http.Handler) http.Handler {
48		fn := func(w http.ResponseWriter, r *http.Request) {
49			ch <- "before " + name
50			h.ServeHTTP(w, r)
51			ch <- "after " + name
52		}
53		return http.HandlerFunc(fn)
54	}
55}
56
57func TestMiddlewareReconfigure(t *testing.T) {
58	t.Parallel()
59
60	m := NewMux()
61	ch := make(chan string, 10)
62	m.Use(makeMiddleware(ch, "one"))
63	m.Use(makeMiddleware(ch, "two"))
64	m.Handle(boolPattern(true), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
65		ch <- "handler"
66	}))
67
68	w, r := wr()
69	m.ServeHTTP(w, r)
70
71	expectSequence(t, ch, "before one", "before two", "handler", "after two", "after one")
72
73	m.Use(makeMiddleware(ch, "three"))
74
75	w, r = wr()
76	m.ServeHTTP(w, r)
77
78	expectSequence(t, ch, "before one", "before two", "before three",
79		"handler", "after three", "after two", "after one")
80}
81