@@ -71,7 +71,7 @@ func TestParseLevel_error(t *testing.T) {
7171 {
7272 name : "map" ,
7373 input : map [string ]string {},
74- wantError : "levels must be a string or int value " ,
74+ wantError : "invalid log level: should be string, number, or bool " ,
7575 },
7676 {
7777 name : "invalid level modifier" ,
@@ -88,7 +88,7 @@ func TestParseLevel_error(t *testing.T) {
8888 }
8989}
9090
91- func TestLevelsMarshaling (t * testing.T ) {
91+ func TestLevels_MarshalText (t * testing.T ) {
9292 tests := []struct {
9393 name string
9494 levels Levels
@@ -211,11 +211,12 @@ func TestLevels_UnmarshalText(t *testing.T) {
211211func TestHandlerOptions_UnmarshalJSON (t * testing.T ) {
212212 theme := console .NewDefaultTheme ()
213213 tests := []struct {
214- name string
215- confJSON string
216- want string
217- expected HandlerOptions
218- wantErr string
214+ name string
215+ confJSON string
216+ want string
217+ expected HandlerOptions
218+ wantErr string
219+ wantErrIs error
219220 }{
220221 {
221222 name : "defaults" ,
@@ -280,18 +281,36 @@ func TestHandlerOptions_UnmarshalJSON(t *testing.T) {
280281 },
281282 },
282283 {
283- name : "encoding as alias for defaultSink " ,
284+ name : "encoding as alias for handler " ,
284285 confJSON : `{"encoding":"text"}` ,
285286 expected : HandlerOptions {
286287 HandlerFn : TextHandlerFn (),
287288 },
289+ want : "level=INFO msg=hi\n " ,
288290 },
289291 {
290292 name : "handler has higher precedence than encoding" ,
291293 confJSON : `{"handler":"text", "encoding":"json"}` ,
292294 expected : HandlerOptions {
293295 HandlerFn : TextHandlerFn (),
294296 },
297+ want : "level=INFO msg=hi\n " ,
298+ },
299+ {
300+ name : "encoding supports ltsv as alias for text" ,
301+ confJSON : `{"encoding":"ltsv"}` ,
302+ expected : HandlerOptions {
303+ HandlerFn : TextHandlerFn (),
304+ },
305+ want : "level=INFO msg=hi\n " ,
306+ },
307+ {
308+ name : "encoding supports console as alias for term" ,
309+ confJSON : `{"encoding":"console"}` ,
310+ expected : HandlerOptions {
311+ HandlerFn : TermHandlerFn (),
312+ },
313+ want : "|INF| hi\n " ,
295314 },
296315 {
297316 name : "addCaller as alias for addSource" ,
@@ -323,39 +342,77 @@ func TestHandlerOptions_UnmarshalJSON(t *testing.T) {
323342 },
324343 want : `{"level":"INFO","msg":"hi"}` + "\n " ,
325344 },
345+ {
346+ name : "term handler" ,
347+ confJSON : `{"handler":"term"}` ,
348+ expected : HandlerOptions {
349+ HandlerFn : TermHandlerFn (),
350+ },
351+ want : "|INF| hi\n " ,
352+ },
353+ {
354+ name : "term color handler" ,
355+ confJSON : `{"handler":"term-color"}` ,
356+ expected : HandlerOptions {
357+ HandlerFn : TermHandlerFn (),
358+ },
359+ want : "\x1b [2;1m|\x1b [0m\x1b [36mINF\x1b [0m\x1b [2;1m|\x1b [0m \x1b [1mhi\x1b [0m\n " ,
360+ },
361+ {
362+ name : "noop handler" ,
363+ confJSON : `{"handler":"noop"}` ,
364+ expected : HandlerOptions {
365+ HandlerFn : NoopHandlerFn (),
366+ },
367+ },
326368 {
327369 name : "invalid JSON" ,
328370 confJSON : `{out:"stderr"}` ,
329371 wantErr : "invalid character 'o' looking for beginning of object key string" ,
330372 },
331373 {
332- name : "invalid level" ,
333- confJSON : `{"level":"INVALID"}` ,
334- wantErr : "invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
374+ name : "invalid level" ,
375+ confJSON : `{"level":"INVALID"}` ,
376+ wantErr : "invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
377+ wantErrIs : ErrInvalidLevel ,
378+ },
379+ {
380+ name : "invalid levels string" ,
381+ confJSON : `{"levels":"*=INVALID"}` ,
382+ wantErr : "invalid levels value '*=INVALID': invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
383+ wantErrIs : ErrInvalidLevels ,
335384 },
336385 {
337- name : "invalid levels string" ,
338- confJSON : `{"levels":"*=INVALID"}` ,
339- wantErr : "invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
386+ name : "invalid levels map" ,
387+ confJSON : `{"levels":{"*":"INVALID"}}` ,
388+ wantErr : "invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
389+ wantErrIs : ErrInvalidLevel ,
340390 },
341391 {
342- name : "invalid levels map" ,
343- confJSON : `{"levels":{"*":"INVALID"}}` ,
344- wantErr : "invalid log level 'INVALID': slog: level string \" INVALID\" : unknown name" ,
392+ name : "invalid levels type" ,
393+ confJSON : `{"levels":1}` ,
394+ wantErr : "invalid levels value '1': must be a levels string or map" ,
395+ wantErrIs : ErrInvalidLevels ,
345396 },
346397 {
347- name : "invalid levels type" ,
348- confJSON : `{"levels":1}` ,
349- wantErr : "invalid levels value: 1" ,
398+ name : "unregistered handler" ,
399+ confJSON : `{"handler":"notfound"}` ,
400+ wantErr : "unregistered handler: 'notfound'" ,
401+ wantErrIs : ErrUnregisteredHandler ,
350402 },
351403 }
352404
353405 for _ , test := range tests {
354406 t .Run (test .name , func (t * testing.T ) {
355407 var opts HandlerOptions
356408 err := json .Unmarshal ([]byte (test .confJSON ), & opts )
357- if test .wantErr != "" {
358- assert .Error (t , err , test .wantErr )
409+ if test .wantErr != "" || test .wantErrIs != nil {
410+ if test .wantErrIs != nil {
411+ assert .ErrorIs (t , err , test .wantErrIs ) //nolint:testifylint
412+ }
413+ if test .wantErr != "" {
414+ assert .EqualError (t , err , test .wantErr ) //nolint:testifylint
415+ }
359416 return
360417 }
361418
0 commit comments