Skip to content

Commit e233bba

Browse files
committed
add tests for xlog [wip]
1 parent d680742 commit e233bba

File tree

4 files changed

+125
-4
lines changed

4 files changed

+125
-4
lines changed

xlog/attrs.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ func (err ErrorValue) Value() slog.Value {
3232

3333
// LogValue implements [slog.LogValuer].
3434
func (err ErrorValue) LogValue() slog.Value {
35-
return slog.StringValue(err.Error())
35+
return err.Value()
3636
}
3737

3838
// Error constructs a first-class error log attribute.
3939
//
4040
// Not to be confused with (xlog.Logger).Error() or (log/slog).Error(),
4141
// which produce an error-level log message.
4242
func Error(err error) slog.Attr {
43-
return slog.Any(ErrorKey, ErrorValue{err})
43+
return Any(ErrorKey, ErrorValue{err})
4444
}

xlog/options.go

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package xlog
22

33
import (
4+
"errors"
45
"io"
56
"log/slog"
67
"os"
@@ -47,9 +48,15 @@ func LeveledString(s string) Option {
4748
}
4849
}
4950

51+
var ErrNilWriter = errors.New("invalid writer: nil")
52+
5053
// WriteTo sets the output.
5154
func WriteTo(w io.Writer) Option {
5255
return func(o *options) error {
56+
if w == nil {
57+
return ErrNilWriter
58+
}
59+
5360
o.output = w
5461
return nil
5562
}

xlog/options_test.go

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package xlog
2+
3+
import (
4+
"bytes"
5+
"log/slog"
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/suite"
10+
)
11+
12+
func TestOptionSuite(t *testing.T) {
13+
suite.Run(t, new(OptionSuite))
14+
}
15+
16+
type OptionSuite struct {
17+
suite.Suite
18+
options
19+
}
20+
21+
func (o *OptionSuite) SetupTest() {
22+
o.level = slog.LevelDebug
23+
}
24+
25+
func (o *OptionSuite) TestLeveled() {
26+
err := Leveled(slog.LevelError)(&o.options)
27+
o.Require().NoError(err)
28+
o.Assert().Equal(slog.LevelError, o.level)
29+
30+
err = Leveled(slog.Level(999))(&o.options)
31+
o.Require().NoError(err)
32+
o.Assert().Equal(slog.Level(999), o.level)
33+
}
34+
35+
func (o *OptionSuite) TestLeveledString_valid() {
36+
for i, tt := range []struct {
37+
input string
38+
expected slog.Level
39+
}{
40+
{"dbg", slog.LevelDebug},
41+
{"debug", slog.LevelDebug},
42+
43+
{"", slog.LevelInfo},
44+
{"info", slog.LevelInfo},
45+
{"INFO", slog.LevelInfo},
46+
47+
{"WARN", slog.LevelWarn},
48+
{"WARNING", slog.LevelWarn},
49+
50+
{"ERR", slog.LevelError},
51+
{"ERROR", slog.LevelError},
52+
{"FaTaL", slog.LevelError},
53+
} {
54+
o.level = slog.Level(100 + i)
55+
err := LeveledString(tt.input)(&o.options)
56+
o.Require().NoError(err)
57+
o.Assert().Equal(tt.expected, o.level)
58+
}
59+
}
60+
61+
func (o *OptionSuite) TestLeveledString_invalid() {
62+
o.level = slog.Level(100)
63+
err := LeveledString("ifno")(&o.options)
64+
o.Require().Equal(slog.Level(100), o.level)
65+
o.Assert().EqualError(err, `unknown log level: "ifno"`)
66+
}
67+
68+
func (o *OptionSuite) TestWriteTo() {
69+
var buf bytes.Buffer
70+
err := WriteTo(&buf)(&o.options)
71+
o.Require().NoError(err)
72+
o.Assert().Equal(&buf, o.output)
73+
74+
err = WriteTo(nil)(&o.options)
75+
o.Assert().EqualError(err, "invalid writer: nil")
76+
}
77+
78+
func (o *OptionSuite) TestMockClock() {
79+
t := time.Now()
80+
err := MockClock(t)(&o.options)
81+
o.Require().NoError(err)
82+
o.Require().NotNil(o.clock)
83+
o.Assert().EqualValues(t, o.clock.Now())
84+
}
85+
86+
func (o *OptionSuite) TestWithSource() {
87+
err := WithSource()(&o.options)
88+
o.Require().NoError(err)
89+
o.Assert().True(o.source)
90+
}
91+
92+
func (o *OptionSuite) TestColor() {
93+
err := Color()(&o.options)
94+
o.Require().NoError(err)
95+
o.Assert().True(o.color)
96+
}
97+
98+
func (o *OptionSuite) TestAsJSON() {
99+
err := AsJSON()(&o.options)
100+
o.Require().NoError(err)
101+
o.Assert().NotNil(o.buildHandler)
102+
}
103+
104+
func (o *OptionSuite) TestAsText() {
105+
err := AsText()(&o.options)
106+
o.Require().NoError(err)
107+
o.Assert().NotNil(o.buildHandler)
108+
}
109+
110+
func (o *OptionSuite) TestDiscard() {
111+
err := Discard()(&o.options)
112+
o.Require().NoError(err)
113+
o.Assert().True(o.discard)
114+
}

xlog/xlog.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,13 @@ func (log *logger) With(a ...slog.Attr) Logger {
111111
// "error" and "fatal". Other input will result in err not being nil.
112112
func ParseLevel(s string) (l slog.Level, err error) {
113113
switch strings.ToLower(s) {
114-
case "debug":
114+
case "dbg", "debug":
115115
l = slog.LevelDebug
116116
case "info", "": // make the zero value useful
117117
l = slog.LevelInfo
118118
case "warn", "warning":
119119
l = slog.LevelWarn
120-
case "error", "fatal":
120+
case "err", "error", "fatal":
121121
l = slog.LevelError
122122
default:
123123
err = fmt.Errorf("unknown log level: %q", s)

0 commit comments

Comments
 (0)