orm_test.go 34 KB

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