v1_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package dpsapi
  2. import (
  3. "fmt"
  4. "git.sxidc.com/go-tools/api_binding/http_binding"
  5. "git.sxidc.com/go-tools/api_binding/http_binding/binding_context"
  6. "git.sxidc.com/go-tools/api_binding/http_binding/response"
  7. "git.sxidc.com/service-supports/dps-sdk"
  8. "git.sxidc.com/service-supports/dps-sdk/client"
  9. "github.com/go-resty/resty/v2"
  10. "math/rand"
  11. "testing"
  12. "time"
  13. )
  14. func TestApiV1OperateParse(t *testing.T) {
  15. http_binding.Init("test", "10086")
  16. defer http_binding.Destroy()
  17. operatorID := simpleUUID()
  18. tableName := "students"
  19. exceptedTableRows := map[string]any{
  20. "id": "aaa",
  21. "name": "yjp",
  22. "age": float64(5),
  23. "rate": 92.5,
  24. "time": "2024-01-01T00:00:00+08:00",
  25. "is_right": false,
  26. }
  27. binding := http_binding.NewBinding("v1")
  28. ApiV1(binding, dpsAddress, func(c *binding_context.Context) (string, error) {
  29. return operatorID, nil
  30. })
  31. parsed := operateParse(t, parseSqlInsert)
  32. if parsed["table"] != tableName {
  33. t.Fatal("表名不正确")
  34. }
  35. for columnName, value := range parsed["tableRow"].(map[string]any) {
  36. if exceptedTableRows[columnName] != value {
  37. t.Fatal(columnName + "行数据不正确")
  38. }
  39. }
  40. parsed = operateParse(t, parseSqlUpdate)
  41. if parsed["table"] != tableName {
  42. t.Fatal("表名不正确")
  43. }
  44. if parsed["where"] != `(((id = 'aaa') AND (name = 'yjp')) AND (age < 100)) AND (describe IN ('yjp',))` {
  45. t.Fatal("where不正确")
  46. }
  47. for columnName, value := range parsed["newTableRow"].(map[string]any) {
  48. if exceptedTableRows[columnName] != value {
  49. t.Fatal(columnName + "行数据不正确")
  50. }
  51. }
  52. parsed = operateParse(t, parseSqlDelete)
  53. if parsed["table"] != tableName {
  54. t.Fatal("表名不正确")
  55. }
  56. if parsed["where"] != `(((id = 'aaa') AND (name = 'yjp')) AND (age < 100)) AND (describe IN ('yjp',))` {
  57. t.Fatal("where不正确")
  58. }
  59. parsed = operateParse(t, parseSqlSelectWithJoin)
  60. if parsed["table"] != "" {
  61. t.Fatal("table不正确")
  62. }
  63. if parsed["fromSubQuery"] != `students LEFT JOIN classes ON students.id = classes.student_id LEFT JOIN identities ON students.id = identities.student_id` {
  64. t.Fatal("fromSubQuery不正确")
  65. }
  66. if parsed["selectClause"] != "id, name, age" {
  67. t.Fatal("select语句不正确")
  68. }
  69. if parsed["where"] != `students.id = 'aaa'` {
  70. t.Fatal("where不正确")
  71. }
  72. if parsed["orderBy"] != "students.name DESC" {
  73. t.Fatal("orderBy不正确")
  74. }
  75. if parsed["groupBy"] != "" {
  76. t.Fatal("groupBy不正确")
  77. }
  78. if parsed["having"] != "" {
  79. t.Fatal("having不正确")
  80. }
  81. if parsed["pageNo"] != float64(2) {
  82. t.Fatal("pageNo不正确")
  83. }
  84. if parsed["pageSize"] != float64(20) {
  85. t.Fatal("pageSize不正确")
  86. }
  87. parsed = operateParse(t, parseSqlSelectWithSubQuery)
  88. if parsed["table"] != "" {
  89. t.Fatal("table不正确")
  90. }
  91. if parsed["fromSubQuery"] != `(SELECT * FROM class WHERE id = 'bbb')` {
  92. t.Fatal("fromSubQuery不正确")
  93. }
  94. if parsed["selectClause"] != "" {
  95. t.Fatal("select语句不正确")
  96. }
  97. if parsed["where"] != `(students.id = 'aaa') AND (students.age = 3)` {
  98. t.Fatal("where不正确")
  99. }
  100. if parsed["orderBy"] != "" {
  101. t.Fatal("orderBy不正确")
  102. }
  103. if parsed["groupBy"] != "" {
  104. t.Fatal("groupBy不正确")
  105. }
  106. if parsed["having"] != "" {
  107. t.Fatal("having不正确")
  108. }
  109. if parsed["pageNo"] != float64(0) {
  110. t.Fatal("pageNo不正确")
  111. }
  112. if parsed["pageSize"] != float64(0) {
  113. t.Fatal("pageSize不正确")
  114. }
  115. parsed = operateParse(t, parseSqlSelectWithGroupBy)
  116. if parsed["table"] != tableName {
  117. t.Fatal("table不正确")
  118. }
  119. if parsed["fromSubQuery"] != "" {
  120. t.Fatal("fromSubQuery不正确")
  121. }
  122. if parsed["selectClause"] != "count(*)" {
  123. t.Fatal("select语句不正确")
  124. }
  125. if parsed["where"] != "" {
  126. t.Fatal("where不正确")
  127. }
  128. if parsed["orderBy"] != "" {
  129. t.Fatal("orderBy不正确")
  130. }
  131. if parsed["groupBy"] == "name, age" {
  132. t.Fatal("groupBy不正确")
  133. }
  134. if parsed["having"] != "(name = 'aaa') AND (age = 5)" {
  135. t.Fatal("having不正确")
  136. }
  137. if parsed["pageNo"] != float64(0) {
  138. t.Fatal("pageNo不正确")
  139. }
  140. if parsed["pageSize"] != float64(0) {
  141. t.Fatal("pageSize不正确")
  142. }
  143. }
  144. func TestApiV1Operate(t *testing.T) {
  145. http_binding.Init("test", "10086")
  146. defer http_binding.Destroy()
  147. operatorID := simpleUUID()
  148. tablePrefix := "test.a" + simpleUUID()[0:7]
  149. id := simpleUUID()
  150. name := simpleUUID()
  151. now := time.Now().Local()
  152. tableNum := rand.Intn(10) + 1
  153. newName := simpleUUID()
  154. newNow := time.Now().Local()
  155. newTableNum := rand.Intn(10) + 1
  156. keyColumns := []string{"id"}
  157. autoMigrate(t, []client.AutoMigrateItem{
  158. {
  159. TablePrefixWithSchema: tablePrefix,
  160. Version: "v1",
  161. TableModelDescribe: tableModelDescribe,
  162. },
  163. })
  164. binding := http_binding.NewBinding("v1")
  165. ApiV1(binding, dpsAddress, func(c *binding_context.Context) (string, error) {
  166. return operatorID, nil
  167. })
  168. operate(t, fmt.Sprintf(sqlInsertFormat, tablePrefix, id, name, now.Format(time.DateTime), tableNum), keyColumns)
  169. operate(t, fmt.Sprintf(sqlUpdateFormat, tablePrefix, newName, newNow.Format(time.DateTime), newTableNum, id), keyColumns)
  170. operate(t, fmt.Sprintf(sqlDeleteFormat, tablePrefix, id), keyColumns)
  171. }
  172. func autoMigrate(t *testing.T, items []client.AutoMigrateItem) {
  173. dpsClient, err := dps.NewClient(dpsAddress, "v1", testDatabaseID)
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. err = dpsClient.AutoMigrate(&client.AutoMigrateRequest{Items: items})
  178. if err != nil {
  179. t.Fatal(err)
  180. }
  181. }
  182. func operateParse(t *testing.T, sql string) map[string]any {
  183. result := new(struct {
  184. response.MsgResponse
  185. Parsed map[string]any `json:"parsed"`
  186. })
  187. resp, err := resty.New().R().
  188. SetBody(&OperateParseRequest{
  189. SQL: sql,
  190. }).
  191. SetResult(result).
  192. Post("http://localhost:10086/test/api/v1/dpsv1/database/operate/parse")
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. if resp.IsError() {
  197. t.Fatal(resp.Status())
  198. }
  199. if !result.Success {
  200. t.Fatal(result.Msg)
  201. }
  202. return result.Parsed
  203. }
  204. func operate(t *testing.T, sql string, keyColumns []string) []map[string]any {
  205. result := new(struct {
  206. response.MsgResponse
  207. TableRows []map[string]any `json:"table_rows"`
  208. })
  209. resp, err := resty.New().R().
  210. SetBody(&OperateRequest{
  211. DatabaseID: testDatabaseID,
  212. Version: "v1",
  213. KeyColumns: keyColumns,
  214. SQL: sql,
  215. }).
  216. SetResult(result).
  217. Post("http://localhost:10086/test/api/v1/dpsv1/database/operate")
  218. if err != nil {
  219. t.Fatal(err)
  220. }
  221. if resp.IsError() {
  222. t.Fatal(resp.Status())
  223. }
  224. if !result.Success {
  225. t.Fatal(result.Msg)
  226. }
  227. return result.TableRows
  228. }