Skip to content

Commit

Permalink
Add middleware slice (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
instabledesign authored Aug 21, 2019
1 parent a505dd0 commit 8971b9c
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 1 deletion.
24 changes: 23 additions & 1 deletion middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,26 @@ package logger

// MiddlewareInterface is a function to decorate handler
// See middleware implementations in the middleware package.
type MiddlewareInterface func(handler HandlerInterface) HandlerInterface
type MiddlewareInterface func(HandlerInterface) HandlerInterface

// Middlewares was a collection of middleware
// the slice order matter when middleware are compose with DecorateHandler
type Middlewares []MiddlewareInterface

// Decorate will return the handler after decorate with middlewares
func (m Middlewares) Decorate(handler HandlerInterface) HandlerInterface {
return DecorateHandler(handler, m...)
}

// DecorateHandler will return the handler after decorate with middlewares
func DecorateHandler(handler HandlerInterface, middlewares ...MiddlewareInterface) HandlerInterface {
for _, middleware := range middlewares {
handler = middleware(handler)
}
return handler
}

// MiddlewareStack helper return Middlewares slice from given middlewares
func MiddlewareStack(middlewares ...MiddlewareInterface) Middlewares {
return middlewares
}
65 changes: 65 additions & 0 deletions middleware_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package logger_test

import (
"errors"
"testing"

"github.com/stretchr/testify/assert"

"github.com/gol4ng/logger"
)

func TestMiddlewareInterfaceDecorate(t *testing.T) {
myEntry := logger.Entry{}

fakeHandler := func(e logger.Entry) error {
assert.Equal(t, myEntry, e)
return errors.New("my fake handler error")
}
fakeMiddleware := func(h logger.HandlerInterface) logger.HandlerInterface {
return func(e logger.Entry) error {
assert.Equal(t, myEntry, e)
err := h(e)
assert.Error(t, err)
return errors.New("middleware prepend " + err.Error())
}
}
middlewares := logger.MiddlewareStack(fakeMiddleware)
handler := middlewares.Decorate(fakeHandler)

err := handler(myEntry)
assert.Error(t, err)
assert.Equal(t, "middleware prepend my fake handler error", err.Error())
}

func TestDecorateHandler(t *testing.T) {
myEntry := logger.Entry{}

fakeHandler := func(e logger.Entry) error {
assert.Equal(t, myEntry, e)
return errors.New("my fake handler error")
}
fakeMiddleware := func(h logger.HandlerInterface) logger.HandlerInterface {
return func(e logger.Entry) error {
assert.Equal(t, myEntry, e)
err := h(e)
assert.Error(t, err)
return errors.New("middleware prepend " + err.Error())
}
}
handler := logger.DecorateHandler(fakeHandler, fakeMiddleware)

err := handler(myEntry)
assert.Error(t, err)
assert.Equal(t, "middleware prepend my fake handler error", err.Error())
}

func TestMiddlewareStack(t *testing.T) {
fakeMiddleware := func(logger.HandlerInterface) logger.HandlerInterface {
return func(entry logger.Entry) error {
return nil
}
}

assert.IsType(t, logger.Middlewares{}, logger.MiddlewareStack(fakeMiddleware))
}

0 comments on commit 8971b9c

Please sign in to comment.