package logrus_sentry import ( "encoding/json" "fmt" "io/ioutil" "net/http" "net/http/httptest" "reflect" "strings" "testing" "github.com/Sirupsen/logrus" "github.com/getsentry/raven-go" ) const ( message = "error message" server_name = "testserver.internal" logger_name = "test.logger" ) func getTestLogger() *logrus.Logger { l := logrus.New() l.Out = ioutil.Discard return l } func WithTestDSN(t *testing.T, tf func(string, <-chan *raven.Packet)) { pch := make(chan *raven.Packet, 1) s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { defer req.Body.Close() d := json.NewDecoder(req.Body) p := &raven.Packet{} err := d.Decode(p) if err != nil { t.Fatal(err.Error()) } pch <- p })) defer s.Close() fragments := strings.SplitN(s.URL, "://", 2) dsn := fmt.Sprintf( "%s://public:secret@%s/sentry/project-id", fragments[0], fragments[1], ) tf(dsn, pch) } func TestSpecialFields(t *testing.T) { WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) { logger := getTestLogger() hook, err := NewSentryHook(dsn, []logrus.Level{ logrus.ErrorLevel, }) if err != nil { t.Fatal(err.Error()) } logger.Hooks.Add(hook) req, _ := http.NewRequest("GET", "url", nil) logger.WithFields(logrus.Fields{ "server_name": server_name, "logger": logger_name, "http_request": req, }).Error(message) packet := <-pch if packet.Logger != logger_name { t.Errorf("logger should have been %s, was %s", logger_name, packet.Logger) } if packet.ServerName != server_name { t.Errorf("server_name should have been %s, was %s", server_name, packet.ServerName) } }) } func TestSentryHandler(t *testing.T) { WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) { logger := getTestLogger() hook, err := NewSentryHook(dsn, []logrus.Level{ logrus.ErrorLevel, }) if err != nil { t.Fatal(err.Error()) } logger.Hooks.Add(hook) logger.Error(message) packet := <-pch if packet.Message != message { t.Errorf("message should have been %s, was %s", message, packet.Message) } }) } func TestSentryTags(t *testing.T) { WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) { logger := getTestLogger() tags := map[string]string{ "site": "test", } levels := []logrus.Level{ logrus.ErrorLevel, } hook, err := NewWithTagsSentryHook(dsn, tags, levels) if err != nil { t.Fatal(err.Error()) } logger.Hooks.Add(hook) logger.Error(message) packet := <-pch expected := raven.Tags{ raven.Tag{ Key: "site", Value: "test", }, } if !reflect.DeepEqual(packet.Tags, expected) { t.Errorf("message should have been %s, was %s", message, packet.Message) } }) }