package formatters import ( "bufio" "bytes" "fmt" "testing" "time" "codeberg.org/danjones000/my-log/models" "codeberg.org/danjones000/my-log/tools" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestPlainLogs(t *testing.T) { m := []models.Meta{ {"foo", "bar"}, {"baz", 42}, } e := []models.Entry{ {Title: "one", Date: time.Now(), Fields: m}, {Title: "small", Date: time.Now()}, } l := models.Log{"stuff", e} e2 := models.Entry{ Title: "three", Date: time.Now(), } l2 := models.Log{"more-stuff", []models.Entry{e2}} logs := []models.Log{l, l2} f, err := New("plain") require.NoError(t, err) out, err := f.Logs(logs) require.NoError(t, err) read := bytes.NewReader(out) scan := bufio.NewScanner(read) scan.Scan() line := scan.Text() assert.Equal(t, l.Name, line) scan.Scan() line = scan.Text() assert.Equal(t, "#######", line) scan.Scan() scan.Scan() line = scan.Text() assert.Equal(t, "Title: "+e[0].Title, line) scan.Scan() line = scan.Text() assert.Equal(t, "Date: "+e[0].Date.Format(tools.DateFormat), line) scan.Scan() line = scan.Text() assert.Equal(t, "foo: bar", line) scan.Scan() line = scan.Text() assert.Equal(t, "baz: 42", line) scan.Scan() scan.Scan() line = scan.Text() assert.Equal(t, "Title: "+e[1].Title, line) scan.Scan() line = scan.Text() assert.Equal(t, "Date: "+e[1].Date.Format(tools.DateFormat), line) scan.Scan() scan.Scan() line = scan.Text() assert.Equal(t, l2.Name, line) scan.Scan() line = scan.Text() assert.Equal(t, "#######", line) scan.Scan() scan.Scan() line = scan.Text() assert.Equal(t, "Title: "+e2.Title, line) scan.Scan() line = scan.Text() assert.Equal(t, "Date: "+e2.Date.Format(tools.DateFormat), line) more := scan.Scan() assert.False(t, more) } func TestPlainName(t *testing.T) { f, _ := New("plain") assert.Equal(t, "plain", f.Name()) } func TestPlainLogNone(t *testing.T) { f, _ := New("plain") out, err := f.Logs([]models.Log{}) assert.NoError(t, err) assert.Len(t, out, 0) } func TestPlainLogNoEntries(t *testing.T) { f, _ := New("plain") out, err := f.Log(models.Log{Name: "foo"}) assert.NoError(t, err) assert.Len(t, out, 0) } func TestPlainMetaEmpty(t *testing.T) { f, _ := New("plain") out, err := f.Meta(models.Meta{"foo", ""}) assert.NoError(t, err) assert.Len(t, out, 0) } func TestPlainMetaError(t *testing.T) { f, _ := New("plain") out, err := f.Meta(models.Meta{"foo", make(chan bool)}) assert.Error(t, err) assert.Len(t, out, 0) } func TestPlainEntry(t *testing.T) { f, _ := New("plain") now := time.Now() out, err := f.Entry(models.Entry{ Title: "foo", Date: now, }) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("Title: foo\nDate: %s", now.Format(tools.DateFormat)), string(out)) }