package models import ( "encoding" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) var _ encoding.TextUnmarshaler = new(Log) const first = "@begin January 01, 2020 at 01:02:03AM -0000 - This is simple @end\n" const second = `@begin January 01, 2020 at 01:02:05AM -0000 - We have one thing here @foo bar @end ` const third = `@begin January 01, 2020 at 01:02:07AM -0000 - We have two things here @num 42 @newline true @end ` const fourth = `@begin 2020-01-01T01:02:09Z - ISO-8601 date @end ` const skip = "@ignoreme true\n" const fifth = `@begin 2020-01-01T01:02:11+00:00 - ISO-8601 other date @with-timezone yes @end ` const badEntry = "@begin bad date no title @end\n" const all = first + second + third + fourth + skip + fifth func TestLogUnmarshalBig(t *testing.T) { l := &Log{Name: "test-log"} err := l.UnmarshalText([]byte(all)) require.NoError(t, err) require.Len(t, l.Entries, 5) var e Entry var f bool if e, f = findEntry(t, l, "This is simple", true); !f { return } assert.Len(t, e.Fields, 0) for _, e := range l.Entries { findMeta(t, e, "ignoreme", true, false) } } func TestLogUnmarshalIgnoreGarbage(t *testing.T) { l := &Log{Name: "test-log"} in := "ignore this\n" + second + "some crap also skip -> " + third + skip err := l.UnmarshalText([]byte(in)) require.NoError(t, err) require.Len(t, l.Entries, 1) en := l.Entries[0] assert.Equal(t, "We have one thing here", en.Title) assert.Len(t, en.Fields, 1) assert.Equal(t, "foo", en.Fields[0].Key) assert.Equal(t, "bar", en.Fields[0].Value) } func TestLogUnmarshalEmpty(t *testing.T) { l := &Log{Name: "test-log"} err := l.UnmarshalText([]byte{}) require.NoError(t, err) require.Len(t, l.Entries, 0) } func TestLogUnmarshalBad(t *testing.T) { l := &Log{Name: "test-log"} err := l.UnmarshalText([]byte(badEntry)) require.NoError(t, err) require.Len(t, l.Entries, 0) } func findEntry(t *testing.T, log *Log, title string, shouldFind bool) (Entry, bool) { var ret Entry found := false for _, e := range log.Entries { if e.Title == title { ret = e found = true } } if shouldFind { found = assert.Truef(t, found, "Unable to found entry %s", title) } else { found = assert.Falsef(t, found, "Entry %s should not have been found but was", title) } return ret, found } func findMeta(t *testing.T, entry Entry, key string, value any, shouldFind bool) (Meta, bool) { var ret Meta found := false for _, m := range entry.Fields { if m.Key == key && m.Value == value { ret = m found = true } } if shouldFind { found = assert.Truef(t, found, "Unable to found meta %s", key) } else { found = assert.Falsef(t, found, "Meta %s should not have been found but was", key) } return ret, found }