orm_test.go 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  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/stores/dbtest"
  10. )
  11. func TestUnmarshalRowBool(t *testing.T) {
  12. dbtest.RunTest(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. dbtest.RunTest(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 struct {
  25. Value bool `db:"value"`
  26. }
  27. assert.Error(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 TestUnmarshalRowBoolNotSettable(t *testing.T) {
  33. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  34. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1")
  35. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  36. var value bool
  37. assert.NotNil(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. })
  41. }
  42. func TestUnmarshalRowInt(t *testing.T) {
  43. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  44. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2")
  45. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  46. var value int
  47. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  48. return unmarshalRow(&value, rows, true)
  49. }, "select value from users where user=?", "anyone"))
  50. assert.EqualValues(t, 2, value)
  51. })
  52. }
  53. func TestUnmarshalRowInt8(t *testing.T) {
  54. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  55. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("3")
  56. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  57. var value int8
  58. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  59. return unmarshalRow(&value, rows, true)
  60. }, "select value from users where user=?", "anyone"))
  61. assert.EqualValues(t, int8(3), value)
  62. })
  63. }
  64. func TestUnmarshalRowInt16(t *testing.T) {
  65. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  66. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("4")
  67. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  68. var value int16
  69. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  70. return unmarshalRow(&value, rows, true)
  71. }, "select value from users where user=?", "anyone"))
  72. assert.Equal(t, int16(4), value)
  73. })
  74. }
  75. func TestUnmarshalRowInt32(t *testing.T) {
  76. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  77. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("5")
  78. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  79. var value int32
  80. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  81. return unmarshalRow(&value, rows, true)
  82. }, "select value from users where user=?", "anyone"))
  83. assert.Equal(t, int32(5), value)
  84. })
  85. }
  86. func TestUnmarshalRowInt64(t *testing.T) {
  87. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  88. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("6")
  89. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  90. var value int64
  91. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  92. return unmarshalRow(&value, rows, true)
  93. }, "select value from users where user=?", "anyone"))
  94. assert.EqualValues(t, int64(6), value)
  95. })
  96. }
  97. func TestUnmarshalRowUint(t *testing.T) {
  98. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  99. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2")
  100. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  101. var value uint
  102. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  103. return unmarshalRow(&value, rows, true)
  104. }, "select value from users where user=?", "anyone"))
  105. assert.EqualValues(t, uint(2), value)
  106. })
  107. }
  108. func TestUnmarshalRowUint8(t *testing.T) {
  109. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  110. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("3")
  111. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  112. var value uint8
  113. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  114. return unmarshalRow(&value, rows, true)
  115. }, "select value from users where user=?", "anyone"))
  116. assert.EqualValues(t, uint8(3), value)
  117. })
  118. }
  119. func TestUnmarshalRowUint16(t *testing.T) {
  120. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  121. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("4")
  122. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  123. var value uint16
  124. assert.Nil(t, query(context.Background(), 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(4), value)
  128. })
  129. }
  130. func TestUnmarshalRowUint32(t *testing.T) {
  131. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  132. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("5")
  133. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  134. var value uint32
  135. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  136. return unmarshalRow(&value, rows, true)
  137. }, "select value from users where user=?", "anyone"))
  138. assert.EqualValues(t, uint32(5), value)
  139. })
  140. }
  141. func TestUnmarshalRowUint64(t *testing.T) {
  142. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  143. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("6")
  144. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  145. var value uint64
  146. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  147. return unmarshalRow(&value, rows, true)
  148. }, "select value from users where user=?", "anyone"))
  149. assert.EqualValues(t, uint16(6), value)
  150. })
  151. }
  152. func TestUnmarshalRowFloat32(t *testing.T) {
  153. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  154. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("7")
  155. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  156. var value float32
  157. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  158. return unmarshalRow(&value, rows, true)
  159. }, "select value from users where user=?", "anyone"))
  160. assert.EqualValues(t, float32(7), value)
  161. })
  162. }
  163. func TestUnmarshalRowFloat64(t *testing.T) {
  164. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  165. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("8")
  166. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  167. var value float64
  168. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  169. return unmarshalRow(&value, rows, true)
  170. }, "select value from users where user=?", "anyone"))
  171. assert.EqualValues(t, float64(8), value)
  172. })
  173. }
  174. func TestUnmarshalRowString(t *testing.T) {
  175. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  176. const expect = "hello"
  177. rs := sqlmock.NewRows([]string{"value"}).FromCSVString(expect)
  178. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  179. var value string
  180. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  181. return unmarshalRow(&value, rows, true)
  182. }, "select value from users where user=?", "anyone"))
  183. assert.EqualValues(t, expect, value)
  184. })
  185. }
  186. func TestUnmarshalRowStruct(t *testing.T) {
  187. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  188. value := new(struct {
  189. Name string
  190. Age int
  191. })
  192. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  193. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  194. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  195. return unmarshalRow(value, rows, true)
  196. }, "select name, age from users where user=?", "anyone"))
  197. assert.Equal(t, "liao", value.Name)
  198. assert.Equal(t, 5, value.Age)
  199. })
  200. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  201. value := new(struct {
  202. Name string
  203. Age int
  204. })
  205. errAny := errors.New("any error")
  206. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  207. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  208. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  209. return unmarshalRow(value, &mockedScanner{
  210. colErr: errAny,
  211. next: 1,
  212. }, true)
  213. }, "select name, age from users where user=?", "anyone"), errAny)
  214. })
  215. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  216. value := new(struct {
  217. Name string
  218. age *int
  219. })
  220. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  221. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  222. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  223. return unmarshalRow(value, rows, true)
  224. }, "select name, age from users where user=?", "anyone"), ErrNotMatchDestination)
  225. })
  226. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  227. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("8")
  228. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  229. type myString chan int
  230. var value myString
  231. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  232. return unmarshalRow(&value, rows, true)
  233. }, "select value from users where user=?", "anyone"), ErrUnsupportedValueType)
  234. })
  235. }
  236. func TestUnmarshalRowStructWithTags(t *testing.T) {
  237. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  238. value := new(struct {
  239. Age int `db:"age"`
  240. Name string `db:"name"`
  241. })
  242. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  243. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  244. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  245. return unmarshalRow(value, rows, true)
  246. }, "select name, age from users where user=?", "anyone"))
  247. assert.Equal(t, "liao", value.Name)
  248. assert.Equal(t, 5, value.Age)
  249. })
  250. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  251. value := new(struct {
  252. age *int `db:"age"`
  253. Name string `db:"name"`
  254. })
  255. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  256. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  257. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  258. return unmarshalRow(value, rows, true)
  259. }, "select name, age from users where user=?", "anyone"), ErrNotReadableValue)
  260. })
  261. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  262. var value struct {
  263. Age *int `db:"age"`
  264. Name *string `db:"name"`
  265. }
  266. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  267. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  268. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  269. return unmarshalRow(&value, rows, true)
  270. }, "select name, age from users where user=?", "anyone"))
  271. assert.Equal(t, "liao", *value.Name)
  272. assert.Equal(t, 5, *value.Age)
  273. })
  274. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  275. value := new(struct {
  276. Age int `db:"age"`
  277. Name string
  278. })
  279. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("liao,5")
  280. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  281. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  282. return unmarshalRow(value, rows, true)
  283. }, "select name, age from users where user=?", "anyone"))
  284. assert.Equal(t, 5, value.Age)
  285. })
  286. }
  287. func TestUnmarshalRowStructWithTagsWrongColumns(t *testing.T) {
  288. value := new(struct {
  289. Age *int `db:"age"`
  290. Name string `db:"name"`
  291. })
  292. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  293. rs := sqlmock.NewRows([]string{"name"}).FromCSVString("liao")
  294. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  295. assert.NotNil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  296. return unmarshalRow(value, rows, true)
  297. }, "select name, age from users where user=?", "anyone"))
  298. })
  299. }
  300. func TestUnmarshalRowsBool(t *testing.T) {
  301. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  302. expect := []bool{true, false}
  303. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  304. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  305. var value []bool
  306. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  307. return unmarshalRows(&value, rows, true)
  308. }, "select value from users where user=?", "anyone"))
  309. assert.EqualValues(t, expect, value)
  310. })
  311. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  312. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  313. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  314. var value []bool
  315. assert.Error(t, query(context.Background(), db, func(rows *sql.Rows) error {
  316. return unmarshalRows(value, rows, true)
  317. }, "select value from users where user=?", "anyone"))
  318. })
  319. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  320. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  321. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  322. var value struct {
  323. value []bool `db:"value"`
  324. }
  325. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  326. return unmarshalRows(&value, rows, true)
  327. }, "select value from users where user=?", "anyone"), ErrUnsupportedValueType)
  328. })
  329. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  330. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  331. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  332. var value []bool
  333. errAny := errors.New("any")
  334. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  335. return unmarshalRows(&value, &mockedScanner{
  336. scanErr: errAny,
  337. next: 1,
  338. }, true)
  339. }, "select value from users where user=?", "anyone"), errAny)
  340. })
  341. }
  342. func TestUnmarshalRowsInt(t *testing.T) {
  343. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  344. expect := []int{2, 3}
  345. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  346. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  347. var value []int
  348. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  349. return unmarshalRows(&value, rows, true)
  350. }, "select value from users where user=?", "anyone"))
  351. assert.EqualValues(t, expect, value)
  352. })
  353. }
  354. func TestUnmarshalRowsInt8(t *testing.T) {
  355. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  356. expect := []int8{2, 3}
  357. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  358. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  359. var value []int8
  360. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  361. return unmarshalRows(&value, rows, true)
  362. }, "select value from users where user=?", "anyone"))
  363. assert.EqualValues(t, expect, value)
  364. })
  365. }
  366. func TestUnmarshalRowsInt16(t *testing.T) {
  367. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  368. expect := []int16{2, 3}
  369. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  370. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  371. var value []int16
  372. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  373. return unmarshalRows(&value, rows, true)
  374. }, "select value from users where user=?", "anyone"))
  375. assert.EqualValues(t, expect, value)
  376. })
  377. }
  378. func TestUnmarshalRowsInt32(t *testing.T) {
  379. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  380. expect := []int32{2, 3}
  381. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  382. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  383. var value []int32
  384. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsInt64(t *testing.T) {
  391. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  392. expect := []int64{2, 3}
  393. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  394. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  395. var value []int64
  396. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  397. return unmarshalRows(&value, rows, true)
  398. }, "select value from users where user=?", "anyone"))
  399. assert.EqualValues(t, expect, value)
  400. })
  401. }
  402. func TestUnmarshalRowsUint(t *testing.T) {
  403. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  404. expect := []uint{2, 3}
  405. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  406. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  407. var value []uint
  408. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsUint8(t *testing.T) {
  415. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  416. expect := []uint8{2, 3}
  417. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  418. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  419. var value []uint8
  420. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  421. return unmarshalRows(&value, rows, true)
  422. }, "select value from users where user=?", "anyone"))
  423. assert.EqualValues(t, expect, value)
  424. })
  425. }
  426. func TestUnmarshalRowsUint16(t *testing.T) {
  427. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  428. expect := []uint16{2, 3}
  429. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  430. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  431. var value []uint16
  432. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  433. return unmarshalRows(&value, rows, true)
  434. }, "select value from users where user=?", "anyone"))
  435. assert.EqualValues(t, expect, value)
  436. })
  437. }
  438. func TestUnmarshalRowsUint32(t *testing.T) {
  439. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  440. expect := []uint32{2, 3}
  441. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  442. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  443. var value []uint32
  444. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  445. return unmarshalRows(&value, rows, true)
  446. }, "select value from users where user=?", "anyone"))
  447. assert.EqualValues(t, expect, value)
  448. })
  449. }
  450. func TestUnmarshalRowsUint64(t *testing.T) {
  451. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  452. expect := []uint64{2, 3}
  453. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  454. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  455. var value []uint64
  456. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  457. return unmarshalRows(&value, rows, true)
  458. }, "select value from users where user=?", "anyone"))
  459. assert.EqualValues(t, expect, value)
  460. })
  461. }
  462. func TestUnmarshalRowsFloat32(t *testing.T) {
  463. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  464. expect := []float32{2, 3}
  465. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  466. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  467. var value []float32
  468. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsFloat64(t *testing.T) {
  475. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  476. expect := []float64{2, 3}
  477. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  478. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  479. var value []float64
  480. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  481. return unmarshalRows(&value, rows, true)
  482. }, "select value from users where user=?", "anyone"))
  483. assert.EqualValues(t, expect, value)
  484. })
  485. }
  486. func TestUnmarshalRowsString(t *testing.T) {
  487. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  488. expect := []string{"hello", "world"}
  489. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
  490. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  491. var value []string
  492. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsBoolPtr(t *testing.T) {
  499. yes := true
  500. no := false
  501. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  502. expect := []*bool{&yes, &no}
  503. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
  504. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  505. var value []*bool
  506. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsIntPtr(t *testing.T) {
  513. two := 2
  514. three := 3
  515. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  516. expect := []*int{&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 []*int
  520. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsInt8Ptr(t *testing.T) {
  527. two := int8(2)
  528. three := int8(3)
  529. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  530. expect := []*int8{&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 []*int8
  534. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsInt16Ptr(t *testing.T) {
  541. two := int16(2)
  542. three := int16(3)
  543. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  544. expect := []*int16{&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 []*int16
  548. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsInt32Ptr(t *testing.T) {
  555. two := int32(2)
  556. three := int32(3)
  557. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  558. expect := []*int32{&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 []*int32
  562. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsInt64Ptr(t *testing.T) {
  569. two := int64(2)
  570. three := int64(3)
  571. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  572. expect := []*int64{&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 []*int64
  576. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsUintPtr(t *testing.T) {
  583. two := uint(2)
  584. three := uint(3)
  585. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  586. expect := []*uint{&two, &three}
  587. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  588. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  589. var value []*uint
  590. assert.Nil(t, query(context.Background(), 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 TestUnmarshalRowsUint8Ptr(t *testing.T) {
  597. two := uint8(2)
  598. three := uint8(3)
  599. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  600. expect := []*uint8{&two, &three}
  601. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  602. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  603. var value []*uint8
  604. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  605. return unmarshalRows(&value, rows, true)
  606. }, "select value from users where user=?", "anyone"))
  607. assert.EqualValues(t, expect, value)
  608. })
  609. }
  610. func TestUnmarshalRowsUint16Ptr(t *testing.T) {
  611. two := uint16(2)
  612. three := uint16(3)
  613. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  614. expect := []*uint16{&two, &three}
  615. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  616. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  617. var value []*uint16
  618. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  619. return unmarshalRows(&value, rows, true)
  620. }, "select value from users where user=?", "anyone"))
  621. assert.EqualValues(t, expect, value)
  622. })
  623. }
  624. func TestUnmarshalRowsUint32Ptr(t *testing.T) {
  625. two := uint32(2)
  626. three := uint32(3)
  627. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  628. expect := []*uint32{&two, &three}
  629. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  630. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  631. var value []*uint32
  632. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  633. return unmarshalRows(&value, rows, true)
  634. }, "select value from users where user=?", "anyone"))
  635. assert.EqualValues(t, expect, value)
  636. })
  637. }
  638. func TestUnmarshalRowsUint64Ptr(t *testing.T) {
  639. two := uint64(2)
  640. three := uint64(3)
  641. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  642. expect := []*uint64{&two, &three}
  643. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  644. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  645. var value []*uint64
  646. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  647. return unmarshalRows(&value, rows, true)
  648. }, "select value from users where user=?", "anyone"))
  649. assert.EqualValues(t, expect, value)
  650. })
  651. }
  652. func TestUnmarshalRowsFloat32Ptr(t *testing.T) {
  653. two := float32(2)
  654. three := float32(3)
  655. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  656. expect := []*float32{&two, &three}
  657. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  658. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  659. var value []*float32
  660. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  661. return unmarshalRows(&value, rows, true)
  662. }, "select value from users where user=?", "anyone"))
  663. assert.EqualValues(t, expect, value)
  664. })
  665. }
  666. func TestUnmarshalRowsFloat64Ptr(t *testing.T) {
  667. two := float64(2)
  668. three := float64(3)
  669. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  670. expect := []*float64{&two, &three}
  671. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
  672. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  673. var value []*float64
  674. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  675. return unmarshalRows(&value, rows, true)
  676. }, "select value from users where user=?", "anyone"))
  677. assert.EqualValues(t, expect, value)
  678. })
  679. }
  680. func TestUnmarshalRowsStringPtr(t *testing.T) {
  681. hello := "hello"
  682. world := "world"
  683. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  684. expect := []*string{&hello, &world}
  685. rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
  686. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  687. var value []*string
  688. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  689. return unmarshalRows(&value, rows, true)
  690. }, "select value from users where user=?", "anyone"))
  691. assert.EqualValues(t, expect, value)
  692. })
  693. }
  694. func TestUnmarshalRowsStruct(t *testing.T) {
  695. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  696. expect := []struct {
  697. Name string
  698. Age int64
  699. }{
  700. {
  701. Name: "first",
  702. Age: 2,
  703. },
  704. {
  705. Name: "second",
  706. Age: 3,
  707. },
  708. }
  709. var value []struct {
  710. Name string
  711. Age int64
  712. }
  713. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  714. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  715. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  716. return unmarshalRows(&value, rows, true)
  717. }, "select name, age from users where user=?", "anyone"))
  718. for i, each := range expect {
  719. assert.Equal(t, each.Name, value[i].Name)
  720. assert.Equal(t, each.Age, value[i].Age)
  721. }
  722. })
  723. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  724. var value []struct {
  725. Name string
  726. Age int64
  727. }
  728. errAny := errors.New("any error")
  729. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  730. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  731. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  732. return unmarshalRows(&value, &mockedScanner{
  733. colErr: errAny,
  734. next: 1,
  735. }, true)
  736. }, "select name, age from users where user=?", "anyone"), errAny)
  737. })
  738. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  739. var value []struct {
  740. Name string
  741. Age int64
  742. }
  743. errAny := errors.New("any error")
  744. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  745. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  746. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  747. return unmarshalRows(&value, &mockedScanner{
  748. cols: []string{"name", "age"},
  749. scanErr: errAny,
  750. next: 1,
  751. }, true)
  752. }, "select name, age from users where user=?", "anyone"), errAny)
  753. })
  754. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  755. var value []chan int
  756. errAny := errors.New("any error")
  757. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  758. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  759. assert.ErrorIs(t, query(context.Background(), db, func(rows *sql.Rows) error {
  760. return unmarshalRows(&value, &mockedScanner{
  761. cols: []string{"name", "age"},
  762. scanErr: errAny,
  763. next: 1,
  764. }, true)
  765. }, "select name, age from users where user=?", "anyone"), ErrUnsupportedValueType)
  766. })
  767. }
  768. func TestUnmarshalRowsStructWithNullStringType(t *testing.T) {
  769. expect := []struct {
  770. Name string
  771. NullString sql.NullString
  772. }{
  773. {
  774. Name: "first",
  775. NullString: sql.NullString{
  776. String: "firstnullstring",
  777. Valid: true,
  778. },
  779. },
  780. {
  781. Name: "second",
  782. NullString: sql.NullString{
  783. String: "",
  784. Valid: false,
  785. },
  786. },
  787. }
  788. var value []struct {
  789. Name string `db:"name"`
  790. NullString sql.NullString `db:"value"`
  791. }
  792. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  793. rs := sqlmock.NewRows([]string{"name", "value"}).AddRow(
  794. "first", "firstnullstring").AddRow("second", nil)
  795. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  796. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  797. return unmarshalRows(&value, rows, true)
  798. }, "select name, age from users where user=?", "anyone"))
  799. for i, each := range expect {
  800. assert.Equal(t, each.Name, value[i].Name)
  801. assert.Equal(t, each.NullString.String, value[i].NullString.String)
  802. assert.Equal(t, each.NullString.Valid, value[i].NullString.Valid)
  803. }
  804. })
  805. }
  806. func TestUnmarshalRowsStructWithTags(t *testing.T) {
  807. expect := []struct {
  808. Name string
  809. Age int64
  810. }{
  811. {
  812. Name: "first",
  813. Age: 2,
  814. },
  815. {
  816. Name: "second",
  817. Age: 3,
  818. },
  819. }
  820. var value []struct {
  821. Age int64 `db:"age"`
  822. Name string `db:"name"`
  823. }
  824. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  825. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  826. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  827. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  828. return unmarshalRows(&value, rows, true)
  829. }, "select name, age from users where user=?", "anyone"))
  830. for i, each := range expect {
  831. assert.Equal(t, each.Name, value[i].Name)
  832. assert.Equal(t, each.Age, value[i].Age)
  833. }
  834. })
  835. }
  836. func TestUnmarshalRowsStructAndEmbeddedAnonymousStructWithTags(t *testing.T) {
  837. type Embed struct {
  838. Value int64 `db:"value"`
  839. }
  840. expect := []struct {
  841. Name string
  842. Age int64
  843. Value int64
  844. }{
  845. {
  846. Name: "first",
  847. Age: 2,
  848. Value: 3,
  849. },
  850. {
  851. Name: "second",
  852. Age: 3,
  853. Value: 4,
  854. },
  855. }
  856. var value []struct {
  857. Name string `db:"name"`
  858. Age int64 `db:"age"`
  859. Embed
  860. }
  861. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  862. rs := sqlmock.NewRows([]string{"name", "age", "value"}).FromCSVString("first,2,3\nsecond,3,4")
  863. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  864. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  865. return unmarshalRows(&value, rows, true)
  866. }, "select name, age, value from users where user=?", "anyone"))
  867. for i, each := range expect {
  868. assert.Equal(t, each.Name, value[i].Name)
  869. assert.Equal(t, each.Age, value[i].Age)
  870. assert.Equal(t, each.Value, value[i].Value)
  871. }
  872. })
  873. }
  874. func TestUnmarshalRowsStructAndEmbeddedStructPtrAnonymousWithTags(t *testing.T) {
  875. type Embed struct {
  876. Value int64 `db:"value"`
  877. }
  878. expect := []struct {
  879. Name string
  880. Age int64
  881. Value int64
  882. }{
  883. {
  884. Name: "first",
  885. Age: 2,
  886. Value: 3,
  887. },
  888. {
  889. Name: "second",
  890. Age: 3,
  891. Value: 4,
  892. },
  893. }
  894. var value []struct {
  895. Name string `db:"name"`
  896. Age int64 `db:"age"`
  897. *Embed
  898. }
  899. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  900. rs := sqlmock.NewRows([]string{"name", "age", "value"}).FromCSVString("first,2,3\nsecond,3,4")
  901. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  902. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  903. return unmarshalRows(&value, rows, true)
  904. }, "select name, age, value from users where user=?", "anyone"))
  905. for i, each := range expect {
  906. assert.Equal(t, each.Name, value[i].Name)
  907. assert.Equal(t, each.Age, value[i].Age)
  908. assert.Equal(t, each.Value, value[i].Value)
  909. }
  910. })
  911. }
  912. func TestUnmarshalRowsStructPtr(t *testing.T) {
  913. expect := []*struct {
  914. Name string
  915. Age int64
  916. }{
  917. {
  918. Name: "first",
  919. Age: 2,
  920. },
  921. {
  922. Name: "second",
  923. Age: 3,
  924. },
  925. }
  926. var value []*struct {
  927. Name string
  928. Age int64
  929. }
  930. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  931. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  932. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  933. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  934. return unmarshalRows(&value, rows, true)
  935. }, "select name, age from users where user=?", "anyone"))
  936. for i, each := range expect {
  937. assert.Equal(t, each.Name, value[i].Name)
  938. assert.Equal(t, each.Age, value[i].Age)
  939. }
  940. })
  941. }
  942. func TestUnmarshalRowsStructWithTagsPtr(t *testing.T) {
  943. expect := []*struct {
  944. Name string
  945. Age int64
  946. }{
  947. {
  948. Name: "first",
  949. Age: 2,
  950. },
  951. {
  952. Name: "second",
  953. Age: 3,
  954. },
  955. }
  956. var value []*struct {
  957. Age int64 `db:"age"`
  958. Name string `db:"name"`
  959. }
  960. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  961. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  962. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  963. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  964. return unmarshalRows(&value, rows, true)
  965. }, "select name, age from users where user=?", "anyone"))
  966. for i, each := range expect {
  967. assert.Equal(t, each.Name, value[i].Name)
  968. assert.Equal(t, each.Age, value[i].Age)
  969. }
  970. })
  971. }
  972. func TestUnmarshalRowsStructWithTagsPtrWithInnerPtr(t *testing.T) {
  973. expect := []*struct {
  974. Name string
  975. Age int64
  976. }{
  977. {
  978. Name: "first",
  979. Age: 2,
  980. },
  981. {
  982. Name: "second",
  983. Age: 3,
  984. },
  985. }
  986. var value []*struct {
  987. Age *int64 `db:"age"`
  988. Name string `db:"name"`
  989. }
  990. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  991. rs := sqlmock.NewRows([]string{"name", "age"}).FromCSVString("first,2\nsecond,3")
  992. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  993. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  994. return unmarshalRows(&value, rows, true)
  995. }, "select name, age from users where user=?", "anyone"))
  996. for i, each := range expect {
  997. assert.Equal(t, each.Name, value[i].Name)
  998. assert.Equal(t, each.Age, *value[i].Age)
  999. }
  1000. })
  1001. }
  1002. func TestCommonSqlConn_QueryRowOptional(t *testing.T) {
  1003. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  1004. rs := sqlmock.NewRows([]string{"age"}).FromCSVString("5")
  1005. mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
  1006. var r struct {
  1007. User string `db:"user"`
  1008. Age int `db:"age"`
  1009. }
  1010. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  1011. return unmarshalRow(&r, rows, false)
  1012. }, "select age from users where user=?", "anyone"))
  1013. assert.Empty(t, r.User)
  1014. assert.Equal(t, 5, r.Age)
  1015. })
  1016. }
  1017. func TestUnmarshalRowError(t *testing.T) {
  1018. tests := []struct {
  1019. name string
  1020. colErr error
  1021. scanErr error
  1022. err error
  1023. next int
  1024. validate func(err error)
  1025. }{
  1026. {
  1027. name: "with error",
  1028. err: errors.New("foo"),
  1029. validate: func(err error) {
  1030. assert.NotNil(t, err)
  1031. },
  1032. },
  1033. {
  1034. name: "without next",
  1035. validate: func(err error) {
  1036. assert.Equal(t, ErrNotFound, err)
  1037. },
  1038. },
  1039. {
  1040. name: "with error",
  1041. scanErr: errors.New("foo"),
  1042. next: 1,
  1043. validate: func(err error) {
  1044. assert.Equal(t, ErrNotFound, err)
  1045. },
  1046. },
  1047. }
  1048. for _, test := range tests {
  1049. t.Run(test.name, func(t *testing.T) {
  1050. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  1051. rs := sqlmock.NewRows([]string{"age"}).FromCSVString("5")
  1052. mock.ExpectQuery("select (.+) from users where user=?").WithArgs(
  1053. "anyone").WillReturnRows(rs)
  1054. var r struct {
  1055. User string `db:"user"`
  1056. Age int `db:"age"`
  1057. }
  1058. test.validate(query(context.Background(), db, func(rows *sql.Rows) error {
  1059. scanner := mockedScanner{
  1060. colErr: test.colErr,
  1061. scanErr: test.scanErr,
  1062. err: test.err,
  1063. }
  1064. return unmarshalRow(&r, &scanner, false)
  1065. }, "select age from users where user=?", "anyone"))
  1066. })
  1067. })
  1068. }
  1069. }
  1070. func TestAnonymousStructPr(t *testing.T) {
  1071. type Score struct {
  1072. Discipline string `db:"discipline"`
  1073. Score uint `db:"score"`
  1074. }
  1075. type ClassType struct {
  1076. Grade sql.NullString `db:"grade"`
  1077. ClassName *string `db:"class_name"`
  1078. }
  1079. type Class struct {
  1080. *ClassType
  1081. Score
  1082. }
  1083. expect := []*struct {
  1084. Name string
  1085. Age int64
  1086. Grade sql.NullString
  1087. Discipline string
  1088. Score uint
  1089. ClassName string
  1090. }{
  1091. {
  1092. Name: "first",
  1093. Age: 2,
  1094. Grade: sql.NullString{
  1095. String: "",
  1096. Valid: false,
  1097. },
  1098. ClassName: "experimental class",
  1099. Discipline: "math",
  1100. Score: 100,
  1101. },
  1102. {
  1103. Name: "second",
  1104. Age: 3,
  1105. Grade: sql.NullString{
  1106. String: "grade one",
  1107. Valid: true,
  1108. },
  1109. ClassName: "class three grade two",
  1110. Discipline: "chinese",
  1111. Score: 99,
  1112. },
  1113. }
  1114. var value []*struct {
  1115. Age int64 `db:"age"`
  1116. Class
  1117. Name string `db:"name"`
  1118. }
  1119. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  1120. rs := sqlmock.NewRows([]string{
  1121. "name",
  1122. "age",
  1123. "grade",
  1124. "discipline",
  1125. "class_name",
  1126. "score",
  1127. }).
  1128. AddRow("first", 2, nil, "math", "experimental class", 100).
  1129. AddRow("second", 3, "grade one", "chinese", "class three grade two", 99)
  1130. mock.ExpectQuery("select (.+) from users where user=?").
  1131. WithArgs("anyone").WillReturnRows(rs)
  1132. assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
  1133. return unmarshalRows(&value, rows, true)
  1134. }, "select name, age,grade,discipline,class_name,score from users where user=?",
  1135. "anyone"))
  1136. for i, each := range expect {
  1137. assert.Equal(t, each.Name, value[i].Name)
  1138. assert.Equal(t, each.Age, value[i].Age)
  1139. assert.Equal(t, each.ClassName, *value[i].Class.ClassName)
  1140. assert.Equal(t, each.Discipline, value[i].Score.Discipline)
  1141. assert.Equal(t, each.Score, value[i].Score.Score)
  1142. assert.Equal(t, each.Grade, value[i].Class.Grade)
  1143. }
  1144. })
  1145. }
  1146. func TestAnonymousStructPrError(t *testing.T) {
  1147. type Score struct {
  1148. Discipline string `db:"discipline"`
  1149. score uint `db:"score"`
  1150. }
  1151. type ClassType struct {
  1152. Grade sql.NullString `db:"grade"`
  1153. ClassName *string `db:"class_name"`
  1154. }
  1155. type Class struct {
  1156. *ClassType
  1157. Score
  1158. }
  1159. var value []*struct {
  1160. Age int64 `db:"age"`
  1161. Class
  1162. Name string `db:"name"`
  1163. }
  1164. dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
  1165. rs := sqlmock.NewRows([]string{
  1166. "name",
  1167. "age",
  1168. "grade",
  1169. "discipline",
  1170. "class_name",
  1171. "score",
  1172. }).
  1173. AddRow("first", 2, nil, "math", "experimental class", 100).
  1174. AddRow("second", 3, "grade one", "chinese", "class three grade two", 99)
  1175. mock.ExpectQuery("select (.+) from users where user=?").
  1176. WithArgs("anyone").WillReturnRows(rs)
  1177. assert.Error(t, query(context.Background(), db, func(rows *sql.Rows) error {
  1178. return unmarshalRows(&value, rows, true)
  1179. }, "select name, age, grade, discipline, class_name, score from users where user=?",
  1180. "anyone"))
  1181. if len(value) > 0 {
  1182. assert.Equal(t, value[0].score, 0)
  1183. }
  1184. })
  1185. }
  1186. type mockedScanner struct {
  1187. cols []string
  1188. colErr error
  1189. scanErr error
  1190. err error
  1191. next int
  1192. }
  1193. func (m *mockedScanner) Columns() ([]string, error) {
  1194. return m.cols, m.colErr
  1195. }
  1196. func (m *mockedScanner) Err() error {
  1197. return m.err
  1198. }
  1199. func (m *mockedScanner) Next() bool {
  1200. if m.next > 0 {
  1201. m.next--
  1202. return true
  1203. }
  1204. return false
  1205. }
  1206. func (m *mockedScanner) Scan(v ...any) error {
  1207. return m.scanErr
  1208. }