aboutsummaryrefslogtreecommitdiff
path: root/src/vendor/github.com/rs/xhandler/chain_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/vendor/github.com/rs/xhandler/chain_test.go')
-rw-r--r--src/vendor/github.com/rs/xhandler/chain_test.go112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/vendor/github.com/rs/xhandler/chain_test.go b/src/vendor/github.com/rs/xhandler/chain_test.go
new file mode 100644
index 0000000..0ce9410
--- /dev/null
+++ b/src/vendor/github.com/rs/xhandler/chain_test.go
@@ -0,0 +1,112 @@
+package xhandler
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "golang.org/x/net/context"
+)
+
+func TestAppendHandlerC(t *testing.T) {
+ init := 0
+ h1 := func(next HandlerC) HandlerC {
+ init++
+ return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ ctx = context.WithValue(ctx, "test", 1)
+ next.ServeHTTPC(ctx, w, r)
+ })
+ }
+ h2 := func(next HandlerC) HandlerC {
+ return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ ctx = context.WithValue(ctx, "test", 2)
+ next.ServeHTTPC(ctx, w, r)
+ })
+ }
+ c := Chain{}
+ c.UseC(h1)
+ c.UseC(h2)
+ assert.Len(t, c, 2)
+
+ h := c.Handler(HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ // Test ordering
+ assert.Equal(t, 2, ctx.Value("test"), "second handler should overwrite first handler's context value")
+ }))
+
+ h.ServeHTTP(nil, nil)
+ h.ServeHTTP(nil, nil)
+ assert.Equal(t, 1, init, "handler init called once")
+}
+
+func TestAppendHandler(t *testing.T) {
+ init := 0
+ h1 := func(next HandlerC) HandlerC {
+ return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ ctx = context.WithValue(ctx, "test", 1)
+ next.ServeHTTPC(ctx, w, r)
+ })
+ }
+ h2 := func(next http.Handler) http.Handler {
+ init++
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ // Change r and w values
+ w = httptest.NewRecorder()
+ r = &http.Request{}
+ next.ServeHTTP(w, r)
+ })
+ }
+ c := Chain{}
+ c.UseC(h1)
+ c.Use(h2)
+ assert.Len(t, c, 2)
+
+ h := c.Handler(HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ // Test ordering
+ assert.Equal(t, 1, ctx.Value("test"),
+ "the first handler value should be pass through the second (non-aware) one")
+ // Test r and w overwrite
+ assert.NotNil(t, w)
+ assert.NotNil(t, r)
+ }))
+
+ h.ServeHTTP(nil, nil)
+ h.ServeHTTP(nil, nil)
+ // There's no safe way to not initialize non ctx aware handlers on each request :/
+ //assert.Equal(t, 1, init, "handler init called once")
+}
+
+func TestChainHandlerC(t *testing.T) {
+ handlerCalls := 0
+ h1 := func(next HandlerC) HandlerC {
+ return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ handlerCalls++
+ ctx = context.WithValue(ctx, "test", 1)
+ next.ServeHTTPC(ctx, w, r)
+ })
+ }
+ h2 := func(next HandlerC) HandlerC {
+ return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ handlerCalls++
+ ctx = context.WithValue(ctx, "test", 2)
+ next.ServeHTTPC(ctx, w, r)
+ })
+ }
+
+ c := Chain{}
+ c.UseC(h1)
+ c.UseC(h2)
+ h := c.HandlerC(HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
+ handlerCalls++
+
+ assert.Equal(t, 2, ctx.Value("test"),
+ "second handler should overwrite first handler's context value")
+ assert.Equal(t, 1, ctx.Value("mainCtx"),
+ "the mainCtx value should be pass through")
+ }))
+
+ mainCtx := context.WithValue(context.Background(), "mainCtx", 1)
+ h.ServeHTTPC(mainCtx, nil, nil)
+
+ assert.Equal(t, 3, handlerCalls, "all handler called once")
+}