184 lines
3.5 KiB
Go
184 lines
3.5 KiB
Go
package dbconnect
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestCommandValidateEmpty(t *testing.T) {
|
|
stmts := []string{
|
|
"",
|
|
";",
|
|
" \n\t",
|
|
";\n;\t;",
|
|
}
|
|
|
|
for _, stmt := range stmts {
|
|
cmd := Command{Statement: stmt}
|
|
|
|
assert.Error(t, cmd.Validate(), stmt)
|
|
}
|
|
}
|
|
|
|
func TestCommandValidateMode(t *testing.T) {
|
|
modes := []string{
|
|
"",
|
|
"query",
|
|
"ExEc",
|
|
"PREPARE",
|
|
}
|
|
|
|
for _, mode := range modes {
|
|
cmd := Command{Statement: "Ok", Mode: mode}
|
|
|
|
assert.NoError(t, cmd.Validate(), mode)
|
|
assert.Equal(t, strings.ToLower(mode), cmd.Mode)
|
|
}
|
|
}
|
|
|
|
func TestCommandValidateIsolation(t *testing.T) {
|
|
isos := []string{
|
|
"",
|
|
"default",
|
|
"read_committed",
|
|
"SNAPshot",
|
|
}
|
|
|
|
for _, iso := range isos {
|
|
cmd := Command{Statement: "Ok", Isolation: iso}
|
|
|
|
assert.NoError(t, cmd.Validate(), iso)
|
|
assert.Equal(t, strings.ToLower(iso), cmd.Isolation)
|
|
}
|
|
}
|
|
|
|
func TestCommandValidateTimeout(t *testing.T) {
|
|
cmd := Command{Statement: "Ok", Timeout: 0}
|
|
|
|
assert.NoError(t, cmd.Validate())
|
|
assert.NotZero(t, cmd.Timeout)
|
|
|
|
cmd = Command{Statement: "Ok", Timeout: 1 * time.Second}
|
|
|
|
assert.NoError(t, cmd.Validate())
|
|
assert.Equal(t, 1*time.Second, cmd.Timeout)
|
|
}
|
|
|
|
func TestCommandValidateArguments(t *testing.T) {
|
|
cmd := Command{Statement: "Ok", Arguments: Arguments{
|
|
Named: map[string]interface{}{"key": "val"},
|
|
Positional: []interface{}{"val"},
|
|
}}
|
|
|
|
assert.Error(t, cmd.Validate())
|
|
}
|
|
|
|
func TestCommandUnmarshalJSON(t *testing.T) {
|
|
strs := []string{
|
|
"{\"statement\":\"Ok\"}",
|
|
"{\"statement\":\"Ok\",\"arguments\":[0, 3.14, \"apple\"],\"mode\":\"query\"}",
|
|
"{\"statement\":\"Ok\",\"isolation\":\"read_uncommitted\",\"timeout\":1000}",
|
|
}
|
|
|
|
for _, str := range strs {
|
|
var cmd Command
|
|
assert.NoError(t, json.Unmarshal([]byte(str), &cmd), str)
|
|
}
|
|
|
|
strs = []string{
|
|
"",
|
|
"\"",
|
|
"{}",
|
|
"{\"argument\":{\"key\":\"val\"}}",
|
|
"{\"statement\":[\"Ok\"]}",
|
|
}
|
|
|
|
for _, str := range strs {
|
|
var cmd Command
|
|
assert.Error(t, json.Unmarshal([]byte(str), &cmd), str)
|
|
}
|
|
}
|
|
|
|
func TestArgumentsValidateNotNil(t *testing.T) {
|
|
args := Arguments{}
|
|
|
|
assert.NoError(t, args.Validate())
|
|
assert.NotNil(t, args.Named)
|
|
assert.NotNil(t, args.Positional)
|
|
}
|
|
|
|
func TestArgumentsValidateMutuallyExclusive(t *testing.T) {
|
|
args := []Arguments{
|
|
Arguments{},
|
|
Arguments{Named: map[string]interface{}{"key": "val"}},
|
|
Arguments{Positional: []interface{}{"val"}},
|
|
}
|
|
|
|
for _, arg := range args {
|
|
assert.NoError(t, arg.Validate())
|
|
assert.False(t, len(arg.Named) > 0 && len(arg.Positional) > 0)
|
|
}
|
|
|
|
args = []Arguments{
|
|
Arguments{
|
|
Named: map[string]interface{}{"key": "val"},
|
|
Positional: []interface{}{"val"},
|
|
},
|
|
}
|
|
|
|
for _, arg := range args {
|
|
assert.Error(t, arg.Validate())
|
|
assert.True(t, len(arg.Named) > 0 && len(arg.Positional) > 0)
|
|
}
|
|
}
|
|
|
|
func TestArgumentsValidateKeys(t *testing.T) {
|
|
keys := []string{
|
|
"",
|
|
"_",
|
|
"_key",
|
|
"1",
|
|
"1key",
|
|
"\xf0\x28\x8c\xbc", // non-utf8
|
|
}
|
|
|
|
for _, key := range keys {
|
|
args := Arguments{Named: map[string]interface{}{key: "val"}}
|
|
|
|
assert.Error(t, args.Validate(), key)
|
|
}
|
|
}
|
|
|
|
func TestArgumentsUnmarshalJSON(t *testing.T) {
|
|
strs := []string{
|
|
"{}",
|
|
"{\"key\":\"val\"}",
|
|
"{\"key\":[1, 3.14, {\"key\":\"val\"}]}",
|
|
"[]",
|
|
"[\"key\",\"val\"]",
|
|
"[{}]",
|
|
}
|
|
|
|
for _, str := range strs {
|
|
var args Arguments
|
|
assert.NoError(t, json.Unmarshal([]byte(str), &args), str)
|
|
}
|
|
|
|
strs = []string{
|
|
"",
|
|
"\"",
|
|
"1",
|
|
"\"key\"",
|
|
"{\"key\",\"val\"}",
|
|
}
|
|
|
|
for _, str := range strs {
|
|
var args Arguments
|
|
assert.Error(t, json.Unmarshal([]byte(str), &args), str)
|
|
}
|
|
}
|