log_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package log_test
  2. import (
  3. "bytes"
  4. "github.com/stretchr/testify/require"
  5. "heckel.io/ntfy/log"
  6. "os"
  7. "testing"
  8. "time"
  9. )
  10. func TestMain(m *testing.M) {
  11. exitCode := m.Run()
  12. resetState()
  13. log.SetLevel(log.ErrorLevel) // For other modules!
  14. os.Exit(exitCode)
  15. }
  16. func TestLog_TagContextFieldFields(t *testing.T) {
  17. t.Cleanup(resetState)
  18. v := &fakeVisitor{
  19. UserID: "u_abc",
  20. IP: "1.2.3.4",
  21. }
  22. err := &fakeError{
  23. Code: 123,
  24. Message: "some error",
  25. }
  26. var out bytes.Buffer
  27. log.SetOutput(&out)
  28. log.SetFormat(log.JSONFormat)
  29. log.SetLevelOverride("tag", "stripe", log.DebugLevel)
  30. log.
  31. Tag("mytag").
  32. Field("field2", 123).
  33. Field("field1", "value1").
  34. Time(time.Unix(123, 0)).
  35. Info("hi there %s", "phil")
  36. log.
  37. Tag("not-stripe").
  38. Debug("this message will not appear")
  39. log.
  40. With(v).
  41. Fields(log.Context{
  42. "stripe_customer_id": "acct_123",
  43. "stripe_subscription_id": "sub_123",
  44. }).
  45. Tag("stripe").
  46. Err(err).
  47. Time(time.Unix(456, 0)).
  48. Debug("Subscription status %s", "active")
  49. expected := `{"time":123000,"level":"INFO","message":"hi there phil","field1":"value1","field2":123,"tag":"mytag"}
  50. {"time":456000,"level":"DEBUG","message":"Subscription status active","error":"some error","error_code":123,"stripe_customer_id":"acct_123","stripe_subscription_id":"sub_123","tag":"stripe","user_id":"u_abc","visitor_ip":"1.2.3.4"}
  51. `
  52. require.Equal(t, expected, out.String())
  53. }
  54. type fakeError struct {
  55. Code int
  56. Message string
  57. }
  58. func (e fakeError) Error() string {
  59. return e.Message
  60. }
  61. func (e fakeError) Context() log.Context {
  62. return log.Context{
  63. "error": e.Message,
  64. "error_code": e.Code,
  65. }
  66. }
  67. type fakeVisitor struct {
  68. UserID string
  69. IP string
  70. }
  71. func (v *fakeVisitor) Context() log.Context {
  72. return log.Context{
  73. "user_id": v.UserID,
  74. "visitor_ip": v.IP,
  75. }
  76. }
  77. func resetState() {
  78. log.SetLevel(log.DefaultLevel)
  79. log.SetFormat(log.DefaultFormat)
  80. log.SetOutput(log.DefaultOutput)
  81. log.ResetLevelOverrides()
  82. }