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