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