mirror of
https://github.com/sosedoff/pgweb.git
synced 2024-12-14 19:21:46 +03:00
1897bef08d
* Add results format test * Init results slice before formatting data * Add extra test for nil check in CSV function
140 lines
3.0 KiB
Go
140 lines
3.0 KiB
Go
package client
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/sosedoff/pgweb/pkg/command"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestPostProcess(t *testing.T) {
|
|
t.Run("large numbers", func(t *testing.T) {
|
|
result := Result{
|
|
Columns: []string{"value"},
|
|
Rows: []Row{
|
|
{int(1234)},
|
|
{int64(9223372036854775807)},
|
|
{int64(-9223372036854775808)},
|
|
{float64(9223372036854775808.9223372036854775808)},
|
|
{float64(999999999999999.9)},
|
|
},
|
|
}
|
|
|
|
result.PostProcess()
|
|
|
|
assert.Equal(t, 1234, result.Rows[0][0])
|
|
assert.Equal(t, "9223372036854775807", result.Rows[1][0])
|
|
assert.Equal(t, "-9223372036854775808", result.Rows[2][0])
|
|
assert.Equal(t, "9.223372036854776e+18", result.Rows[3][0])
|
|
assert.Equal(t, "9.999999999999999e+14", result.Rows[4][0])
|
|
})
|
|
|
|
t.Run("binary encoding", func(t *testing.T) {
|
|
result := Result{
|
|
Columns: []string{"data"},
|
|
Rows: []Row{
|
|
{"text value"},
|
|
{"text with symbols !@#$%"},
|
|
{string([]byte{10, 11, 12, 13})},
|
|
},
|
|
}
|
|
|
|
result.PostProcess()
|
|
|
|
assert.Equal(t, "text value", result.Rows[0][0])
|
|
assert.Equal(t, "text with symbols !@#$%", result.Rows[1][0])
|
|
assert.Equal(t, "CgsMDQ==", result.Rows[2][0])
|
|
})
|
|
}
|
|
|
|
func TestCSV(t *testing.T) {
|
|
result := Result{
|
|
Columns: []string{"id", "name", "email", "extra"},
|
|
Rows: []Row{
|
|
{1, "John", "john@example.com", "data"},
|
|
{2, "Bob", "bob@example.com", nil},
|
|
},
|
|
}
|
|
|
|
expected := strings.Join([]string{
|
|
"id,name,email,extra",
|
|
"1,John,john@example.com,data",
|
|
"2,Bob,bob@example.com,",
|
|
}, "\n") + "\n"
|
|
|
|
assert.Equal(t, expected, string(result.CSV()))
|
|
}
|
|
|
|
func TestJSON(t *testing.T) {
|
|
result := Result{
|
|
Columns: []string{"id", "name", "email"},
|
|
Rows: []Row{
|
|
{1, "John", "john@example.com"},
|
|
{2, "Bob", "bob@example.com"},
|
|
},
|
|
}
|
|
|
|
obj := []struct {
|
|
Id int
|
|
Name string
|
|
Email string
|
|
}{}
|
|
|
|
expected := []struct {
|
|
Id int
|
|
Name string
|
|
Email string
|
|
}{
|
|
{1, "John", "john@example.com"},
|
|
{2, "Bob", "bob@example.com"},
|
|
}
|
|
|
|
assert.NoError(t, json.Unmarshal(result.JSON(), &obj))
|
|
assert.Equal(t, 2, len(obj))
|
|
assert.Equal(t, expected, obj)
|
|
|
|
t.Run("invalid time", func(t *testing.T) {
|
|
loc, err := time.LoadLocation("UTC")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
command.Opts.DisablePrettyJSON = true
|
|
defer func() {
|
|
command.Opts.DisablePrettyJSON = false
|
|
}()
|
|
|
|
result := Result{
|
|
Columns: []string{"value"},
|
|
Rows: []Row{
|
|
{time.Unix(1640995200, 0).In(loc)},
|
|
{time.Unix(222539616000, 0).In(loc)},
|
|
{time.Unix(254096611200, 0).In(loc)},
|
|
},
|
|
}
|
|
|
|
result.PostProcess()
|
|
assert.Equal(t, `[{"value":"2022-01-01T00:00:00Z"},{"value":"9022-01-01T00:00:00Z"},{"value":"ERR: INVALID_DATE"}]`, string(result.JSON()))
|
|
})
|
|
}
|
|
|
|
func TestResultFormat(t *testing.T) {
|
|
result := Result{
|
|
Columns: []string{"col1", "col2", "col3", "col4"},
|
|
Rows: []Row{
|
|
{"1", "2", "3", nil},
|
|
{"4", "5", "6", nil},
|
|
},
|
|
}
|
|
|
|
expected := []map[string]interface{}{
|
|
{"col1": "1", "col2": "2", "col3": "3", "col4": nil},
|
|
{"col1": "4", "col2": "5", "col3": "6", "col4": nil},
|
|
}
|
|
|
|
assert.Equal(t, expected, result.Format())
|
|
}
|