package log import ( "context" "errors" "net/http/httptest" "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/sirupsen/logrus" "github.com/sirupsen/logrus/hooks/test" ) func TestLog(t *testing.T) { SetLevel(LevelInfo) RegisterFailHandler(Fail) RunSpecs(t, "Log Suite") } var _ = Describe("Logger", func() { var l *logrus.Logger var hook *test.Hook BeforeEach(func() { l, hook = test.NewNullLogger() SetLevel(LevelInfo) SetDefaultLogger(l) }) Context("Logging", func() { It("logs a simple message", func() { Error("Simple Message") Expect(hook.LastEntry().Message).To(Equal("Simple Message")) Expect(hook.LastEntry().Data).To(BeEmpty()) }) It("logs a message when context is nil", func() { Error(nil, "Simple Message") Expect(hook.LastEntry().Message).To(Equal("Simple Message")) Expect(hook.LastEntry().Data).To(BeEmpty()) }) XIt("Empty context", func() { Error(context.Background(), "Simple Message") Expect(hook.LastEntry().Message).To(Equal("Simple Message")) Expect(hook.LastEntry().Data).To(BeEmpty()) }) It("logs messages with two kv pairs", func() { Error("Simple Message", "key1", "value1", "key2", "value2") Expect(hook.LastEntry().Message).To(Equal("Simple Message")) Expect(hook.LastEntry().Data["key1"]).To(Equal("value1")) Expect(hook.LastEntry().Data["key2"]).To(Equal("value2")) Expect(hook.LastEntry().Data).To(HaveLen(2)) }) It("logs error objects as simple messages", func() { Error(errors.New("error test")) Expect(hook.LastEntry().Message).To(Equal("error test")) Expect(hook.LastEntry().Data).To(BeEmpty()) }) It("logs errors passed as last argument", func() { Error("Error scrobbling track", "id", 1, errors.New("some issue")) Expect(hook.LastEntry().Message).To(Equal("Error scrobbling track")) Expect(hook.LastEntry().Data["id"]).To(Equal(1)) Expect(hook.LastEntry().Data["error"]).To(Equal("some issue")) Expect(hook.LastEntry().Data).To(HaveLen(2)) }) It("can get data from the request's context", func() { ctx := NewContext(nil, "foo", "bar") req := httptest.NewRequest("get", "/", nil).WithContext(ctx) Error(req, "Simple Message", "key1", "value1") Expect(hook.LastEntry().Message).To(Equal("Simple Message")) Expect(hook.LastEntry().Data["foo"]).To(Equal("bar")) Expect(hook.LastEntry().Data["key1"]).To(Equal("value1")) Expect(hook.LastEntry().Data).To(HaveLen(2)) }) It("does not log anything if level is lower", func() { SetLevel(LevelError) Info("Simple Message") Expect(hook.LastEntry()).To(BeNil()) }) }) Context("extractLogger", func() { It("returns an error if the context is nil", func() { _, err := extractLogger(nil) Expect(err).ToNot(BeNil()) }) It("returns an error if the context is a string", func() { _, err := extractLogger("any msg") Expect(err).ToNot(BeNil()) }) It("returns the logger from context if it has one", func() { logger := logrus.NewEntry(logrus.New()) ctx := context.Background() ctx = context.WithValue(ctx, "logger", logger) Expect(extractLogger(ctx)).To(Equal(logger)) }) It("returns the logger from request's context if it has one", func() { logger := logrus.NewEntry(logrus.New()) ctx := context.Background() ctx = context.WithValue(ctx, "logger", logger) req := httptest.NewRequest("get", "/", nil).WithContext(ctx) Expect(extractLogger(req)).To(Equal(logger)) }) }) })