client_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package dbconnect
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestCommandValidateEmpty(t *testing.T) {
  10. stmts := []string{
  11. "",
  12. ";",
  13. " \n\t",
  14. ";\n;\t;",
  15. }
  16. for _, stmt := range stmts {
  17. cmd := Command{Statement: stmt}
  18. assert.Error(t, cmd.Validate(), stmt)
  19. }
  20. }
  21. func TestCommandValidateMode(t *testing.T) {
  22. modes := []string{
  23. "",
  24. "query",
  25. "ExEc",
  26. "PREPARE",
  27. }
  28. for _, mode := range modes {
  29. cmd := Command{Statement: "Ok", Mode: mode}
  30. assert.NoError(t, cmd.Validate(), mode)
  31. assert.Equal(t, strings.ToLower(mode), cmd.Mode)
  32. }
  33. }
  34. func TestCommandValidateIsolation(t *testing.T) {
  35. isos := []string{
  36. "",
  37. "default",
  38. "read_committed",
  39. "SNAPshot",
  40. }
  41. for _, iso := range isos {
  42. cmd := Command{Statement: "Ok", Isolation: iso}
  43. assert.NoError(t, cmd.Validate(), iso)
  44. assert.Equal(t, strings.ToLower(iso), cmd.Isolation)
  45. }
  46. }
  47. func TestCommandValidateTimeout(t *testing.T) {
  48. cmd := Command{Statement: "Ok", Timeout: 0}
  49. assert.NoError(t, cmd.Validate())
  50. assert.NotZero(t, cmd.Timeout)
  51. cmd = Command{Statement: "Ok", Timeout: 1 * time.Second}
  52. assert.NoError(t, cmd.Validate())
  53. assert.Equal(t, 1*time.Second, cmd.Timeout)
  54. }
  55. func TestCommandValidateArguments(t *testing.T) {
  56. cmd := Command{Statement: "Ok", Arguments: Arguments{
  57. Named: map[string]interface{}{"key": "val"},
  58. Positional: []interface{}{"val"},
  59. }}
  60. assert.Error(t, cmd.Validate())
  61. }
  62. func TestCommandUnmarshalJSON(t *testing.T) {
  63. strs := []string{
  64. "{\"statement\":\"Ok\"}",
  65. "{\"statement\":\"Ok\",\"arguments\":[0, 3.14, \"apple\"],\"mode\":\"query\"}",
  66. "{\"statement\":\"Ok\",\"isolation\":\"read_uncommitted\",\"timeout\":1000}",
  67. }
  68. for _, str := range strs {
  69. var cmd Command
  70. assert.NoError(t, json.Unmarshal([]byte(str), &cmd), str)
  71. }
  72. strs = []string{
  73. "",
  74. "\"",
  75. "{}",
  76. "{\"argument\":{\"key\":\"val\"}}",
  77. "{\"statement\":[\"Ok\"]}",
  78. }
  79. for _, str := range strs {
  80. var cmd Command
  81. assert.Error(t, json.Unmarshal([]byte(str), &cmd), str)
  82. }
  83. }
  84. func TestArgumentsValidateNotNil(t *testing.T) {
  85. args := Arguments{}
  86. assert.NoError(t, args.Validate())
  87. assert.NotNil(t, args.Named)
  88. assert.NotNil(t, args.Positional)
  89. }
  90. func TestArgumentsValidateMutuallyExclusive(t *testing.T) {
  91. args := []Arguments{
  92. Arguments{},
  93. Arguments{Named: map[string]interface{}{"key": "val"}},
  94. Arguments{Positional: []interface{}{"val"}},
  95. }
  96. for _, arg := range args {
  97. assert.NoError(t, arg.Validate())
  98. assert.False(t, len(arg.Named) > 0 && len(arg.Positional) > 0)
  99. }
  100. args = []Arguments{
  101. Arguments{
  102. Named: map[string]interface{}{"key": "val"},
  103. Positional: []interface{}{"val"},
  104. },
  105. }
  106. for _, arg := range args {
  107. assert.Error(t, arg.Validate())
  108. assert.True(t, len(arg.Named) > 0 && len(arg.Positional) > 0)
  109. }
  110. }
  111. func TestArgumentsValidateKeys(t *testing.T) {
  112. keys := []string{
  113. "",
  114. "_",
  115. "_key",
  116. "1",
  117. "1key",
  118. "\xf0\x28\x8c\xbc", // non-utf8
  119. }
  120. for _, key := range keys {
  121. args := Arguments{Named: map[string]interface{}{key: "val"}}
  122. assert.Error(t, args.Validate(), key)
  123. }
  124. }
  125. func TestArgumentsUnmarshalJSON(t *testing.T) {
  126. strs := []string{
  127. "{}",
  128. "{\"key\":\"val\"}",
  129. "{\"key\":[1, 3.14, {\"key\":\"val\"}]}",
  130. "[]",
  131. "[\"key\",\"val\"]",
  132. "[{}]",
  133. }
  134. for _, str := range strs {
  135. var args Arguments
  136. assert.NoError(t, json.Unmarshal([]byte(str), &args), str)
  137. }
  138. strs = []string{
  139. "",
  140. "\"",
  141. "1",
  142. "\"key\"",
  143. "{\"key\",\"val\"}",
  144. }
  145. for _, str := range strs {
  146. var args Arguments
  147. assert.Error(t, json.Unmarshal([]byte(str), &args), str)
  148. }
  149. }