github.com/duskeagle/pop@v4.10.1-0.20190417200916-92f2b794aab5+incompatible/finders_test.go (about)

     1  package pop
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/gobuffalo/nulls"
     8  	"github.com/gofrs/uuid"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func Test_Find(t *testing.T) {
    13  	transaction(func(tx *Connection) {
    14  		r := require.New(t)
    15  
    16  		user := User{Name: nulls.NewString("Mark")}
    17  		err := tx.Create(&user)
    18  		r.NoError(err)
    19  
    20  		u := User{}
    21  		err = tx.Find(&u, user.ID)
    22  		r.NoError(err)
    23  
    24  		r.NotEqual(u.ID, 0)
    25  		r.Equal(u.Name.String, "Mark")
    26  	})
    27  }
    28  
    29  func Test_Find_UTF8(t *testing.T) {
    30  	transaction(func(tx *Connection) {
    31  		r := require.New(t)
    32  
    33  		user := User{Name: nulls.NewString("💩")}
    34  		err := tx.Create(&user)
    35  		r.NoError(err)
    36  
    37  		u := User{}
    38  		err = tx.Find(&u, user.ID)
    39  		r.NoError(err)
    40  
    41  		r.NotEqual(u.ID, 0)
    42  		r.Equal(u.Name.String, "💩")
    43  	})
    44  }
    45  
    46  func Test_Find_LeadingZeros(t *testing.T) {
    47  	transaction(func(tx *Connection) {
    48  		r := require.New(t)
    49  
    50  		labels := []string{
    51  			"0",
    52  			"01",
    53  			"001",
    54  			"123",
    55  		}
    56  
    57  		for _, v := range labels {
    58  			label := Label{ID: v}
    59  			err := tx.Create(&label)
    60  			r.NoError(err)
    61  
    62  			l := Label{}
    63  			err = tx.Find(&l, v)
    64  			r.NoError(err)
    65  
    66  			r.Equal(l.ID, v)
    67  		}
    68  	})
    69  }
    70  
    71  func Test_Select(t *testing.T) {
    72  	transaction(func(tx *Connection) {
    73  		r := require.New(t)
    74  
    75  		user := User{Name: nulls.NewString("Mark"), Email: "mark@gobuffalo.io"}
    76  		err := tx.Create(&user)
    77  		r.NoError(err)
    78  
    79  		q := tx.Select("name", "email", "\n", "\t\n", "")
    80  
    81  		sm := &Model{Value: &User{}}
    82  		sql, _ := q.ToSQL(sm)
    83  		r.Equal(tx.Dialect.TranslateSQL("SELECT email, name FROM users AS users"), sql)
    84  
    85  		u := User{}
    86  		err = q.Find(&u, user.ID)
    87  		r.NoError(err)
    88  
    89  		r.Equal(u.Email, "mark@gobuffalo.io")
    90  		r.Equal(u.Name.String, "Mark")
    91  		r.Zero(u.ID)
    92  	})
    93  }
    94  
    95  func Test_Find_Eager_Has_Many(t *testing.T) {
    96  	transaction(func(tx *Connection) {
    97  		r := require.New(t)
    98  
    99  		user := User{Name: nulls.NewString("Mark")}
   100  		err := tx.Create(&user)
   101  		r.NoError(err)
   102  
   103  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   104  		err = tx.Create(&book)
   105  		r.NoError(err)
   106  
   107  		u := User{}
   108  		err = tx.Eager("Books").Find(&u, user.ID)
   109  		r.NoError(err)
   110  
   111  		r.NotEqual(u.ID, 0)
   112  		r.Equal(u.Name.String, "Mark")
   113  		books := u.Books
   114  		r.NotEqual(len(books), 0)
   115  		r.Equal(books[0].Title, book.Title)
   116  	})
   117  }
   118  
   119  func Test_Find_Eager_Has_Many_Order_By(t *testing.T) {
   120  	transaction(func(tx *Connection) {
   121  		r := require.New(t)
   122  
   123  		user := User{Name: nulls.NewString("Mark")}
   124  		err := tx.Create(&user)
   125  		r.NoError(err)
   126  
   127  		book1 := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   128  		err = tx.Create(&book1)
   129  		r.NoError(err)
   130  
   131  		book2 := Book{Title: "New Pop Book", Isbn: "PB2", UserID: nulls.NewInt(user.ID)}
   132  		err = tx.Create(&book2)
   133  		r.NoError(err)
   134  
   135  		u := User{}
   136  		err = tx.Eager().Find(&u, user.ID)
   137  		r.NoError(err)
   138  
   139  		r.Equal(len(u.Books), 2)
   140  		r.Equal(book2.Title, u.Books[0].Title)
   141  	})
   142  }
   143  
   144  func Test_Find_Eager_Belongs_To(t *testing.T) {
   145  	transaction(func(tx *Connection) {
   146  		r := require.New(t)
   147  
   148  		user := User{Name: nulls.NewString("Mark"), UserName: "mark"}
   149  		err := tx.Create(&user)
   150  		r.NoError(err)
   151  
   152  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   153  		err = tx.Create(&book)
   154  		r.NoError(err)
   155  
   156  		b := Book{}
   157  		err = tx.Eager().Find(&b, book.ID)
   158  		r.NoError(err)
   159  
   160  		r.NotEqual(b.ID, 0)
   161  		r.NotEqual(b.User.ID, 0)
   162  		r.Equal(b.User.ID, user.ID)
   163  
   164  		userAttr := UserAttribute{UserName: "mark", NickName: "Mark Z."}
   165  		err = tx.Create(&userAttr)
   166  		r.NoError(err)
   167  
   168  		uA := UserAttribute{}
   169  		err = tx.Eager().Find(&uA, userAttr.ID)
   170  		r.NoError(err)
   171  		r.Equal(uA.User.ID, user.ID)
   172  	})
   173  }
   174  
   175  func Test_Find_Eager_Belongs_To_Nulls(t *testing.T) {
   176  	transaction(func(tx *Connection) {
   177  		r := require.New(t)
   178  
   179  		user := User{Name: nulls.NewString("Mark")}
   180  		err := tx.Create(&user)
   181  		r.NoError(err)
   182  
   183  		book := Book{Title: "Pop Book", Isbn: "PB1"}
   184  		err = tx.Create(&book)
   185  		r.NoError(err)
   186  
   187  		b := Book{}
   188  		err = tx.Eager().Find(&b, book.ID)
   189  		r.NoError(err)
   190  	})
   191  }
   192  
   193  func Test_Find_Eager_Belongs_To_Pointers(t *testing.T) {
   194  	transaction(func(tx *Connection) {
   195  		r := require.New(t)
   196  
   197  		body := Body{}
   198  		err := tx.Create(&body)
   199  		r.NoError(err)
   200  
   201  		head := Head{BodyID: body.ID}
   202  		err = tx.Create(&head)
   203  		r.NoError(err)
   204  
   205  		b := Body{}
   206  		err = tx.Eager().Find(&b, body.ID)
   207  		r.NoError(err)
   208  	})
   209  }
   210  
   211  func Test_Find_Eager_Has_One(t *testing.T) {
   212  	transaction(func(tx *Connection) {
   213  		r := require.New(t)
   214  
   215  		user := User{Name: nulls.NewString("Mark")}
   216  		err := tx.Create(&user)
   217  		r.NoError(err)
   218  
   219  		coolSong := Song{Title: "Hook - Blues Traveler", UserID: user.ID}
   220  		err = tx.Create(&coolSong)
   221  		r.NoError(err)
   222  
   223  		u := User{}
   224  		err = tx.Eager().Find(&u, user.ID)
   225  		r.NoError(err)
   226  
   227  		r.NotEqual(u.ID, 0)
   228  		r.Equal(u.Name.String, "Mark")
   229  		r.Equal(u.FavoriteSong.ID, coolSong.ID)
   230  
   231  		//eager should work with rawquery
   232  		uid := u.ID
   233  		u = User{}
   234  		err = tx.RawQuery("select * from users where id=?", uid).First(&u)
   235  		r.NoError(err)
   236  		r.Equal(u.FavoriteSong.ID, uuid.Nil)
   237  
   238  		err = tx.RawQuery("select * from users where id=?", uid).Eager("FavoriteSong").First(&u)
   239  		r.NoError(err)
   240  		r.Equal(u.FavoriteSong.ID, coolSong.ID)
   241  	})
   242  }
   243  
   244  func Test_Find_Eager_Has_One_With_Inner_Associations_Struct(t *testing.T) {
   245  	transaction(func(tx *Connection) {
   246  		r := require.New(t)
   247  
   248  		user := User{Name: nulls.NewString("Mark")}
   249  		err := tx.Create(&user)
   250  		r.NoError(err)
   251  
   252  		composer := Composer{Name: "Blues Traveler"}
   253  		err = tx.Create(&composer)
   254  		r.NoError(err)
   255  
   256  		coolSong := Song{Title: "Hook", UserID: user.ID, ComposedByID: composer.ID}
   257  		err = tx.Create(&coolSong)
   258  		r.NoError(err)
   259  
   260  		u := User{}
   261  		err = tx.Eager("FavoriteSong.ComposedBy").Find(&u, user.ID)
   262  		r.NoError(err)
   263  
   264  		r.NotEqual(u.ID, 0)
   265  		r.Equal(u.Name.String, "Mark")
   266  		r.Equal(u.FavoriteSong.ID, coolSong.ID)
   267  		r.Equal(u.FavoriteSong.ComposedBy.Name, composer.Name)
   268  	})
   269  }
   270  
   271  func Test_Find_Eager_Has_One_With_Inner_Associations_Slice(t *testing.T) {
   272  	transaction(func(tx *Connection) {
   273  		r := require.New(t)
   274  
   275  		user := User{Name: nulls.NewString("Mark")}
   276  		err := tx.Create(&user)
   277  		r.NoError(err)
   278  
   279  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   280  		err = tx.Create(&book)
   281  		r.NoError(err)
   282  
   283  		writer := Writer{Name: "Mark Bates", BookID: book.ID}
   284  		err = tx.Create(&writer)
   285  		r.NoError(err)
   286  
   287  		u := User{}
   288  		err = tx.Eager("Books.Writers").Find(&u, user.ID)
   289  		r.NoError(err)
   290  
   291  		r.NotEqual(u.ID, 0)
   292  		r.Equal(u.Name.String, "Mark")
   293  		r.Equal(len(u.Books), 1)
   294  		r.Equal(len(u.Books[0].Writers), 1)
   295  
   296  		r.Equal(u.Books[0].Title, book.Title)
   297  		r.Equal(u.Books[0].Writers[0].Name, writer.Name)
   298  		r.Zero(u.Books[0].Writers[0].Book.ID)
   299  	})
   300  }
   301  
   302  func Test_Eager_Bad_Format(t *testing.T) {
   303  	transaction(func(tx *Connection) {
   304  		r := require.New(t)
   305  
   306  		user := User{Name: nulls.NewString("Mark")}
   307  		err := tx.Create(&user)
   308  		r.NoError(err)
   309  
   310  		u := User{}
   311  		err = tx.Eager("Books.").First(&u)
   312  		r.Error(err)
   313  
   314  		err = tx.Eager("Books.*").First(&u)
   315  		r.Error(err)
   316  
   317  		err = tx.Eager(".*").First(&u)
   318  		r.Error(err)
   319  
   320  		err = tx.Eager(".").First(&u)
   321  		r.Error(err)
   322  	})
   323  }
   324  
   325  func Test_Find_Eager_Many_To_Many(t *testing.T) {
   326  	transaction(func(tx *Connection) {
   327  		r := require.New(t)
   328  
   329  		user := User{Name: nulls.NewString("Mark")}
   330  		err := tx.Create(&user)
   331  		r.NoError(err)
   332  
   333  		address := Address{Street: "Pop Avenue", HouseNumber: 1}
   334  		err = tx.Create(&address)
   335  		r.NoError(err)
   336  
   337  		ownerProperty := UsersAddress{UserID: user.ID, AddressID: address.ID}
   338  		err = tx.Create(&ownerProperty)
   339  		r.NoError(err)
   340  
   341  		u := User{}
   342  		err = tx.Eager("Houses").Find(&u, user.ID)
   343  		r.NoError(err)
   344  
   345  		r.NotEqual(u.ID, 0)
   346  		r.Equal(u.Name.String, "Mark")
   347  
   348  		r.Equal(len(u.Houses), 1)
   349  		r.Equal(u.Houses[0].Street, address.Street)
   350  
   351  		address2 := Address{Street: "Pop Avenue 2", HouseNumber: 1}
   352  		err = tx.Create(&address2)
   353  		r.NoError(err)
   354  
   355  		user2 := User{Name: nulls.NewString("Mark 2")}
   356  		err = tx.Create(&user2)
   357  		r.NoError(err)
   358  
   359  		ownerProperty2 := UsersAddress{UserID: user2.ID, AddressID: address2.ID}
   360  		err = tx.Create(&ownerProperty2)
   361  		r.NoError(err)
   362  
   363  		//eager should work with rawquery
   364  		uid := u.ID
   365  		u = User{}
   366  		err = tx.RawQuery("select * from users where id=?", uid).Eager("Houses").First(&u)
   367  		r.NoError(err)
   368  		r.Equal(1, len(u.Houses))
   369  
   370  		//eager ALL
   371  		var users []User
   372  		err = tx.RawQuery("select * from users order by created_at asc").Eager("Houses").All(&users)
   373  		r.NoError(err)
   374  		r.Equal(2, len(users))
   375  
   376  		u = users[0]
   377  		r.Equal(u.Name.String, "Mark")
   378  		r.Equal(1, len(u.Houses))
   379  		r.Equal(u.Houses[0].Street, "Pop Avenue")
   380  
   381  		u = users[1]
   382  		r.Equal(u.Name.String, "Mark 2")
   383  		r.Equal(1, len(u.Houses))
   384  		r.Equal(u.Houses[0].Street, "Pop Avenue 2")
   385  	})
   386  }
   387  
   388  func Test_Load_Associations_Loaded_Model(t *testing.T) {
   389  	transaction(func(tx *Connection) {
   390  		r := require.New(t)
   391  
   392  		user := User{Name: nulls.NewString("Mark")}
   393  		err := tx.Create(&user)
   394  		r.NoError(err)
   395  
   396  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   397  		err = tx.Create(&book)
   398  		r.NoError(err)
   399  
   400  		u := User{}
   401  		err = tx.Find(&u, user.ID)
   402  
   403  		r.NoError(err)
   404  		r.Zero(len(u.Books))
   405  
   406  		err = tx.Load(&u)
   407  
   408  		r.NoError(err)
   409  		r.Equal(len(u.Books), 1)
   410  		r.Equal(u.Books[0].Title, book.Title)
   411  	})
   412  }
   413  
   414  func Test_First(t *testing.T) {
   415  	transaction(func(tx *Connection) {
   416  		r := require.New(t)
   417  
   418  		first := User{Name: nulls.NewString("Mark")}
   419  		err := tx.Create(&first)
   420  		r.NoError(err)
   421  
   422  		last := User{Name: nulls.NewString("Mark")}
   423  		err = tx.Create(&last)
   424  		r.NoError(err)
   425  
   426  		u := User{}
   427  		err = tx.Where("name = 'Mark'").First(&u)
   428  		r.NoError(err)
   429  
   430  		r.Equal(first.ID, u.ID)
   431  	})
   432  }
   433  
   434  func Test_Last(t *testing.T) {
   435  	transaction(func(tx *Connection) {
   436  		r := require.New(t)
   437  
   438  		first := User{Name: nulls.NewString("Mark")}
   439  		err := tx.Create(&first)
   440  		r.NoError(err)
   441  
   442  		last := User{Name: nulls.NewString("Mark")}
   443  		err = tx.Create(&last)
   444  		r.NoError(err)
   445  
   446  		u := User{}
   447  		err = tx.Where("name = 'Mark'").Last(&u)
   448  		r.NoError(err)
   449  
   450  		r.Equal(last.ID, u.ID)
   451  	})
   452  }
   453  
   454  func Test_All(t *testing.T) {
   455  	transaction(func(tx *Connection) {
   456  		r := require.New(t)
   457  
   458  		for _, name := range []string{"Mark", "Joe", "Jane"} {
   459  			user := User{Name: nulls.NewString(name)}
   460  			err := tx.Create(&user)
   461  			r.NoError(err)
   462  		}
   463  
   464  		u := Users{}
   465  		err := tx.All(context.TODO(), &u)
   466  		r.NoError(err)
   467  		r.Equal(len(u), 3)
   468  
   469  		u = Users{}
   470  		err = tx.Where("name = 'Mark'").All(context.TODO(), &u)
   471  		r.NoError(err)
   472  		r.Equal(len(u), 1)
   473  	})
   474  }
   475  
   476  func Test_All_Eager_Slice_With_All(t *testing.T) {
   477  	transaction(func(tx *Connection) {
   478  		r := require.New(t)
   479  
   480  		for _, name := range []string{"Mark", "Joe", "Jane"} {
   481  			user := User{Name: nulls.NewString(name)}
   482  			err := tx.Create(&user)
   483  			r.NoError(err)
   484  
   485  			book := Book{Title: "Book of " + user.Name.String, UserID: nulls.NewInt(user.ID)}
   486  			err = tx.Create(&book)
   487  			r.NoError(err)
   488  		}
   489  
   490  		u := Users{}
   491  		err := tx.Eager("Books.User").All(context.TODO(), &u)
   492  		r.NoError(err)
   493  		r.Equal(len(u), 3)
   494  
   495  		r.Equal(u[0].ID, u[0].Books[0].User.ID)
   496  		r.Equal(u[1].ID, u[1].Books[0].User.ID)
   497  		r.Equal(u[2].ID, u[2].Books[0].User.ID)
   498  	})
   499  }
   500  
   501  func Test_All_Eager(t *testing.T) {
   502  	transaction(func(tx *Connection) {
   503  		r := require.New(t)
   504  
   505  		for _, name := range []string{"Mark", "Joe", "Jane"} {
   506  			user := User{Name: nulls.NewString(name)}
   507  			err := tx.Create(&user)
   508  			r.NoError(err)
   509  
   510  			if name == "Mark" {
   511  				book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   512  				err = tx.Create(&book)
   513  				r.NoError(err)
   514  			}
   515  		}
   516  
   517  		u := Users{}
   518  		err := tx.Eager(" Books ", " ").Where("name = 'Mark'").All(&u)
   519  		r.NoError(err)
   520  		r.Equal(len(u), 1)
   521  		r.Equal(len(u[0].Books), 1)
   522  	})
   523  }
   524  
   525  func Test_All_Eager_For_Query(t *testing.T) {
   526  	transaction(func(tx *Connection) {
   527  		r := require.New(t)
   528  
   529  		user := User{Name: nulls.NewString("Mark")}
   530  		err := tx.Create(&user)
   531  		r.NoError(err)
   532  
   533  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   534  		err = tx.Create(&book)
   535  		r.NoError(err)
   536  
   537  		u := Users{}
   538  		q := tx.Q()
   539  		err = q.Eager("Books").Where("name = 'Mark'").All(&u)
   540  		r.NoError(err)
   541  		r.Equal(len(u), 1)
   542  		r.Equal(len(u[0].Books), 1)
   543  	})
   544  }
   545  
   546  func Test_All_Eager_Field_Not_Found_Error(t *testing.T) {
   547  	transaction(func(tx *Connection) {
   548  		r := require.New(t)
   549  
   550  		user := User{Name: nulls.NewString("Mark")}
   551  		err := tx.Create(&user)
   552  		r.NoError(err)
   553  
   554  		u := Users{}
   555  		err = tx.Eager("FieldNotFound").Where("name = 'Mark'").All(&u)
   556  		r.Error(err)
   557  		r.Equal("field FieldNotFound does not exist in model User", err.Error())
   558  	})
   559  }
   560  
   561  func Test_All_Eager_Allow_Chain_Call(t *testing.T) {
   562  	transaction(func(tx *Connection) {
   563  		r := require.New(t)
   564  
   565  		user := User{Name: nulls.NewString("Mark")}
   566  		err := tx.Create(&user)
   567  		r.NoError(err)
   568  
   569  		coolSong := Song{Title: "Hook - Blues Traveler", UserID: user.ID}
   570  		err = tx.Create(&coolSong)
   571  		r.NoError(err)
   572  
   573  		book := Book{Title: "Pop Book", Isbn: "PB1", UserID: nulls.NewInt(user.ID)}
   574  		err = tx.Create(&book)
   575  		r.NoError(err)
   576  
   577  		u := Users{}
   578  		err = tx.Eager("Books").Eager("FavoriteSong").Where("name = 'Mark'").All(&u)
   579  		r.NoError(err)
   580  		r.Equal(len(u), 1)
   581  		r.Equal(len(u[0].Books), 1)
   582  		r.Equal(u[0].FavoriteSong.Title, coolSong.Title)
   583  	})
   584  }
   585  
   586  func Test_Count(t *testing.T) {
   587  	transaction(func(tx *Connection) {
   588  		r := require.New(t)
   589  
   590  		user := User{Name: nulls.NewString("Mark")}
   591  		err := tx.Create(&user)
   592  		r.NoError(err)
   593  		c, err := tx.Count(&user)
   594  		r.NoError(err)
   595  		r.Equal(c, 1)
   596  
   597  		c, err = tx.Where("1=1").CountByField(&user, "distinct id")
   598  		r.NoError(err)
   599  		r.Equal(c, 1)
   600  		// should ignore order in count
   601  
   602  		c, err = tx.Order("id desc").Count(&user)
   603  		r.NoError(err)
   604  		r.Equal(c, 1)
   605  
   606  		var uAQ []UsersAddressQuery
   607  		_, err = Q(tx).Select("users_addresses.*").LeftJoin("users", "users.id=users_addresses.user_id").Count(&uAQ)
   608  		r.NoError(err)
   609  
   610  		_, err = Q(tx).Select("users_addresses.*", "users.name", "users.email").LeftJoin("users", "users.id=users_addresses.user_id").Count(&uAQ)
   611  		r.NoError(err)
   612  	})
   613  }
   614  
   615  func Test_Count_Disregards_Pagination(t *testing.T) {
   616  	transaction(func(tx *Connection) {
   617  		r := require.New(t)
   618  
   619  		names := []string{
   620  			"Jack",
   621  			"Hurley",
   622  			"Charlie",
   623  			"Desmond",
   624  			"Juliet",
   625  			"Locke",
   626  			"Sawyer",
   627  			"Kate",
   628  			"Benjamin Linus",
   629  		}
   630  
   631  		for _, name := range names {
   632  			user := User{Name: nulls.NewString(name)}
   633  			err := tx.Create(&user)
   634  			r.NoError(err)
   635  		}
   636  
   637  		firstUsers := Users{}
   638  		secondUsers := Users{}
   639  
   640  		q := tx.Paginate(1, 3)
   641  		r.NoError(q.All(&firstUsers))
   642  		r.Equal(len(names), q.Paginator.TotalEntriesSize) //ensure paginator populates count
   643  		r.Equal(3, len(firstUsers))
   644  
   645  		firstUsers = Users{}
   646  		q = tx.RawQuery("select * from users").Paginate(1, 3)
   647  		r.NoError(q.All(&firstUsers))
   648  		r.Equal(1, q.Paginator.Page)
   649  		r.Equal(3, q.Paginator.PerPage)
   650  		r.Equal(len(names), q.Paginator.TotalEntriesSize) //ensure paginator populates count
   651  
   652  		r.Equal(3, len(firstUsers))
   653  		totalFirstPage := q.Paginator.TotalPages
   654  
   655  		q = tx.Paginate(2, 3)
   656  		r.NoError(q.All(&secondUsers))
   657  
   658  		r.Equal(3, len(secondUsers))
   659  		totalSecondPage := q.Paginator.TotalPages
   660  
   661  		r.NotEqual(0, totalFirstPage)
   662  		r.NotEqual(0, totalSecondPage)
   663  		r.Equal(totalFirstPage, totalSecondPage)
   664  
   665  		firstUsers = Users{}
   666  		q = tx.RawQuery("select * from users limit  2").Paginate(1, 5)
   667  		err := q.All(&firstUsers)
   668  		r.NoError(err)
   669  		r.Equal(2, len(firstUsers)) //raw query limit applies
   670  
   671  		firstUsers = Users{}
   672  		q = tx.RawQuery("select * from users limit 2 offset 1").Paginate(1, 5)
   673  		err = q.All(&firstUsers)
   674  		r.NoError(err)
   675  		r.Equal(2, len(firstUsers))
   676  
   677  		firstUsers = Users{}
   678  		q = tx.RawQuery("select * from users limit 2 offset\t1").Paginate(1, 5)
   679  		err = q.All(&firstUsers)
   680  		r.NoError(err)
   681  		r.Equal(2, len(firstUsers))
   682  
   683  		firstUsers = Users{}
   684  		q = tx.RawQuery(`select * from users limit 2 offset
   685  			1`).Paginate(1, 5)
   686  		err = q.All(&firstUsers)
   687  		r.NoError(err)
   688  		r.Equal(2, len(firstUsers))
   689  
   690  		firstUsers = Users{}
   691  		q = tx.RawQuery(`select * from users limit 2 offset
   692  			1
   693  			`).Paginate(1, 5) //ending space and tab
   694  		err = q.All(&firstUsers)
   695  		r.NoError(err)
   696  		r.Equal(2, len(firstUsers))
   697  
   698  		if tx.Dialect.Name() == "sqlite" {
   699  			firstUsers = Users{}
   700  			q = tx.RawQuery("select * from users limit 2,1").Paginate(1, 5)
   701  			err = q.All(&firstUsers)
   702  			r.NoError(err)
   703  			r.Equal(2, len(firstUsers))
   704  
   705  			firstUsers = Users{}
   706  			q = tx.RawQuery("select * from users limit 2 , 1").Paginate(1, 5)
   707  			err = q.All(&firstUsers)
   708  			r.NoError(err)
   709  			r.Equal(2, len(firstUsers))
   710  		}
   711  
   712  		if tx.Dialect.Name() == "postgresql" {
   713  			firstUsers = Users{}
   714  			q = tx.RawQuery("select * from users FETCH FIRST 3 rows only").Paginate(1, 5)
   715  			err = q.All(&firstUsers)
   716  			r.NoError(err)
   717  			r.Equal(3, len(firstUsers)) //should fetch only 3
   718  		}
   719  	})
   720  }
   721  
   722  func Test_Count_RawQuery(t *testing.T) {
   723  	transaction(func(tx *Connection) {
   724  		r := require.New(t)
   725  
   726  		user := User{Name: nulls.NewString("Mark")}
   727  		err := tx.Create(&user)
   728  		r.NoError(err)
   729  
   730  		c, err := tx.RawQuery("select * from users as users").Count(nil)
   731  		r.NoError(err)
   732  		r.Equal(c, 1)
   733  
   734  		c, err = tx.RawQuery("select * from users as users where id = -1").Count(nil)
   735  		r.NoError(err)
   736  		r.Equal(c, 0)
   737  
   738  		c, err = tx.RawQuery("select name, max(created_at) from users as users group by name").Count(nil)
   739  		r.NoError(err)
   740  		r.Equal(c, 1)
   741  
   742  		c, err = tx.RawQuery("select name from users order by name asc limit 5").Count(nil)
   743  		r.NoError(err)
   744  		r.Equal(c, 1)
   745  
   746  		c, err = tx.RawQuery("select name from users order by name asc limit 5 offset 0").Count(nil)
   747  		r.NoError(err)
   748  		r.Equal(c, 1)
   749  	})
   750  }
   751  
   752  func Test_Exists(t *testing.T) {
   753  	transaction(func(tx *Connection) {
   754  		r := require.New(t)
   755  
   756  		t, _ := tx.Where("id = ?", 0).Exists("users")
   757  		r.False(t)
   758  
   759  		user := User{Name: nulls.NewString("Mark")}
   760  		err := tx.Create(&user)
   761  		r.NoError(err)
   762  
   763  		t, _ = tx.Where("id = ?", user.ID).Exists("users")
   764  		r.True(t)
   765  	})
   766  }
   767  
   768  func Test_FindManyToMany(t *testing.T) {
   769  	transaction(func(tx *Connection) {
   770  		r := require.New(t)
   771  		parent := &Parent{}
   772  		r.NoError(tx.Create(parent))
   773  
   774  		student := &Student{}
   775  		r.NoError(tx.Create(student))
   776  
   777  		r.NoError(tx.RawQuery("INSERT INTO parents_students (student_id, parent_id) VALUES(?,?)", student.ID, parent.ID).Exec())
   778  
   779  		p := &Parent{}
   780  		err := tx.Eager("Students").Find(p, parent.ID)
   781  		r.NoError(err)
   782  	})
   783  }