orm_test.go 32 KB

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