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  }