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 }