utils_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package sqlx
  2. import (
  3. "strings"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestEscape(t *testing.T) {
  9. s := "a\x00\n\r\\'\"\x1ab"
  10. out := escape(s)
  11. assert.Equal(t, `a\x00\n\r\\\'\"\x1ab`, out)
  12. }
  13. func TestDesensitize(t *testing.T) {
  14. datasource := "user:pass@tcp(111.222.333.44:3306)/any_table?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai"
  15. datasource = desensitize(datasource)
  16. assert.False(t, strings.Contains(datasource, "user"))
  17. assert.False(t, strings.Contains(datasource, "pass"))
  18. assert.True(t, strings.Contains(datasource, "tcp(111.222.333.44:3306)"))
  19. }
  20. func TestDesensitize_WithoutAccount(t *testing.T) {
  21. datasource := "tcp(111.222.333.44:3306)/any_table?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai"
  22. datasource = desensitize(datasource)
  23. assert.True(t, strings.Contains(datasource, "tcp(111.222.333.44:3306)"))
  24. }
  25. func TestFormat(t *testing.T) {
  26. tests := []struct {
  27. name string
  28. query string
  29. args []any
  30. expect string
  31. hasErr bool
  32. }{
  33. {
  34. name: "mysql normal",
  35. query: "select name, age from users where bool=? and phone=?",
  36. args: []any{true, "133"},
  37. expect: "select name, age from users where bool=1 and phone='133'",
  38. },
  39. {
  40. name: "mysql normal",
  41. query: "select name, age from users where bool=? and phone=?",
  42. args: []any{false, "133"},
  43. expect: "select name, age from users where bool=0 and phone='133'",
  44. },
  45. {
  46. name: "pg normal",
  47. query: "select name, age from users where bool=$1 and phone=$2",
  48. args: []any{true, "133"},
  49. expect: "select name, age from users where bool=1 and phone='133'",
  50. },
  51. {
  52. name: "pg normal reverse",
  53. query: "select name, age from users where bool=$2 and phone=$1",
  54. args: []any{"133", false},
  55. expect: "select name, age from users where bool=0 and phone='133'",
  56. },
  57. {
  58. name: "pg error not number",
  59. query: "select name, age from users where bool=$a and phone=$1",
  60. args: []any{"133", false},
  61. hasErr: true,
  62. },
  63. {
  64. name: "pg error more args",
  65. query: "select name, age from users where bool=$2 and phone=$1 and nickname=$3",
  66. args: []any{"133", false},
  67. hasErr: true,
  68. },
  69. {
  70. name: "oracle normal",
  71. query: "select name, age from users where bool=:1 and phone=:2",
  72. args: []any{true, "133"},
  73. expect: "select name, age from users where bool=1 and phone='133'",
  74. },
  75. {
  76. name: "oracle normal reverse",
  77. query: "select name, age from users where bool=:2 and phone=:1",
  78. args: []any{"133", false},
  79. expect: "select name, age from users where bool=0 and phone='133'",
  80. },
  81. {
  82. name: "oracle error not number",
  83. query: "select name, age from users where bool=:a and phone=:1",
  84. args: []any{"133", false},
  85. hasErr: true,
  86. },
  87. {
  88. name: "oracle error more args",
  89. query: "select name, age from users where bool=:2 and phone=:1 and nickname=:3",
  90. args: []any{"133", false},
  91. hasErr: true,
  92. },
  93. {
  94. name: "select with date",
  95. query: "select * from user where date='2006-01-02 15:04:05' and name=:1",
  96. args: []any{"foo"},
  97. expect: "select * from user where date='2006-01-02 15:04:05' and name='foo'",
  98. },
  99. {
  100. name: "select with date and escape",
  101. query: `select * from user where date=' 2006-01-02 15:04:05 \'' and name=:1`,
  102. args: []any{"foo"},
  103. expect: `select * from user where date=' 2006-01-02 15:04:05 \'' and name='foo'`,
  104. },
  105. {
  106. name: "select with date and bad arg",
  107. query: `select * from user where date='2006-01-02 15:04:05 \'' and name=:a`,
  108. args: []any{"foo"},
  109. hasErr: true,
  110. },
  111. {
  112. name: "select with date and escape error",
  113. query: `select * from user where date='2006-01-02 15:04:05 \`,
  114. args: []any{"foo"},
  115. hasErr: true,
  116. },
  117. }
  118. for _, test := range tests {
  119. test := test
  120. t.Run(test.name, func(t *testing.T) {
  121. t.Parallel()
  122. actual, err := format(test.query, test.args...)
  123. if test.hasErr {
  124. assert.NotNil(t, err)
  125. } else {
  126. assert.Nil(t, err)
  127. assert.Equal(t, test.expect, actual)
  128. }
  129. })
  130. }
  131. }
  132. func TestWriteValue(t *testing.T) {
  133. var buf strings.Builder
  134. tm := time.Now()
  135. writeValue(&buf, &tm)
  136. assert.Equal(t, "'"+tm.String()+"'", buf.String())
  137. buf.Reset()
  138. writeValue(&buf, tm)
  139. assert.Equal(t, "'"+tm.String()+"'", buf.String())
  140. }