From 8971b9c5276cd4eb2cf407bd12bea46c2eefd254 Mon Sep 17 00:00:00 2001 From: instabledesign Date: Wed, 21 Aug 2019 18:30:42 +0200 Subject: [PATCH] Add middleware slice (#37) --- middleware.go | 24 ++++++++++++++++- middleware_test.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 middleware_test.go diff --git a/middleware.go b/middleware.go index 0e7084a..f1d4c9f 100644 --- a/middleware.go +++ b/middleware.go @@ -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 +} diff --git a/middleware_test.go b/middleware_test.go new file mode 100644 index 0000000..5a50bbd --- /dev/null +++ b/middleware_test.go @@ -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)) +}