diff --git a/levels.go b/levels.go index 7d43a43..ac74fb5 100644 --- a/levels.go +++ b/levels.go @@ -41,6 +41,9 @@ var levelStrings = map[string]Level{ // String implementation. func (l Level) String() string { + if l < DebugLevel || int(l) >= len(levelNames) { + return "invalid" + } return levelNames[l] } diff --git a/levels_test.go b/levels_test.go index e2d84f1..6b19fe9 100644 --- a/levels_test.go +++ b/levels_test.go @@ -58,3 +58,30 @@ func TestLevel_UnmarshalJSON(t *testing.T) { assert.NoError(t, err) assert.Equal(t, InfoLevel, e.Level) } + +func TestLevel_String(t *testing.T) { + cases := []struct { + Level Level + String string + }{ + {DebugLevel, "debug"}, + {InfoLevel, "info"}, + {WarnLevel, "warn"}, + {ErrorLevel, "error"}, + {FatalLevel, "fatal"}, + {InvalidLevel, "invalid"}, + {Level(99), "invalid"}, + } + + for _, c := range cases { + t.Run(c.String, func(t *testing.T) { + assert.Equal(t, c.String, c.Level.String()) + }) + } +} + +func TestLevel_MarshalJSON_Invalid(t *testing.T) { + b, err := json.Marshal(InvalidLevel) + assert.NoError(t, err) + assert.Equal(t, `"invalid"`, string(b)) +}