orm_test.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. package sqlx
  2. import (
  3. "database/sql"
  4. "testing"
  5. "github.com/DATA-DOG/go-sqlmock"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/tal-tech/go-zero/core/logx"
  8. )
  9. func TestUnmarshalRowBool(t *testing.T) {
  10. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  11. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1")
  12. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  13. var value bool
  14. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  15. return unmarshalRow(&value, rows, true)
  16. }, "select value from users where user=?", "anyone"))
  17. assert.True(t, value)
  18. })
  19. }
  20. func TestUnmarshalRowInt(t *testing.T) {
  21. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  22. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2")
  23. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  24. var value int
  25. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  26. return unmarshalRow(&value, rows, true)
  27. }, "select value from users where user=?", "anyone"))
  28. assert.EqualValues(t, 2, value)
  29. })
  30. }
  31. func TestUnmarshalRowInt8(t *testing.T) {
  32. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  33. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("3")
  34. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  35. var value int8
  36. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  37. return unmarshalRow(&value, rows, true)
  38. }, "select value from users where user=?", "anyone"))
  39. assert.EqualValues(t, int8(3), value)
  40. })
  41. }
  42. func TestUnmarshalRowInt16(t *testing.T) {
  43. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  44. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("4")
  45. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  46. var value int16
  47. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  48. return unmarshalRow(&value, rows, true)
  49. }, "select value from users where user=?", "anyone"))
  50. assert.Equal(t, int16(4), value)
  51. })
  52. }
  53. func TestUnmarshalRowInt32(t *testing.T) {
  54. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  55. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("5")
  56. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  57. var value int32
  58. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  59. return unmarshalRow(&value, rows, true)
  60. }, "select value from users where user=?", "anyone"))
  61. assert.Equal(t, int32(5), value)
  62. })
  63. }
  64. func TestUnmarshalRowInt64(t *testing.T) {
  65. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  66. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("6")
  67. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  68. var value int64
  69. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  70. return unmarshalRow(&value, rows, true)
  71. }, "select value from users where user=?", "anyone"))
  72. assert.EqualValues(t, int64(6), value)
  73. })
  74. }
  75. func TestUnmarshalRowUint(t *testing.T) {
  76. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  77. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2")
  78. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  79. var value uint
  80. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  81. return unmarshalRow(&value, rows, true)
  82. }, "select value from users where user=?", "anyone"))
  83. assert.EqualValues(t, uint(2), value)
  84. })
  85. }
  86. func TestUnmarshalRowUint8(t *testing.T) {
  87. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  88. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("3")
  89. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  90. var value uint8
  91. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  92. return unmarshalRow(&value, rows, true)
  93. }, "select value from users where user=?", "anyone"))
  94. assert.EqualValues(t, uint8(3), value)
  95. })
  96. }
  97. func TestUnmarshalRowUint16(t *testing.T) {
  98. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  99. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("4")
  100. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  101. var value uint16
  102. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  103. return unmarshalRow(&value, rows, true)
  104. }, "select value from users where user=?", "anyone"))
  105. assert.EqualValues(t, uint16(4), value)
  106. })
  107. }
  108. func TestUnmarshalRowUint32(t *testing.T) {
  109. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  110. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("5")
  111. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  112. var value uint32
  113. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  114. return unmarshalRow(&value, rows, true)
  115. }, "select value from users where user=?", "anyone"))
  116. assert.EqualValues(t, uint32(5), value)
  117. })
  118. }
  119. func TestUnmarshalRowUint64(t *testing.T) {
  120. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  121. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("6")
  122. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  123. var value uint64
  124. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  125. return unmarshalRow(&value, rows, true)
  126. }, "select value from users where user=?", "anyone"))
  127. assert.EqualValues(t, uint16(6), value)
  128. })
  129. }
  130. func TestUnmarshalRowFloat32(t *testing.T) {
  131. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  132. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("7")
  133. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  134. var value float32
  135. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  136. return unmarshalRow(&value, rows, true)
  137. }, "select value from users where user=?", "anyone"))
  138. assert.EqualValues(t, float32(7), value)
  139. })
  140. }
  141. func TestUnmarshalRowFloat64(t *testing.T) {
  142. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  143. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("8")
  144. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  145. var value float64
  146. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  147. return unmarshalRow(&value, rows, true)
  148. }, "select value from users where user=?", "anyone"))
  149. assert.EqualValues(t, float64(8), value)
  150. })
  151. }
  152. func TestUnmarshalRowString(t *testing.T) {
  153. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  154. const expect = "hello"
  155. rs := sqlmock.NewRows([]string{"value"}).FromCSVString(expect)
  156. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  157. var value string
  158. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  159. return unmarshalRow(&value, rows, true)
  160. }, "select value from users where user=?", "anyone"))
  161. assert.EqualValues(t, expect, value)
  162. })
  163. }
  164. func TestUnmarshalRowStruct(t *testing.T) {
  165. var value = new(struct {
  166. Name string
  167. Age int
  168. })
  169. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  170. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  171. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  172. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  173. return unmarshalRow(value, rows, true)
  174. }, "select name, age from users where user=?", "anyone"))
  175. assert.Equal(t, "liao", value.Name)
  176. assert.Equal(t, 5, value.Age)
  177. })
  178. }
  179. func TestUnmarshalRowStructWithTags(t *testing.T) {
  180. var value = new(struct {
  181. Age int `db:"age"`
  182. Name string `db:"name"`
  183. })
  184. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  185. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  186. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  187. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  188. return unmarshalRow(value, rows, true)
  189. }, "select name, age from users where user=?", "anyone"))
  190. assert.Equal(t, "liao", value.Name)
  191. assert.Equal(t, 5, value.Age)
  192. })
  193. }
  194. func TestUnmarshalRowsBool(t *testing.T) {
  195. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  196. var expect = []bool{true, false}
  197. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  198. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  199. var value []bool
  200. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  201. return unmarshalRows(&value, rows, true)
  202. }, "select value from users where user=?", "anyone"))
  203. assert.EqualValues(t, expect, value)
  204. })
  205. }
  206. func TestUnmarshalRowsInt(t *testing.T) {
  207. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  208. var expect = []int{2, 3}
  209. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  210. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  211. var value []int
  212. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  213. return unmarshalRows(&value, rows, true)
  214. }, "select value from users where user=?", "anyone"))
  215. assert.EqualValues(t, expect, value)
  216. })
  217. }
  218. func TestUnmarshalRowsInt8(t *testing.T) {
  219. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  220. var expect = []int8{2, 3}
  221. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  222. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  223. var value []int8
  224. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  225. return unmarshalRows(&value, rows, true)
  226. }, "select value from users where user=?", "anyone"))
  227. assert.EqualValues(t, expect, value)
  228. })
  229. }
  230. func TestUnmarshalRowsInt16(t *testing.T) {
  231. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  232. var expect = []int16{2, 3}
  233. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  234. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  235. var value []int16
  236. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  237. return unmarshalRows(&value, rows, true)
  238. }, "select value from users where user=?", "anyone"))
  239. assert.EqualValues(t, expect, value)
  240. })
  241. }
  242. func TestUnmarshalRowsInt32(t *testing.T) {
  243. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  244. var expect = []int32{2, 3}
  245. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  246. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  247. var value []int32
  248. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  249. return unmarshalRows(&value, rows, true)
  250. }, "select value from users where user=?", "anyone"))
  251. assert.EqualValues(t, expect, value)
  252. })
  253. }
  254. func TestUnmarshalRowsInt64(t *testing.T) {
  255. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  256. var expect = []int64{2, 3}
  257. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  258. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  259. var value []int64
  260. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  261. return unmarshalRows(&value, rows, true)
  262. }, "select value from users where user=?", "anyone"))
  263. assert.EqualValues(t, expect, value)
  264. })
  265. }
  266. func TestUnmarshalRowsUint(t *testing.T) {
  267. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  268. var expect = []uint{2, 3}
  269. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  270. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  271. var value []uint
  272. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  273. return unmarshalRows(&value, rows, true)
  274. }, "select value from users where user=?", "anyone"))
  275. assert.EqualValues(t, expect, value)
  276. })
  277. }
  278. func TestUnmarshalRowsUint8(t *testing.T) {
  279. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  280. var expect = []uint8{2, 3}
  281. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  282. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  283. var value []uint8
  284. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  285. return unmarshalRows(&value, rows, true)
  286. }, "select value from users where user=?", "anyone"))
  287. assert.EqualValues(t, expect, value)
  288. })
  289. }
  290. func TestUnmarshalRowsUint16(t *testing.T) {
  291. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  292. var expect = []uint16{2, 3}
  293. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  294. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  295. var value []uint16
  296. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  297. return unmarshalRows(&value, rows, true)
  298. }, "select value from users where user=?", "anyone"))
  299. assert.EqualValues(t, expect, value)
  300. })
  301. }
  302. func TestUnmarshalRowsUint32(t *testing.T) {
  303. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  304. var expect = []uint32{2, 3}
  305. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  306. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  307. var value []uint32
  308. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  309. return unmarshalRows(&value, rows, true)
  310. }, "select value from users where user=?", "anyone"))
  311. assert.EqualValues(t, expect, value)
  312. })
  313. }
  314. func TestUnmarshalRowsUint64(t *testing.T) {
  315. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  316. var expect = []uint64{2, 3}
  317. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  318. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  319. var value []uint64
  320. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  321. return unmarshalRows(&value, rows, true)
  322. }, "select value from users where user=?", "anyone"))
  323. assert.EqualValues(t, expect, value)
  324. })
  325. }
  326. func TestUnmarshalRowsFloat32(t *testing.T) {
  327. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  328. var expect = []float32{2, 3}
  329. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  330. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  331. var value []float32
  332. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  333. return unmarshalRows(&value, rows, true)
  334. }, "select value from users where user=?", "anyone"))
  335. assert.EqualValues(t, expect, value)
  336. })
  337. }
  338. func TestUnmarshalRowsFloat64(t *testing.T) {
  339. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  340. var expect = []float64{2, 3}
  341. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  342. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  343. var value []float64
  344. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  345. return unmarshalRows(&value, rows, true)
  346. }, "select value from users where user=?", "anyone"))
  347. assert.EqualValues(t, expect, value)
  348. })
  349. }
  350. func TestUnmarshalRowsString(t *testing.T) {
  351. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  352. var expect = []string{"hello", "world"}
  353. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
  354. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  355. var value []string
  356. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  357. return unmarshalRows(&value, rows, true)
  358. }, "select value from users where user=?", "anyone"))
  359. assert.EqualValues(t, expect, value)
  360. })
  361. }
  362. func TestUnmarshalRowsBoolPtr(t *testing.T) {
  363. yes := true
  364. no := false
  365. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  366. var expect = []*bool{&yes, &no}
  367. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  368. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  369. var value []*bool
  370. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  371. return unmarshalRows(&value, rows, true)
  372. }, "select value from users where user=?", "anyone"))
  373. assert.EqualValues(t, expect, value)
  374. })
  375. }
  376. func TestUnmarshalRowsIntPtr(t *testing.T) {
  377. two := 2
  378. three := 3
  379. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  380. var expect = []*int{&two, &three}
  381. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  382. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  383. var value []*int
  384. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  385. return unmarshalRows(&value, rows, true)
  386. }, "select value from users where user=?", "anyone"))
  387. assert.EqualValues(t, expect, value)
  388. })
  389. }
  390. func TestUnmarshalRowsInt8Ptr(t *testing.T) {
  391. two := int8(2)
  392. three := int8(3)
  393. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  394. var expect = []*int8{&two, &three}
  395. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  396. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  397. var value []*int8
  398. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  399. return unmarshalRows(&value, rows, true)
  400. }, "select value from users where user=?", "anyone"))
  401. assert.EqualValues(t, expect, value)
  402. })
  403. }
  404. func TestUnmarshalRowsInt16Ptr(t *testing.T) {
  405. two := int16(2)
  406. three := int16(3)
  407. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  408. var expect = []*int16{&two, &three}
  409. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  410. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  411. var value []*int16
  412. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  413. return unmarshalRows(&value, rows, true)
  414. }, "select value from users where user=?", "anyone"))
  415. assert.EqualValues(t, expect, value)
  416. })
  417. }
  418. func TestUnmarshalRowsInt32Ptr(t *testing.T) {
  419. two := int32(2)
  420. three := int32(3)
  421. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  422. var expect = []*int32{&two, &three}
  423. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  424. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  425. var value []*int32
  426. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  427. return unmarshalRows(&value, rows, true)
  428. }, "select value from users where user=?", "anyone"))
  429. assert.EqualValues(t, expect, value)
  430. })
  431. }
  432. func TestUnmarshalRowsInt64Ptr(t *testing.T) {
  433. two := int64(2)
  434. three := int64(3)
  435. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  436. var expect = []*int64{&two, &three}
  437. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  438. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  439. var value []*int64
  440. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  441. return unmarshalRows(&value, rows, true)
  442. }, "select value from users where user=?", "anyone"))
  443. assert.EqualValues(t, expect, value)
  444. })
  445. }
  446. func TestUnmarshalRowsUintPtr(t *testing.T) {
  447. two := uint(2)
  448. three := uint(3)
  449. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  450. var expect = []*uint{&two, &three}
  451. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  452. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  453. var value []*uint
  454. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  455. return unmarshalRows(&value, rows, true)
  456. }, "select value from users where user=?", "anyone"))
  457. assert.EqualValues(t, expect, value)
  458. })
  459. }
  460. func TestUnmarshalRowsUint8Ptr(t *testing.T) {
  461. two := uint8(2)
  462. three := uint8(3)
  463. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  464. var expect = []*uint8{&two, &three}
  465. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  466. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  467. var value []*uint8
  468. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  469. return unmarshalRows(&value, rows, true)
  470. }, "select value from users where user=?", "anyone"))
  471. assert.EqualValues(t, expect, value)
  472. })
  473. }
  474. func TestUnmarshalRowsUint16Ptr(t *testing.T) {
  475. two := uint16(2)
  476. three := uint16(3)
  477. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  478. var expect = []*uint16{&two, &three}
  479. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  480. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  481. var value []*uint16
  482. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  483. return unmarshalRows(&value, rows, true)
  484. }, "select value from users where user=?", "anyone"))
  485. assert.EqualValues(t, expect, value)
  486. })
  487. }
  488. func TestUnmarshalRowsUint32Ptr(t *testing.T) {
  489. two := uint32(2)
  490. three := uint32(3)
  491. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  492. var expect = []*uint32{&two, &three}
  493. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  494. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  495. var value []*uint32
  496. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  497. return unmarshalRows(&value, rows, true)
  498. }, "select value from users where user=?", "anyone"))
  499. assert.EqualValues(t, expect, value)
  500. })
  501. }
  502. func TestUnmarshalRowsUint64Ptr(t *testing.T) {
  503. two := uint64(2)
  504. three := uint64(3)
  505. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  506. var expect = []*uint64{&two, &three}
  507. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  508. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  509. var value []*uint64
  510. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  511. return unmarshalRows(&value, rows, true)
  512. }, "select value from users where user=?", "anyone"))
  513. assert.EqualValues(t, expect, value)
  514. })
  515. }
  516. func TestUnmarshalRowsFloat32Ptr(t *testing.T) {
  517. two := float32(2)
  518. three := float32(3)
  519. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  520. var expect = []*float32{&two, &three}
  521. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  522. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  523. var value []*float32
  524. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  525. return unmarshalRows(&value, rows, true)
  526. }, "select value from users where user=?", "anyone"))
  527. assert.EqualValues(t, expect, value)
  528. })
  529. }
  530. func TestUnmarshalRowsFloat64Ptr(t *testing.T) {
  531. two := float64(2)
  532. three := float64(3)
  533. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  534. var expect = []*float64{&two, &three}
  535. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  536. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  537. var value []*float64
  538. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  539. return unmarshalRows(&value, rows, true)
  540. }, "select value from users where user=?", "anyone"))
  541. assert.EqualValues(t, expect, value)
  542. })
  543. }
  544. func TestUnmarshalRowsStringPtr(t *testing.T) {
  545. hello := "hello"
  546. world := "world"
  547. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  548. var expect = []*string{&hello, &world}
  549. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
  550. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  551. var value []*string
  552. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  553. return unmarshalRows(&value, rows, true)
  554. }, "select value from users where user=?", "anyone"))
  555. assert.EqualValues(t, expect, value)
  556. })
  557. }
  558. func TestUnmarshalRowsStruct(t *testing.T) {
  559. var expect = []struct {
  560. Name string
  561. Age int64
  562. }{
  563. {
  564. Name: "first",
  565. Age: 2,
  566. },
  567. {
  568. Name: "second",
  569. Age: 3,
  570. },
  571. }
  572. var value []struct {
  573. Name string
  574. Age int64
  575. }
  576. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  577. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  578. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  579. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  580. return unmarshalRows(&value, rows, true)
  581. }, "select name, age from users where user=?", "anyone"))
  582. for i, each := range expect {
  583. assert.Equal(t, each.Name, value[i].Name)
  584. assert.Equal(t, each.Age, value[i].Age)
  585. }
  586. })
  587. }
  588. func TestUnmarshalRowsStructWithNullStringType(t *testing.T) {
  589. var expect = []struct {
  590. Name string
  591. NullString sql.NullString
  592. }{
  593. {
  594. Name: "first",
  595. NullString: sql.NullString{
  596. String: "firstnullstring",
  597. Valid: true,
  598. },
  599. },
  600. {
  601. Name: "second",
  602. NullString: sql.NullString{
  603. String: "",
  604. Valid: false,
  605. },
  606. },
  607. }
  608. var value []struct {
  609. Name string `db:"name"`
  610. NullString sql.NullString `db:"value"`
  611. }
  612. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  613. rs := sqlmock.NewRows([]string{"name", "value"}).AddRow(
  614. "first", "firstnullstring").AddRow("second", nil)
  615. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  616. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  617. return unmarshalRows(&value, rows, true)
  618. }, "select name, age from users where user=?", "anyone"))
  619. for i, each := range expect {
  620. assert.Equal(t, each.Name, value[i].Name)
  621. assert.Equal(t, each.NullString.String, value[i].NullString.String)
  622. assert.Equal(t, each.NullString.Valid, value[i].NullString.Valid)
  623. }
  624. })
  625. }
  626. func TestUnmarshalRowsStructWithTags(t *testing.T) {
  627. var expect = []struct {
  628. Name string
  629. Age int64
  630. }{
  631. {
  632. Name: "first",
  633. Age: 2,
  634. },
  635. {
  636. Name: "second",
  637. Age: 3,
  638. },
  639. }
  640. var value []struct {
  641. Age int64 `db:"age"`
  642. Name string `db:"name"`
  643. }
  644. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  645. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  646. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  647. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  648. return unmarshalRows(&value, rows, true)
  649. }, "select name, age from users where user=?", "anyone"))
  650. for i, each := range expect {
  651. assert.Equal(t, each.Name, value[i].Name)
  652. assert.Equal(t, each.Age, value[i].Age)
  653. }
  654. })
  655. }
  656. func TestUnmarshalRowsStructAndEmbeddedAnonymousStructWithTags(t *testing.T) {
  657. type Embed struct {
  658. Value int64 `db:"value"`
  659. }
  660. var expect = []struct {
  661. Name string
  662. Age int64
  663. Value int64
  664. }{
  665. {
  666. Name: "first",
  667. Age: 2,
  668. Value: 3,
  669. },
  670. {
  671. Name: "second",
  672. Age: 3,
  673. Value: 4,
  674. },
  675. }
  676. var value []struct {
  677. Name string `db:"name"`
  678. Age int64 `db:"age"`
  679. Embed
  680. }
  681. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  682. rs := sqlmock.NewRows([]string{"name", "age", "value"}).FromCSVString("first,2,3\nsecond,3,4")
  683. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  684. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  685. return unmarshalRows(&value, rows, true)
  686. }, "select name, age, value from users where user=?", "anyone"))
  687. for i, each := range expect {
  688. assert.Equal(t, each.Name, value[i].Name)
  689. assert.Equal(t, each.Age, value[i].Age)
  690. assert.Equal(t, each.Value, value[i].Value)
  691. }
  692. })
  693. }
  694. func TestUnmarshalRowsStructAndEmbeddedStructPtrAnonymousWithTags(t *testing.T) {
  695. type Embed struct {
  696. Value int64 `db:"value"`
  697. }
  698. var expect = []struct {
  699. Name string
  700. Age int64
  701. Value int64
  702. }{
  703. {
  704. Name: "first",
  705. Age: 2,
  706. Value: 3,
  707. },
  708. {
  709. Name: "second",
  710. Age: 3,
  711. Value: 4,
  712. },
  713. }
  714. var value []struct {
  715. Name string `db:"name"`
  716. Age int64 `db:"age"`
  717. *Embed
  718. }
  719. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  720. rs := sqlmock.NewRows([]string{"name", "age", "value"}).FromCSVString("first,2,3\nsecond,3,4")
  721. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  722. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  723. return unmarshalRows(&value, rows, true)
  724. }, "select name, age, value from users where user=?", "anyone"))
  725. for i, each := range expect {
  726. assert.Equal(t, each.Name, value[i].Name)
  727. assert.Equal(t, each.Age, value[i].Age)
  728. assert.Equal(t, each.Value, value[i].Value)
  729. }
  730. })
  731. }
  732. func TestUnmarshalRowsStructPtr(t *testing.T) {
  733. var expect = []*struct {
  734. Name string
  735. Age int64
  736. }{
  737. {
  738. Name: "first",
  739. Age: 2,
  740. },
  741. {
  742. Name: "second",
  743. Age: 3,
  744. },
  745. }
  746. var value []*struct {
  747. Name string
  748. Age int64
  749. }
  750. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  751. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  752. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  753. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  754. return unmarshalRows(&value, rows, true)
  755. }, "select name, age from users where user=?", "anyone"))
  756. for i, each := range expect {
  757. assert.Equal(t, each.Name, value[i].Name)
  758. assert.Equal(t, each.Age, value[i].Age)
  759. }
  760. })
  761. }
  762. func TestUnmarshalRowsStructWithTagsPtr(t *testing.T) {
  763. var expect = []*struct {
  764. Name string
  765. Age int64
  766. }{
  767. {
  768. Name: "first",
  769. Age: 2,
  770. },
  771. {
  772. Name: "second",
  773. Age: 3,
  774. },
  775. }
  776. var value []*struct {
  777. Age int64 `db:"age"`
  778. Name string `db:"name"`
  779. }
  780. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  781. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  782. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  783. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  784. return unmarshalRows(&value, rows, true)
  785. }, "select name, age from users where user=?", "anyone"))
  786. for i, each := range expect {
  787. assert.Equal(t, each.Name, value[i].Name)
  788. assert.Equal(t, each.Age, value[i].Age)
  789. }
  790. })
  791. }
  792. func TestUnmarshalRowsStructWithTagsPtrWithInnerPtr(t *testing.T) {
  793. var expect = []*struct {
  794. Name string
  795. Age int64
  796. }{
  797. {
  798. Name: "first",
  799. Age: 2,
  800. },
  801. {
  802. Name: "second",
  803. Age: 3,
  804. },
  805. }
  806. var value []*struct {
  807. Age *int64 `db:"age"`
  808. Name string `db:"name"`
  809. }
  810. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  811. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  812. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  813. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  814. return unmarshalRows(&value, rows, true)
  815. }, "select name, age from users where user=?", "anyone"))
  816. for i, each := range expect {
  817. assert.Equal(t, each.Name, value[i].Name)
  818. assert.Equal(t, each.Age, *value[i].Age)
  819. }
  820. })
  821. }
  822. func TestCommonSqlConn_QueryRowOptional(t *testing.T) {
  823. runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  824. rs := sqlmock.NewRows([]string{"age"}).FromCSVString("5")
  825. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  826. var r struct {
  827. User string `db:"user"`
  828. Age int `db:"age"`
  829. }
  830. assert.Nil(t, query(db, func(rows *sql.Rows) error {
  831. return unmarshalRow(&r, rows, false)
  832. }, "select age from users where user=?", "anyone"))
  833. assert.Empty(t, r.User)
  834. assert.Equal(t, 5, r.Age)
  835. })
  836. }
  837. func runOrmTest(t *testing.T, fn func(db *sql.DB, mock sqlmock.Sqlmock)) {
  838. logx.Disable()
  839. db, mock, err := sqlmock.New()
  840. if err != nil {
  841. t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
  842. }
  843. defer db.Close()
  844. fn(db, mock)
  845. if err := mock.ExpectationsWereMet(); err != nil {
  846. t.Errorf("there were unfulfilled expectations: %s", err)
  847. }
  848. }