sdk_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package main
  2. import (
  3. "fmt"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "git.sxidc.com/service-supports/ds-sdk/sdk"
  6. "git.sxidc.com/service-supports/ds-sdk/sdk/raw_sql_tpl"
  7. "git.sxidc.com/service-supports/ds-sdk/sdk/tag"
  8. "github.com/iancoleman/strcase"
  9. "math/rand"
  10. "sync"
  11. "testing"
  12. "time"
  13. )
  14. type Class struct {
  15. ID string `sqlmapping:"key;" mapstructure:"id"`
  16. Name string `sqlmapping:"updateClear;" mapstructure:"name"`
  17. StudentNum int `sqlmapping:"column:student_num;notUpdate;" mapstructure:"student_num_alias"`
  18. GraduatedTime time.Time `sqlresult:"callback" mapstructure:"graduated_time"`
  19. CreatedTime *time.Time `mapstructure:"created_time"`
  20. LastUpdatedTime time.Time `mapstructure:"last_updated_time"`
  21. Ignored string `sqlmapping:"-" mapstructure:"-"`
  22. }
  23. const (
  24. token = "IpTTwAQweh/BP51fz5CzWKQFaXHvZe6ewvk6yOcAOkU="
  25. address = "localhost"
  26. httpPort = "10000"
  27. grpcPort = "10001"
  28. namespace = "ns-sdk-demo"
  29. dataSource = "ds-sdk-demo"
  30. deleteSql = "delete-sdk-demo"
  31. goRoutineCount = 100
  32. tableName = "test.classes"
  33. )
  34. var (
  35. sqlSpec = sdk.SqlSpec{
  36. Clauses: "- DELETE FROM {{ .table_name }} WHERE id = '{{ .id }}'",
  37. }
  38. )
  39. func TestBasic(t *testing.T) {
  40. classID := strutils.SimpleUUID()
  41. className := strutils.SimpleUUID()
  42. studentNum := rand.Int31n(100)
  43. now := time.Now()
  44. insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
  45. TableName: tableName,
  46. TableRows: raw_sql_tpl.NewTableRows().Add("id", classID).
  47. Add("name", className).
  48. Add("student_num", studentNum).
  49. Add("graduated_time", now).
  50. Add("created_time", now).
  51. Add("last_updated_time", now),
  52. }.Map()
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. deleteExecuteParams := map[string]any{
  57. "table_name": tableName,
  58. "id": classID,
  59. }
  60. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. defer func() {
  65. err := sdk.DestroyInstance()
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. }()
  70. err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. defer func() {
  75. err = sdk.GetInstance().DeleteSQL(deleteSql)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. }()
  80. _, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. _, err = sdk.GetInstance().ExecuteSql(deleteSql, deleteExecuteParams)
  85. if err != nil {
  86. t.Fatal(err)
  87. }
  88. wg := sync.WaitGroup{}
  89. wg.Add(goRoutineCount)
  90. start := time.Now()
  91. for i := 0; i < goRoutineCount; i++ {
  92. go func() {
  93. defer wg.Done()
  94. err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
  95. _, err := tx.ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
  96. if err != nil {
  97. return err
  98. }
  99. _, err = tx.ExecuteSql(deleteSql, deleteExecuteParams)
  100. if err != nil {
  101. return err
  102. }
  103. return nil
  104. })
  105. if err != nil {
  106. panic(err)
  107. }
  108. }()
  109. }
  110. wg.Wait()
  111. end := time.Now()
  112. fmt.Println(end.Sub(start).Milliseconds())
  113. }
  114. func TestRawSqlTemplate(t *testing.T) {
  115. classID := strutils.SimpleUUID()
  116. className := strutils.SimpleUUID()
  117. studentNum := rand.Int31n(100)
  118. newClassName := strutils.SimpleUUID()
  119. newStudentNum := rand.Int31n(100)
  120. now := time.Now()
  121. exceptedNowStr := now.Format("2006-01-02T15:04:05.000000+08:00")
  122. insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
  123. TableName: tableName,
  124. TableRows: raw_sql_tpl.NewTableRows().Add("id", classID).
  125. Add("name", className).
  126. Add("student_num", studentNum).
  127. Add("graduated_time", now).
  128. Add("created_time", now).
  129. Add("last_updated_time", now),
  130. }.Map()
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. deleteExecuteParams, err := raw_sql_tpl.DeleteExecuteParams{
  135. TableName: tableName,
  136. Conditions: raw_sql_tpl.NewConditions().Equal("id", classID),
  137. }.Map()
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. updateExecuteParams, err := raw_sql_tpl.UpdateExecuteParams{
  142. TableName: tableName,
  143. TableRows: raw_sql_tpl.NewTableRows().Add("name", newClassName).
  144. Add("student_num", newStudentNum),
  145. Conditions: raw_sql_tpl.NewConditions().Equal("id", classID),
  146. }.Map()
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. queryExecuteParams, err := raw_sql_tpl.QueryExecuteParams{
  151. TableName: tableName,
  152. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  153. Conditions: raw_sql_tpl.NewConditions().
  154. Equal("id", classID).
  155. Equal("name", className).
  156. Equal("student_num", studentNum),
  157. PageNo: 1,
  158. PageSize: 1,
  159. }.Map()
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. newQueryExecuteParams, err := raw_sql_tpl.QueryExecuteParams{
  164. TableName: tableName,
  165. SelectColumns: []string{"id", "name", "student_num as student_num_alias", "graduated_time", "created_time", "last_updated_time"},
  166. Conditions: raw_sql_tpl.NewConditions().
  167. Equal("id", classID).
  168. Equal("name", newClassName).
  169. Equal("student_num", newStudentNum),
  170. PageNo: 0,
  171. PageSize: 0,
  172. }.Map()
  173. if err != nil {
  174. t.Fatal(err)
  175. }
  176. countExecuteParams, err := raw_sql_tpl.ConditionsExecuteParams{
  177. TableName: tableName,
  178. Conditions: raw_sql_tpl.NewConditions().
  179. Equal("id", classID).
  180. Equal("name", className).
  181. Equal("student_num", studentNum),
  182. }.Map()
  183. if err != nil {
  184. t.Fatal(err)
  185. }
  186. newCountExecuteParams, err := raw_sql_tpl.ConditionsExecuteParams{
  187. TableName: tableName,
  188. Conditions: raw_sql_tpl.NewConditions().
  189. Equal("id", classID).
  190. Equal("name", newClassName).
  191. Equal("student_num", newStudentNum),
  192. }.Map()
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. defer func() {
  201. err := sdk.DestroyInstance()
  202. if err != nil {
  203. t.Fatal(err)
  204. }
  205. }()
  206. _, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.InsertTpl, insertExecuteParams)
  207. if err != nil {
  208. t.Fatal(err)
  209. }
  210. queryResults, err := sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.QueryTpl, queryExecuteParams)
  211. if err != nil {
  212. t.Fatal(err)
  213. }
  214. countResults, err := sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.CountTpl, countExecuteParams)
  215. if err != nil {
  216. t.Fatal(err)
  217. }
  218. if float64(len(queryResults)) != countResults[0]["count"].(float64) {
  219. t.Fatal("总数不正确")
  220. }
  221. if queryResults[0]["id"].(string) != classID ||
  222. queryResults[0]["name"].(string) != className ||
  223. queryResults[0]["student_num_alias"].(float64) != float64(studentNum) ||
  224. queryResults[0]["graduated_time"].(string) != exceptedNowStr ||
  225. queryResults[0]["created_time"].(string) != exceptedNowStr ||
  226. queryResults[0]["last_updated_time"].(string) != exceptedNowStr {
  227. t.Fatal("查询数据不正确")
  228. }
  229. _, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.UpdateTpl, updateExecuteParams)
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. queryResults, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.QueryTpl, newQueryExecuteParams)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. countResults, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.CountTpl, newCountExecuteParams)
  238. if err != nil {
  239. t.Fatal(err)
  240. }
  241. if float64(len(queryResults)) != countResults[0]["count"].(float64) {
  242. t.Fatal("总数不正确")
  243. }
  244. if queryResults[0]["id"].(string) != classID ||
  245. queryResults[0]["name"].(string) != newClassName ||
  246. queryResults[0]["student_num_alias"].(float64) != float64(newStudentNum) ||
  247. queryResults[0]["graduated_time"].(string) != exceptedNowStr ||
  248. queryResults[0]["created_time"].(string) != exceptedNowStr ||
  249. queryResults[0]["last_updated_time"].(string) != exceptedNowStr {
  250. t.Fatal("查询数据不正确")
  251. }
  252. _, err = sdk.GetInstance().ExecuteRawSql(raw_sql_tpl.DeleteTpl, deleteExecuteParams)
  253. if err != nil {
  254. t.Fatal(err)
  255. }
  256. }
  257. func TestSqlMapping(t *testing.T) {
  258. sqlMapping, err := tag.ParseSqlMapping(&Class{})
  259. if err != nil {
  260. t.Fatal(err)
  261. }
  262. for fieldName, sqlColumn := range sqlMapping.ColumnMap {
  263. if fieldName != "ID" && fieldName != "Name" &&
  264. fieldName != "StudentNum" && fieldName != "GraduatedTime" &&
  265. fieldName != "CreatedTime" && fieldName != "LastUpdatedTime" {
  266. t.Fatal("字段名不正确")
  267. }
  268. if sqlColumn.Name != "id" && sqlColumn.Name != "name" &&
  269. sqlColumn.Name != "student_num" && sqlColumn.Name != "graduated_time" &&
  270. sqlColumn.Name != "created_time" && sqlColumn.Name != "last_updated_time" {
  271. t.Fatal("列名不正确")
  272. }
  273. if sqlColumn.Name != strcase.ToSnake(fieldName) {
  274. t.Fatal("列名不正确")
  275. }
  276. if sqlColumn.IsKey && sqlColumn.Name != "id" {
  277. t.Fatal("键字段不正确")
  278. }
  279. if !sqlColumn.CanUpdate && (sqlColumn.Name != "id" && sqlColumn.Name != "student_num") {
  280. t.Fatal("不可更新字段不正确")
  281. }
  282. if sqlColumn.CanUpdateClear && sqlColumn.Name != "name" {
  283. t.Fatal("可清除字段不正确")
  284. }
  285. }
  286. }
  287. func TestSql(t *testing.T) {
  288. classID := strutils.SimpleUUID()
  289. className := strutils.SimpleUUID()
  290. studentNum := rand.Int31n(100)
  291. newClassName := strutils.SimpleUUID()
  292. newStudentNum := rand.Int31n(100)
  293. now := time.Now()
  294. insertExecuteParams, err := raw_sql_tpl.InsertExecuteParams{
  295. TableName: tableName,
  296. TableRows: raw_sql_tpl.NewTableRows().Add("id", classID).
  297. Add("name", className).
  298. Add("student_num", studentNum).
  299. Add("graduated_time", now).
  300. Add("created_time", now).
  301. Add("last_updated_time", now),
  302. }.Map()
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. deleteExecuteParams := map[string]any{
  307. "table_name": tableName,
  308. "id": classID,
  309. }
  310. class := &Class{
  311. ID: classID,
  312. Name: className,
  313. StudentNum: int(studentNum),
  314. GraduatedTime: time.Now(),
  315. Ignored: "",
  316. }
  317. newClass := &Class{
  318. ID: classID,
  319. Name: newClassName,
  320. StudentNum: int(newStudentNum),
  321. GraduatedTime: time.Now(),
  322. Ignored: "",
  323. }
  324. err = sdk.InitInstance(token, address, httpPort, grpcPort, namespace, dataSource)
  325. if err != nil {
  326. t.Fatal(err)
  327. }
  328. defer func() {
  329. err := sdk.DestroyInstance()
  330. if err != nil {
  331. t.Fatal(err)
  332. }
  333. }()
  334. err = sdk.GetInstance().CreateSQL(deleteSql, sqlSpec.ToMap())
  335. if err != nil {
  336. t.Fatal(err)
  337. }
  338. defer func() {
  339. err = sdk.GetInstance().DeleteSQL(deleteSql)
  340. if err != nil {
  341. t.Fatal(err)
  342. }
  343. }()
  344. err = sdk.InsertEntity(sdk.GetInstance(), tableName, class)
  345. if err != nil {
  346. t.Fatal(err)
  347. }
  348. err = sdk.UpdateEntity(sdk.GetInstance(), tableName, newClass)
  349. if err != nil {
  350. t.Fatal(err)
  351. }
  352. err = sdk.DeleteEntity(sdk.GetInstance(), tableName, class)
  353. if err != nil {
  354. t.Fatal(err)
  355. }
  356. _, err = sdk.ExecuteRawSql(sdk.GetInstance(), raw_sql_tpl.InsertTpl, insertExecuteParams)
  357. if err != nil {
  358. t.Fatal(err)
  359. }
  360. _, err = sdk.ExecuteSql(sdk.GetInstance(), deleteSql, deleteExecuteParams)
  361. if err != nil {
  362. t.Fatal(err)
  363. }
  364. err = sdk.GetInstance().Transaction(func(tx *sdk.Transaction) error {
  365. err = sdk.InsertEntity(tx, tableName, class)
  366. if err != nil {
  367. t.Fatal(err)
  368. }
  369. err = sdk.UpdateEntity(tx, tableName, newClass)
  370. if err != nil {
  371. t.Fatal(err)
  372. }
  373. err = sdk.DeleteEntity(tx, tableName, class)
  374. if err != nil {
  375. t.Fatal(err)
  376. }
  377. _, err = sdk.ExecuteRawSql(tx, raw_sql_tpl.InsertTpl, insertExecuteParams)
  378. if err != nil {
  379. t.Fatal(err)
  380. }
  381. _, err = sdk.ExecuteSql(tx, deleteSql, deleteExecuteParams)
  382. if err != nil {
  383. t.Fatal(err)
  384. }
  385. return nil
  386. })
  387. if err != nil {
  388. t.Fatal(err)
  389. }
  390. }