| 
 | 1 | +//go:build go1.21  | 
 | 2 | + | 
 | 3 | +package slogtest_test  | 
 | 4 | + | 
 | 5 | +import (  | 
 | 6 | +	"log"  | 
 | 7 | +	"log/slog"  | 
 | 8 | +	"testing"  | 
 | 9 | +	"time"  | 
 | 10 | + | 
 | 11 | +	"github.com/maargenton/go-testpredicate/pkg/bdd"  | 
 | 12 | +	"github.com/maargenton/go-testpredicate/pkg/require"  | 
 | 13 | +	"github.com/maargenton/go-testpredicate/pkg/verify"  | 
 | 14 | + | 
 | 15 | +	"github.com/maargenton/go-testpredicate/pkg/slogtest"  | 
 | 16 | +)  | 
 | 17 | + | 
 | 18 | +func TestGetFlattenAttrs(t *testing.T) {  | 
 | 19 | +	bdd.Given(t, "a slog.Record", func(t *bdd.T) {  | 
 | 20 | +		var r = slog.NewRecord(time.Now(), slog.LevelInfo, "message", 0)  | 
 | 21 | +		r.Add("foo", 123, "bar", slog.GroupValue(slog.String("baz", "baz-value")))  | 
 | 22 | +		t.When("calling GetFlattenAttrs", func(t *bdd.T) {  | 
 | 23 | +			t.Then("group attributes are expanded to dot-separated keys", func(t *bdd.T) {  | 
 | 24 | +				var attrs = slogtest.GetFlattenAttrs(r)  | 
 | 25 | +				require.That(t, attrs).MapKeys().IsEqualSet([]string{  | 
 | 26 | +					"foo", "bar.baz",  | 
 | 27 | +				})  | 
 | 28 | +			})  | 
 | 29 | +			t.Then("values are fully resolved, preserving type", func(t *bdd.T) {  | 
 | 30 | +				var attrs = slogtest.GetFlattenAttrs(r)  | 
 | 31 | +				require.That(t, attrs).Field("foo").Eq(123)  | 
 | 32 | +				require.That(t, attrs).Field("bar.baz").Eq("baz-value")  | 
 | 33 | +			})  | 
 | 34 | +		})  | 
 | 35 | +	})  | 
 | 36 | +}  | 
 | 37 | + | 
 | 38 | +func TestGetAllAttrs(t *testing.T) {  | 
 | 39 | +	bdd.Given(t, "a slog.Record", func(t *bdd.T) {  | 
 | 40 | +		var r = slog.NewRecord(time.Now(), slog.LevelInfo, "message", 0)  | 
 | 41 | +		r.Add("foo", 123, "bar", slog.GroupValue(slog.String("baz", "baz-value")))  | 
 | 42 | +		t.When("calling GetAllAttrs", func(t *bdd.T) {  | 
 | 43 | +			t.Then("all attributes are stored in resulting map", func(t *bdd.T) {  | 
 | 44 | +				var attrs = slogtest.GetAllAttrs(r)  | 
 | 45 | +				require.That(t, attrs).MapKeys().IsEqualSet([]string{  | 
 | 46 | +					"foo", "bar",  | 
 | 47 | +				})  | 
 | 48 | +			})  | 
 | 49 | +			t.Then("gropup values are stored in nested maps, fully resolved, preserving type", func(t *bdd.T) {  | 
 | 50 | +				var attrs = slogtest.GetAllAttrs(r)  | 
 | 51 | +				require.That(t, attrs).Field("foo").Eq(123)  | 
 | 52 | +				require.That(t, attrs).Field("bar.baz").Eq("baz-value")  | 
 | 53 | +			})  | 
 | 54 | +		})  | 
 | 55 | +	})  | 
 | 56 | +}  | 
 | 57 | + | 
 | 58 | +func TestRecorder(t *testing.T) {  | 
 | 59 | +	bdd.Given(t, "a recorder", func(t *bdd.T) {  | 
 | 60 | +		var r = &slogtest.Recorder{}  | 
 | 61 | +		var l = slog.New(r)  | 
 | 62 | + | 
 | 63 | +		t.When("calling log.Info()", func(t *bdd.T) {  | 
 | 64 | +			l.Info("message", "key", "value")  | 
 | 65 | + | 
 | 66 | +			t.Then("log is recorded as info, with message and attribute", func(t *bdd.T) {  | 
 | 67 | +				var rr = r.GetRecords()  | 
 | 68 | +				require.That(t, rr).Length().Eq(1)  | 
 | 69 | + | 
 | 70 | +				var record = rr[0]  | 
 | 71 | +				verify.That(t, record.Level).Eq(slog.LevelInfo)  | 
 | 72 | +				verify.That(t, record.Message).Eq("message")  | 
 | 73 | + | 
 | 74 | +				var attrs = slogtest.GetFlattenAttrs(record)  | 
 | 75 | +				verify.That(t, attrs).Field("key").Eq("value")  | 
 | 76 | +			})  | 
 | 77 | +		})  | 
 | 78 | +		t.When("calling log.Info() indirectly from With()", func(t *bdd.T) {  | 
 | 79 | +			l.With("kk", "vv").Info("message", "key", "value")  | 
 | 80 | + | 
 | 81 | +			t.Then("log record include share attributes", func(t *bdd.T) {  | 
 | 82 | +				var rr = r.GetRecords()  | 
 | 83 | +				require.That(t, rr).Length().Eq(1)  | 
 | 84 | + | 
 | 85 | +				var attrs = slogtest.GetFlattenAttrs(rr[0])  | 
 | 86 | +				verify.That(t, attrs).MapKeys().IsEqualSet([]string{"key", "kk"})  | 
 | 87 | +				verify.That(t, attrs).Field("key").Eq("value")  | 
 | 88 | +				verify.That(t, attrs).Field("kk").Eq("vv")  | 
 | 89 | +			})  | 
 | 90 | +		})  | 
 | 91 | + | 
 | 92 | +		t.When("calling log.Info() indirectly from WithGroup()", func(t *bdd.T) {  | 
 | 93 | +			l.WithGroup("group").Info("message", "key", "value")  | 
 | 94 | + | 
 | 95 | +			t.Then("log record include attributes prefixed by group name", func(t *bdd.T) {  | 
 | 96 | +				var rr = r.GetRecords()  | 
 | 97 | +				require.That(t, rr).Length().Eq(1)  | 
 | 98 | + | 
 | 99 | +				var attrs = slogtest.GetFlattenAttrs(rr[0])  | 
 | 100 | +				verify.That(t, attrs).MapKeys().IsEqualSet([]string{"group.key"})  | 
 | 101 | +				verify.That(t, attrs).Field("group.key").Eq("value")  | 
 | 102 | +			})  | 
 | 103 | +		})  | 
 | 104 | + | 
 | 105 | +		t.When("calling log.Info() indirectly from mix of With and WithGroup()", func(t *bdd.T) {  | 
 | 106 | +			l.With("kk", "vv").WithGroup("group").With("gkk", "gvv").Info("message", "key", "value")  | 
 | 107 | + | 
 | 108 | +			t.Then("log record include attributes prefixed by group name", func(t *bdd.T) {  | 
 | 109 | +				var rr = r.GetRecords()  | 
 | 110 | +				require.That(t, rr).Length().Eq(1)  | 
 | 111 | + | 
 | 112 | +				var attrs = slogtest.GetFlattenAttrs(rr[0])  | 
 | 113 | +				verify.That(t, attrs).MapKeys().IsEqualSet([]string{  | 
 | 114 | +					"group.key", "group.gkk", "kk",  | 
 | 115 | +				})  | 
 | 116 | +				verify.That(t, attrs).Field("group.key").Eq("value")  | 
 | 117 | +				verify.That(t, attrs).Field("group.gkk").Eq("gvv")  | 
 | 118 | +				verify.That(t, attrs).Field("kk").Eq("vv")  | 
 | 119 | +			})  | 
 | 120 | +		})  | 
 | 121 | +	})  | 
 | 122 | +}  | 
 | 123 | + | 
 | 124 | +func TestWithDefaultRecorder(t *testing.T) {  | 
 | 125 | +	bdd.Given(t, "something", func(t *bdd.T) {  | 
 | 126 | +		log.Printf("before log test1")  | 
 | 127 | +		slog.Info("before slog test2")  | 
 | 128 | + | 
 | 129 | +		var r *slogtest.Recorder  | 
 | 130 | +		slogtest.WithSlogRecorder(func(logs *slogtest.Recorder) {  | 
 | 131 | +			log.Printf("captured log test3")  | 
 | 132 | +			slog.Info("captured slog test4")  | 
 | 133 | +			r = logs  | 
 | 134 | +		})  | 
 | 135 | +		log.Printf("after log test5")  | 
 | 136 | +		slog.Info("after sog test6")  | 
 | 137 | + | 
 | 138 | +		t.When("doing something", func(t *bdd.T) {  | 
 | 139 | +			t.Then("something happens", func(t *bdd.T) {  | 
 | 140 | +				require.That(t, r.GetRecords()).Length().Eq(2)  | 
 | 141 | +			})  | 
 | 142 | +		})  | 
 | 143 | +	})  | 
 | 144 | +}  | 
0 commit comments