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, "