Skip to content

Commit

Permalink
fix #6: add more tests, add Tracer and Stack description
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilsk committed Mar 13, 2020
1 parent da7a846 commit 0ab189d
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 10 deletions.
6 changes: 4 additions & 2 deletions http/middleware/middleware.go
Expand Up @@ -2,11 +2,13 @@ package middleware

import "net/http"

// Middleware defines the Handler wrapper.
// Middleware defines a Handler wrapper.
type Middleware func(http.Handler) http.Handler

type Stack []Middleware
// Stack provides the method to wrap a Handler.
type Stack []func(http.Handler) http.Handler

// Apply wraps the Handler.
func (stack Stack) Apply(handler http.Handler) http.Handler {
for i := len(stack) - 1; i >= 0; i-- {
handler = stack[i](handler)
Expand Down
49 changes: 49 additions & 0 deletions http/middleware/middleware_test.go
@@ -0,0 +1,49 @@
package middleware_test

import (
"net/http"
"net/http/httptest"
"testing"

"github.com/stretchr/testify/assert"

. "go.octolab.org/toolkit/protocol/http/middleware"
)

func TestStack_Apply(t *testing.T) {
t.Run("empty stack", func(t *testing.T) {
var (
calls []int
stack Stack
)
handler := http.HandlerFunc(func(http.ResponseWriter, *http.Request) {
calls = append(calls, 1)
})

stack.Apply(handler).ServeHTTP(httptest.NewRecorder(), &http.Request{})
assert.Equal(t, []int{1}, calls)
})
t.Run("full stack", func(t *testing.T) {
var calls []int
stack := Stack{
func(handler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
calls = append(calls, 1)
handler.ServeHTTP(rw, req)
})
},
func(handler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
calls = append(calls, 2)
handler.ServeHTTP(rw, req)
})
},
}
handler := http.HandlerFunc(func(http.ResponseWriter, *http.Request) {
calls = append(calls, 3)
})

stack.Apply(handler).ServeHTTP(httptest.NewRecorder(), &http.Request{})
assert.Equal(t, []int{1, 2, 3}, calls)
})
}
24 changes: 16 additions & 8 deletions http/middleware/tracer_test.go
Expand Up @@ -15,10 +15,11 @@ import (

func TestTracer(t *testing.T) {
var spy bool
middleware := Tracer(1, func(tracer *tracer.Trace) {
logger := func(tracer *tracer.Trace) {
assert.Contains(t, tracer.String(), "call middleware_test.TestTracer.func2")
spy = true
})
}
middleware := Tracer(1, logger)

var handler http.Handler
handler = http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
Expand All @@ -27,11 +28,18 @@ func TestTracer(t *testing.T) {
})
handler = middleware(handler)

ctx, cancel := context.WithCancel(context.Background())
handler.ServeHTTP(httptest.NewRecorder(), (&http.Request{}).WithContext(ctx))
assert.False(t, spy)
t.Run("without log", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

handler.ServeHTTP(httptest.NewRecorder(), (&http.Request{}).WithContext(ctx))
assert.False(t, spy)
})
t.Run("with log", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
cancel()

cancel()
handler.ServeHTTP(httptest.NewRecorder(), (&http.Request{}).WithContext(ctx))
assert.True(t, spy)
handler.ServeHTTP(httptest.NewRecorder(), (&http.Request{}).WithContext(ctx))
assert.True(t, spy)
})
}

0 comments on commit 0ab189d

Please sign in to comment.