package main import ( "bytes" "strings" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" ) func TestRenderTable(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() columns := []string{"play", "player", "text"} mock.ExpectQuery("SELECT"). WillReturnRows( sqlmock.NewRows(columns). AddRow("Hamlet", "Hamlet", "To be or not to be"). AddRow("Macbeth", "Macbeth", "Out, out brief candle!"). AddRow("Romeo and Juliet", "Juliet", "O Romeo, Romeo!"), ) rows, err := db.Query("SELECT play, player, text FROM plays") assert.NoError(t, err) defer rows.Close() table, err := RenderTable(rows, []string{"no-wrap", "no-wrap", ""}) assert.NoError(t, err) assert.NotNil(t, table) var buf bytes.Buffer err = table.Render(&buf) assert.NoError(t, err) html := buf.String() assert.Contains(t, html, "") assert.Contains(t, html, "
") assert.Contains(t, html, "") assert.Contains(t, html, "") assert.Contains(t, html, "") assert.Contains(t, html, "") assert.Contains(t, html, `play`) assert.Contains(t, html, `player`) assert.Contains(t, html, `text`) assert.Contains(t, html, `Hamlet`) assert.Contains(t, html, `Macbeth`) assert.Contains(t, html, `Romeo and Juliet`) assert.Contains(t, html, `Hamlet`) assert.Contains(t, html, `Macbeth`) assert.Contains(t, html, `Juliet`) assert.Contains(t, html, "To be or not to be") assert.Contains(t, html, "Out, out brief candle!") assert.Contains(t, html, "O Romeo, Romeo!") } func TestRenderTableWithNilValues(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() columns := []string{"id", "name", "description"} mock.ExpectQuery("SELECT"). WillReturnRows( sqlmock.NewRows(columns). AddRow(1, "Item 1", nil). AddRow(2, nil, "Description 2"), ) rows, err := db.Query("SELECT id, name, description FROM items") assert.NoError(t, err) defer rows.Close() table, err := RenderTable(rows, []string{"no-wrap", "no-wrap", ""}) assert.NoError(t, err) var buf bytes.Buffer err = table.Render(&buf) assert.NoError(t, err) html := buf.String() assert.Contains(t, html, `1`) assert.Contains(t, html, `Item 1`) assert.Contains(t, html, "") assert.Contains(t, html, `2`) } func TestRenderTableWithByteValues(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() columns := []string{"id", "data"} mock.ExpectQuery("SELECT"). WillReturnRows( sqlmock.NewRows(columns). AddRow(1, []byte("binary data")), ) rows, err := db.Query("SELECT id, data FROM blobs") assert.NoError(t, err) defer rows.Close() table, err := RenderTable(rows, []string{"no-wrap", "no-wrap"}) assert.NoError(t, err) var buf bytes.Buffer err = table.Render(&buf) assert.NoError(t, err) html := buf.String() assert.Contains(t, html, `binary data`) } func TestRenderTableWithSpecialCharacters(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) defer db.Close() columns := []string{"id", "content"} mock.ExpectQuery("SELECT"). WillReturnRows( sqlmock.NewRows(columns). AddRow(1, ""). AddRow(2, "A & B"), ) rows, err := db.Query("SELECT id, content FROM texts") assert.NoError(t, err) defer rows.Close() table, err := RenderTable(rows, []string{"", ""}) assert.NoError(t, err) var buf bytes.Buffer err = table.Render(&buf) assert.NoError(t, err) html := buf.String() assert.Contains(t, html, "<script>") assert.Contains(t, html, "&") assert.NotContains(t, html, "