123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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)
- }
- }
|