Skip to content

Commit 0632308

Browse files
authored
Merge pull request #76 from cdr/assert-improvements
assert: add ErrorContains and move name arg to first parameter
2 parents 82a5884 + ece955b commit 0632308

File tree

12 files changed

+116
-100
lines changed

12 files changed

+116
-100
lines changed

internal/assert/assert.go

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,75 +3,50 @@ package assert
33

44
import (
55
"reflect"
6-
"strings"
76
"testing"
87
)
98

109
// Equal asserts exp == act.
11-
func Equal(t testing.TB, exp, act interface{}, name string) {
10+
func Equal(t testing.TB, name string, exp, act interface{}) {
1211
t.Helper()
1312
if !reflect.DeepEqual(exp, act) {
1413
t.Fatalf("unexpected %v: exp: %q but got %q", name, exp, act)
1514
}
1615
}
1716

18-
// NotEqual asserts exp != act.
19-
func NotEqual(t testing.TB, exp, act interface{}, name string) {
20-
t.Helper()
21-
if reflect.DeepEqual(exp, act) {
22-
t.Fatalf("expected different %v: %q", name, act)
23-
}
24-
}
25-
2617
// Success asserts err == nil.
27-
func Success(t testing.TB, err error, name string) {
18+
func Success(t testing.TB, name string, err error) {
2819
t.Helper()
2920
if err != nil {
3021
t.Fatalf("unexpected error for %v: %+v", name, err)
3122
}
3223
}
3324

3425
// Error asserts exp != nil.
35-
func Error(t testing.TB, err error, name string) {
26+
func Error(t testing.TB, name string, err error) {
3627
t.Helper()
3728
if err == nil {
3829
t.Fatalf("expected error from %v", name)
3930
}
4031
}
4132

42-
// ErrorContains asserts the error string from err contains sub.
43-
func ErrorContains(t testing.TB, err error, sub, name string) {
44-
t.Helper()
45-
Error(t, err, name)
46-
errs := err.Error()
47-
if !strings.Contains(errs, sub) {
48-
t.Fatalf("error string %q from %v does not contain %q", errs, name, sub)
49-
}
50-
}
51-
5233
// True asserts true == act.
53-
func True(t testing.TB, act bool, name string) {
34+
func True(t testing.TB, name string, act bool) {
5435
t.Helper()
55-
Equal(t, true, act, name)
36+
Equal(t, name, true, act)
5637
}
5738

5839
// False asserts false == act.
59-
func False(t testing.TB, act bool, name string) {
40+
func False(t testing.TB, name string, act bool) {
6041
t.Helper()
61-
Equal(t, false, act, name)
42+
Equal(t, name, false, act)
6243
}
6344

6445
// Len asserts n == len(a).
65-
func Len(t testing.TB, n int, a interface{}, name string) {
46+
func Len(t testing.TB, name string, n int, a interface{}) {
6647
t.Helper()
6748
act := reflect.ValueOf(a).Len()
6849
if n != act {
6950
t.Fatalf("expected len(%v) == %v but got %v", name, n, act)
7051
}
7152
}
72-
73-
// Nil asserts v == nil.
74-
func Nil(t testing.TB, v interface{}, name string) {
75-
t.Helper()
76-
Equal(t, nil, v, name)
77-
}

internal/entryhuman/entry_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestEntry(t *testing.T) {
1919

2020
test := func(t *testing.T, in slog.SinkEntry, exp string) {
2121
act := entryhuman.Fmt(ioutil.Discard, in)
22-
assert.Equal(t, exp, act, "entry")
22+
assert.Equal(t, "entry", exp, act)
2323
}
2424

2525
t.Run("basic", func(t *testing.T) {
@@ -89,6 +89,6 @@ line2`)
8989
slog.F("hey", "hi"),
9090
),
9191
})
92-
assert.Equal(t, "0001-01-01 00:00:00.000 \x1b[91m[CRITICAL]\x1b[0m\t\x1b[36m<.:0>\x1b[0m\t\"\"\t{\x1b[34m\"hey\"\x1b[0m: \x1b[32m\"hi\"\x1b[0m}", act, "entry")
92+
assert.Equal(t, "entry", "0001-01-01 00:00:00.000 \x1b[91m[CRITICAL]\x1b[0m\t\x1b[36m<.:0>\x1b[0m\t\"\"\t{\x1b[34m\"hey\"\x1b[0m: \x1b[32m\"hi\"\x1b[0m}", act)
9393
})
9494
}

internal/syncwriter/syncwriter_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestWriter_Sync(t *testing.T) {
3131

3232
tw := newWriter(nil)
3333
tw.w.Sync("test")
34-
assert.Equal(t, 0, tw.errors, "errors")
34+
assert.Equal(t, "errors", 0, tw.errors)
3535
})
3636

3737
t.Run("syncWriter", func(t *testing.T) {
@@ -46,17 +46,17 @@ func TestWriter_Sync(t *testing.T) {
4646
},
4747
})
4848
tw.w.Write("hello", nil)
49-
assert.Equal(t, 1, tw.errors, "errors")
49+
assert.Equal(t, "errors", 1, tw.errors)
5050
tw.w.Sync("test")
51-
assert.Equal(t, 2, tw.errors, "errors")
51+
assert.Equal(t, "errors", 2, tw.errors)
5252
})
5353

5454
t.Run("stdout", func(t *testing.T) {
5555
t.Parallel()
5656

5757
tw := newWriter(os.Stdout)
5858
tw.w.Sync("test")
59-
assert.Equal(t, 0, tw.errors, "errors")
59+
assert.Equal(t, "errors", 0, tw.errors)
6060
})
6161

6262
t.Run("errorf", func(t *testing.T) {
@@ -77,8 +77,8 @@ func TestWriter_Sync(t *testing.T) {
7777
func Test_errorsIsAny(t *testing.T) {
7878
t.Parallel()
7979

80-
assert.True(t, errorsIsAny(io.EOF, io.ErrUnexpectedEOF, io.EOF), "err")
81-
assert.False(t, errorsIsAny(io.EOF, io.ErrUnexpectedEOF, io.ErrClosedPipe), "err")
80+
assert.True(t, "err", errorsIsAny(io.EOF, io.ErrUnexpectedEOF, io.EOF))
81+
assert.False(t, "err", errorsIsAny(io.EOF, io.ErrUnexpectedEOF, io.ErrClosedPipe))
8282
}
8383

8484
type syncWriter struct {

map_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestMap(t *testing.T) {
2424
t.Helper()
2525
exp = indentJSON(t, exp)
2626
act := marshalJSON(t, m)
27-
assert.Equal(t, exp, act, "JSON")
27+
assert.Equal(t, "JSON", exp, act)
2828
}
2929

3030
t.Run("JSON", func(t *testing.T) {
@@ -253,13 +253,13 @@ func (m meow) SlogValue() interface{} {
253253
func indentJSON(t *testing.T, j string) string {
254254
b := &bytes.Buffer{}
255255
err := json.Indent(b, []byte(j), "", strings.Repeat(" ", 4))
256-
assert.Success(t, err, "indent JSON")
256+
assert.Success(t, "indent JSON", err)
257257

258258
return b.String()
259259
}
260260

261261
func marshalJSON(t *testing.T, m slog.Map) string {
262262
actb, err := json.Marshal(m)
263-
assert.Success(t, err, "marshal map to JSON")
263+
assert.Success(t, "marshal map to JSON", err)
264264
return indentJSON(t, string(actb))
265265
}

s_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestStdlib(t *testing.T) {
2121
stdlibLog.Println("stdlib")
2222

2323
et, rest, err := entryhuman.StripTimestamp(b.String())
24-
assert.Success(t, err, "strip timestamp")
25-
assert.False(t, et.IsZero(), "timestamp")
26-
assert.Equal(t, " [INFO]\t(stdlib)\t<s_test.go:21>\tstdlib\t{\"hi\": \"we\"}\n", rest, "entry")
24+
assert.Success(t, "strip timestamp", err)
25+
assert.False(t, "timestamp", et.IsZero())
26+
assert.Equal(t, "entry", " [INFO]\t(stdlib)\t<s_test.go:21>\tstdlib\t{\"hi\": \"we\"}\n", rest)
2727
}

slog_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ func TestLogger(t *testing.T) {
4444
l.Info(bg, "wow", slog.Error(io.EOF))
4545
l.Error(bg, "meow", slog.Error(io.ErrUnexpectedEOF))
4646

47-
assert.Equal(t, 1, s1.syncs, "syncs")
48-
assert.Len(t, 1, s1.entries, "entries")
47+
assert.Equal(t, "syncs", 1, s1.syncs)
48+
assert.Len(t, "entries", 1, s1.entries)
4949

50-
assert.Equal(t, s1, s2, "sinks")
50+
assert.Equal(t, "sinks", s1, s2)
5151
})
5252

5353
t.Run("helper", func(t *testing.T) {
@@ -65,8 +65,8 @@ func TestLogger(t *testing.T) {
6565
)
6666
h(ctx)
6767

68-
assert.Len(t, 1, s.entries, "entries")
69-
assert.Equal(t, slog.SinkEntry{
68+
assert.Len(t, "entries", 1, s.entries)
69+
assert.Equal(t, "entry", slog.SinkEntry{
7070
Time: s.entries[0].Time,
7171

7272
Level: slog.LevelInfo,
@@ -79,7 +79,7 @@ func TestLogger(t *testing.T) {
7979
Fields: slog.M(
8080
slog.F("ctx", 1024),
8181
),
82-
}, s.entries[0], "entry")
82+
}, s.entries[0])
8383
})
8484

8585
t.Run("entry", func(t *testing.T) {
@@ -96,8 +96,8 @@ func TestLogger(t *testing.T) {
9696

9797
l.Info(ctx, "meow", slog.F("hi", "xd"))
9898

99-
assert.Len(t, 1, s.entries, "entries")
100-
assert.Equal(t, slog.SinkEntry{
99+
assert.Len(t, "entries", 1, s.entries)
100+
assert.Equal(t, "entry", slog.SinkEntry{
101101
Time: s.entries[0].Time,
102102

103103
Level: slog.LevelInfo,
@@ -116,7 +116,7 @@ func TestLogger(t *testing.T) {
116116
slog.F("ctx", io.EOF),
117117
slog.F("hi", "xd"),
118118
),
119-
}, s.entries[0], "entry")
119+
}, s.entries[0])
120120
})
121121

122122
t.Run("levels", func(t *testing.T) {
@@ -138,20 +138,20 @@ func TestLogger(t *testing.T) {
138138
l.Critical(bg, "")
139139
l.Fatal(bg, "")
140140

141-
assert.Len(t, 6, s.entries, "entries")
142-
assert.Equal(t, 3, s.syncs, "syncs")
143-
assert.Equal(t, slog.LevelDebug, s.entries[0].Level, "level")
144-
assert.Equal(t, slog.LevelInfo, s.entries[1].Level, "level")
145-
assert.Equal(t, slog.LevelWarn, s.entries[2].Level, "level")
146-
assert.Equal(t, slog.LevelError, s.entries[3].Level, "level")
147-
assert.Equal(t, slog.LevelCritical, s.entries[4].Level, "level")
148-
assert.Equal(t, slog.LevelFatal, s.entries[5].Level, "level")
149-
assert.Equal(t, 1, exits, "exits")
141+
assert.Len(t, "entries", 6, s.entries)
142+
assert.Equal(t, "syncs", 3, s.syncs)
143+
assert.Equal(t, "level", slog.LevelDebug, s.entries[0].Level)
144+
assert.Equal(t, "level", slog.LevelInfo, s.entries[1].Level)
145+
assert.Equal(t, "level", slog.LevelWarn, s.entries[2].Level)
146+
assert.Equal(t, "level", slog.LevelError, s.entries[3].Level)
147+
assert.Equal(t, "level", slog.LevelCritical, s.entries[4].Level)
148+
assert.Equal(t, "level", slog.LevelFatal, s.entries[5].Level)
149+
assert.Equal(t, "exits", 1, exits)
150150
})
151151
}
152152

153153
func TestLevel_String(t *testing.T) {
154154
t.Parallel()
155155

156-
assert.Equal(t, "slog.Level(12)", slog.Level(12).String(), "level string")
156+
assert.Equal(t, "level string", "slog.Level(12)", slog.Level(12).String())
157157
}

sloggers/sloghuman/sloghuman_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestMake(t *testing.T) {
2222
l.Sync()
2323

2424
et, rest, err := entryhuman.StripTimestamp(b.String())
25-
assert.Success(t, err, "strip timestamp")
26-
assert.False(t, et.IsZero(), "timestamp")
27-
assert.Equal(t, " [INFO]\t<sloghuman_test.go:21>\t...\t{\"wowow\": \"me\\nyou\"}\n \"msg\": line1\n\n line2\n", rest, "entry")
25+
assert.Success(t, "strip timestamp", err)
26+
assert.False(t, "timestamp", et.IsZero())
27+
assert.Equal(t, "entry", " [INFO]\t<sloghuman_test.go:21>\t...\t{\"wowow\": \"me\\nyou\"}\n \"msg\": line1\n\n line2\n", rest)
2828
}

sloggers/slogjson/slogjson_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ func TestMake(t *testing.T) {
3131
j := entryjson.Filter(b.String(), "ts")
3232
exp := fmt.Sprintf(`{"level":"ERROR","msg":"line1\n\nline2","caller":"%v:29","func":"cdr.dev/slog/sloggers/slogjson_test.TestMake","logger_names":["named"],"trace":"%v","span":"%v","fields":{"wowow":"me\nyou"}}
3333
`, slogjsonTestFile, s.SpanContext().TraceID, s.SpanContext().SpanID)
34-
assert.Equal(t, exp, j, "entry")
34+
assert.Equal(t, "entry", exp, j)
3535
}

sloggers/slogstackdriver/slogstackdriver_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ func TestStackdriver(t *testing.T) {
3131
j := entryjson.Filter(b.String(), "timestamp")
3232
exp := fmt.Sprintf(`{"severity":"ERROR","message":"line1\n\nline2","logging.googleapis.com/sourceLocation":{"file":"%v","line":29,"function":"cdr.dev/slog/sloggers/slogstackdriver_test.TestStackdriver"},"logging.googleapis.com/operation":{"producer":"meow"},"logging.googleapis.com/trace":"projects//traces/%v","logging.googleapis.com/spanId":"%v","logging.googleapis.com/trace_sampled":false,"wowow":"me\nyou"}
3333
`, slogstackdriverTestFile, s.SpanContext().TraceID, s.SpanContext().SpanID)
34-
assert.Equal(t, exp, j, "entry")
34+
assert.Equal(t, "entry", exp, j)
3535
}
3636

3737
func TestSevMapping(t *testing.T) {
3838
t.Parallel()
3939

40-
assert.Equal(t, logpbtype.LogSeverity_DEBUG, slogstackdriver.Sev(slog.LevelDebug), "level")
41-
assert.Equal(t, logpbtype.LogSeverity_INFO, slogstackdriver.Sev(slog.LevelInfo), "level")
42-
assert.Equal(t, logpbtype.LogSeverity_WARNING, slogstackdriver.Sev(slog.LevelWarn), "level")
43-
assert.Equal(t, logpbtype.LogSeverity_ERROR, slogstackdriver.Sev(slog.LevelError), "level")
44-
assert.Equal(t, logpbtype.LogSeverity_CRITICAL, slogstackdriver.Sev(slog.LevelCritical), "level")
40+
assert.Equal(t, "level", logpbtype.LogSeverity_DEBUG, slogstackdriver.Sev(slog.LevelDebug))
41+
assert.Equal(t, "level", logpbtype.LogSeverity_INFO, slogstackdriver.Sev(slog.LevelInfo))
42+
assert.Equal(t, "level", logpbtype.LogSeverity_WARNING, slogstackdriver.Sev(slog.LevelWarn))
43+
assert.Equal(t, "level", logpbtype.LogSeverity_ERROR, slogstackdriver.Sev(slog.LevelError))
44+
assert.Equal(t, "level", logpbtype.LogSeverity_CRITICAL, slogstackdriver.Sev(slog.LevelCritical))
4545
}

sloggers/slogtest/assert/assert.go

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package assert // import "cdr.dev/slog/sloggers/slogtest/assert"
88
import (
99
"errors"
1010
"reflect"
11+
"strings"
1112
"testing"
1213

1314
"cdr.dev/slog"
@@ -20,7 +21,7 @@ import (
2021
// two objects.
2122
//
2223
// If act or exp is an error it will be unwrapped.
23-
func Equal(t testing.TB, exp, act interface{}, name string) {
24+
func Equal(t testing.TB, name string, exp, act interface{}) {
2425
slog.Helper()
2526

2627
exp = unwrapErr(exp)
@@ -36,7 +37,7 @@ func Equal(t testing.TB, exp, act interface{}, name string) {
3637
}
3738

3839
// Success asserts err == nil.
39-
func Success(t testing.TB, err error, name string) {
40+
func Success(t testing.TB, name string, err error) {
4041
slog.Helper()
4142
if err != nil {
4243
slogtest.Fatal(t, "unexpected error",
@@ -47,13 +48,13 @@ func Success(t testing.TB, err error, name string) {
4748
}
4849

4950
// True asserts act == true.
50-
func True(t testing.TB, act bool, name string) {
51+
func True(t testing.TB, name string, act bool) {
5152
slog.Helper()
52-
Equal(t, true, act, name)
53+
Equal(t, name, true, act)
5354
}
5455

5556
// Error asserts err != nil.
56-
func Error(t testing.TB, err error, name string) {
57+
func Error(t testing.TB, name string, err error) {
5758
slog.Helper()
5859
if err == nil {
5960
slogtest.Fatal(t, "expected error",
@@ -74,3 +75,29 @@ func unwrapErr(v interface{}) interface{} {
7475
}
7576
return err
7677
}
78+
79+
// ErrorContains asserts err != nil and err.Error() contains sub.
80+
//
81+
// The match will be case insensitive.
82+
func ErrorContains(t testing.TB, name string, err error, sub string) {
83+
slog.Helper()
84+
85+
Error(t, name, err)
86+
87+
errs := err.Error()
88+
if !stringContainsFold(errs, sub) {
89+
slogtest.Fatal(t, "unexpected error string",
90+
slog.F("name", name),
91+
slog.F("error_string", errs),
92+
slog.F("expected_contains", sub),
93+
)
94+
}
95+
}
96+
97+
func stringContainsFold(errs, sub string) bool {
98+
errs = strings.ToLower(errs)
99+
sub = strings.ToLower(sub)
100+
101+
return strings.Contains(errs, sub)
102+
103+
}

0 commit comments

Comments
 (0)