aboutsummaryrefslogtreecommitdiffstats
path: root/logging/encoding_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'logging/encoding_test.go')
-rw-r--r--logging/encoding_test.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/logging/encoding_test.go b/logging/encoding_test.go
new file mode 100644
index 0000000..1e47e4a
--- /dev/null
+++ b/logging/encoding_test.go
@@ -0,0 +1,75 @@
+package logging_test
+
+import (
+ "encoding/json"
+ "log/slog"
+ "slices"
+ "sync"
+ "testing"
+ "testing/slogtest"
+
+ "go.sudomsg.com/kit/logging"
+)
+
+type logRecorder struct {
+ mu sync.Mutex
+ encoder logging.Encoder
+ records []string
+}
+
+var _ logging.Sink = &logRecorder{}
+
+func (h *logRecorder) Append(r slog.Record) error {
+ h.mu.Lock()
+ defer h.mu.Unlock()
+
+ it := logging.RecordAll(r, nil)
+
+ entry, err := h.encoder(it)
+ if err != nil {
+ return err
+ }
+
+ h.records = append(h.records, entry)
+ return nil
+}
+
+func (h *logRecorder) Enabled(level slog.Level) bool {
+ return true // Capture all logs
+}
+
+func (h *logRecorder) Records() []string {
+ h.mu.Lock()
+ defer h.mu.Unlock()
+ return slices.Clone(h.records)
+}
+
+func TestJSONEncoder(t *testing.T) {
+ var lastMock *logRecorder
+
+ slogtest.Run(t,
+ func(t *testing.T) slog.Handler {
+ lastMock = &logRecorder{
+ encoder: logging.JSONEncoder,
+ }
+ return logging.NewSinkHandler(lastMock)
+ },
+ func(t *testing.T) map[string]any {
+ t.Helper()
+
+ recs := lastMock.Records()
+ if len(recs) == 0 {
+ t.Fatalf("no records captured")
+ }
+
+ rec := recs[len(recs)-1]
+
+ m := make(map[string]any)
+ if err := json.Unmarshal([]byte(rec), &m); err != nil {
+ t.Fatalf("%v", err)
+ }
+
+ return m
+ },
+ )
+}