github.com/goravel/framework@v1.13.9/database/gorm/query_test.go (about) 1 package gorm 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "log" 8 "strconv" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/suite" 14 _ "gorm.io/driver/postgres" 15 16 configmocks "github.com/goravel/framework/contracts/config/mocks" 17 ormcontract "github.com/goravel/framework/contracts/database/orm" 18 databasedb "github.com/goravel/framework/database/db" 19 "github.com/goravel/framework/database/orm" 20 "github.com/goravel/framework/support/file" 21 ) 22 23 type QueryTestSuite struct { 24 suite.Suite 25 queries map[ormcontract.Driver]ormcontract.Query 26 mysqlDocker *MysqlDocker 27 mysqlDocker1 *MysqlDocker 28 postgresqlDocker *PostgresqlDocker 29 sqliteDocker *SqliteDocker 30 sqlserverDocker *SqlserverDocker 31 } 32 33 func TestQueryTestSuite(t *testing.T) { 34 if testing.Short() { 35 t.Skip("Skipping tests of using docker") 36 } 37 38 testContext = context.Background() 39 testContext = context.WithValue(testContext, testContextKey, "goravel") 40 41 mysqlDocker := NewMysqlDocker() 42 mysqlPool, mysqlResource, mysqlQuery, err := mysqlDocker.New() 43 if err != nil { 44 log.Fatalf("Init mysql error: %s", err) 45 } 46 47 mysqlDocker1 := NewMysqlDocker() 48 mysqlPool1, mysqlResource1, _, err := mysqlDocker1.New() 49 if err != nil { 50 log.Fatalf("Init mysql1 error: %s", err) 51 } 52 53 postgresqlDocker := NewPostgresqlDocker() 54 postgresqlPool, postgresqlResource, postgresqlQuery, err := postgresqlDocker.New() 55 if err != nil { 56 log.Fatalf("Init postgresql error: %s", err) 57 } 58 59 sqliteDocker := NewSqliteDocker(dbDatabase) 60 _, _, sqliteQuery, err := sqliteDocker.New() 61 if err != nil { 62 log.Fatalf("Init sqlite error: %s", err) 63 } 64 65 sqlserverDocker := NewSqlserverDocker() 66 sqlserverPool, sqlserverResource, sqlserverQuery, err := sqlserverDocker.New() 67 if err != nil { 68 log.Fatalf("Init sqlserver error: %s", err) 69 } 70 71 suite.Run(t, &QueryTestSuite{ 72 queries: map[ormcontract.Driver]ormcontract.Query{ 73 ormcontract.DriverMysql: mysqlQuery, 74 ormcontract.DriverPostgresql: postgresqlQuery, 75 ormcontract.DriverSqlite: sqliteQuery, 76 ormcontract.DriverSqlserver: sqlserverQuery, 77 }, 78 mysqlDocker: mysqlDocker, 79 mysqlDocker1: mysqlDocker1, 80 postgresqlDocker: postgresqlDocker, 81 sqliteDocker: sqliteDocker, 82 sqlserverDocker: sqlserverDocker, 83 }) 84 85 assert.Nil(t, file.Remove(dbDatabase)) 86 assert.Nil(t, mysqlPool.Purge(mysqlResource)) 87 assert.Nil(t, mysqlPool1.Purge(mysqlResource1)) 88 assert.Nil(t, postgresqlPool.Purge(postgresqlResource)) 89 assert.Nil(t, sqlserverPool.Purge(sqlserverResource)) 90 } 91 92 func (s *QueryTestSuite) SetupTest() {} 93 94 func (s *QueryTestSuite) TestAssociation() { 95 for driver, query := range s.queries { 96 tests := []struct { 97 name string 98 setup func() 99 }{ 100 { 101 name: "Find", 102 setup: func() { 103 user := User{ 104 Name: "association_find_name", 105 Address: &Address{ 106 Name: "association_find_address", 107 }, 108 age: 1, 109 } 110 111 s.Nil(query.Select(orm.Associations).Create(&user)) 112 s.True(user.ID > 0) 113 s.True(user.Address.ID > 0) 114 115 var user1 User 116 s.Nil(query.Find(&user1, user.ID)) 117 s.True(user1.ID > 0) 118 119 var userAddress Address 120 s.Nil(query.Model(&user1).Association("Address").Find(&userAddress)) 121 s.True(userAddress.ID > 0) 122 s.Equal("association_find_address", userAddress.Name) 123 }, 124 }, 125 { 126 name: "hasOne Append", 127 setup: func() { 128 user := User{ 129 Name: "association_has_one_append_name", 130 Address: &Address{ 131 Name: "association_has_one_append_address", 132 }, 133 } 134 135 s.Nil(query.Select(orm.Associations).Create(&user)) 136 s.True(user.ID > 0) 137 s.True(user.Address.ID > 0) 138 139 var user1 User 140 s.Nil(query.Find(&user1, user.ID), driver) 141 s.True(user1.ID > 0, driver) 142 s.Nil(query.Model(&user1).Association("Address").Append(&Address{Name: "association_has_one_append_address1"}), driver) 143 144 s.Nil(query.Load(&user1, "Address"), driver) 145 s.True(user1.Address.ID > 0, driver) 146 s.Equal("association_has_one_append_address1", user1.Address.Name, driver) 147 }, 148 }, 149 { 150 name: "hasMany Append", 151 setup: func() { 152 user := User{ 153 Name: "association_has_many_append_name", 154 Books: []*Book{ 155 {Name: "association_has_many_append_address1"}, 156 {Name: "association_has_many_append_address2"}, 157 }, 158 } 159 160 s.Nil(query.Select(orm.Associations).Create(&user)) 161 s.True(user.ID > 0) 162 s.True(user.Books[0].ID > 0) 163 s.True(user.Books[1].ID > 0) 164 165 var user1 User 166 s.Nil(query.Find(&user1, user.ID)) 167 s.True(user1.ID > 0) 168 s.Nil(query.Model(&user1).Association("Books").Append(&Book{Name: "association_has_many_append_address3"})) 169 170 s.Nil(query.Load(&user1, "Books")) 171 s.Equal(3, len(user1.Books)) 172 s.Equal("association_has_many_append_address3", user1.Books[2].Name) 173 }, 174 }, 175 { 176 name: "hasOne Replace", 177 setup: func() { 178 user := User{ 179 Name: "association_has_one_append_name", 180 Address: &Address{ 181 Name: "association_has_one_append_address", 182 }, 183 } 184 185 s.Nil(query.Select(orm.Associations).Create(&user)) 186 s.True(user.ID > 0) 187 s.True(user.Address.ID > 0) 188 189 var user1 User 190 s.Nil(query.Find(&user1, user.ID)) 191 s.True(user1.ID > 0) 192 s.Nil(query.Model(&user1).Association("Address").Replace(&Address{Name: "association_has_one_append_address1"})) 193 194 s.Nil(query.Load(&user1, "Address")) 195 s.True(user1.Address.ID > 0) 196 s.Equal("association_has_one_append_address1", user1.Address.Name) 197 }, 198 }, 199 { 200 name: "hasMany Replace", 201 setup: func() { 202 user := User{ 203 Name: "association_has_many_replace_name", 204 Books: []*Book{ 205 {Name: "association_has_many_replace_address1"}, 206 {Name: "association_has_many_replace_address2"}, 207 }, 208 } 209 210 s.Nil(query.Select(orm.Associations).Create(&user)) 211 s.True(user.ID > 0) 212 s.True(user.Books[0].ID > 0) 213 s.True(user.Books[1].ID > 0) 214 215 var user1 User 216 s.Nil(query.Find(&user1, user.ID)) 217 s.True(user1.ID > 0) 218 s.Nil(query.Model(&user1).Association("Books").Replace(&Book{Name: "association_has_many_replace_address3"})) 219 220 s.Nil(query.Load(&user1, "Books")) 221 s.Equal(1, len(user1.Books)) 222 s.Equal("association_has_many_replace_address3", user1.Books[0].Name) 223 }, 224 }, 225 { 226 name: "Delete", 227 setup: func() { 228 user := User{ 229 Name: "association_delete_name", 230 Address: &Address{ 231 Name: "association_delete_address", 232 }, 233 } 234 235 s.Nil(query.Select(orm.Associations).Create(&user)) 236 s.True(user.ID > 0) 237 s.True(user.Address.ID > 0) 238 239 // No ID when Delete 240 var user1 User 241 s.Nil(query.Find(&user1, user.ID)) 242 s.True(user1.ID > 0) 243 s.Nil(query.Model(&user1).Association("Address").Delete(&Address{Name: "association_delete_address"})) 244 245 s.Nil(query.Load(&user1, "Address")) 246 s.True(user1.Address.ID > 0) 247 s.Equal("association_delete_address", user1.Address.Name) 248 249 // Has ID when Delete 250 var user2 User 251 s.Nil(query.Find(&user2, user.ID)) 252 s.True(user2.ID > 0) 253 var userAddress Address 254 userAddress.ID = user1.Address.ID 255 s.Nil(query.Model(&user2).Association("Address").Delete(&userAddress)) 256 257 s.Nil(query.Load(&user2, "Address")) 258 s.Nil(user2.Address) 259 }, 260 }, 261 { 262 name: "Clear", 263 setup: func() { 264 user := User{ 265 Name: "association_clear_name", 266 Address: &Address{ 267 Name: "association_clear_address", 268 }, 269 } 270 271 s.Nil(query.Select(orm.Associations).Create(&user)) 272 s.True(user.ID > 0) 273 s.True(user.Address.ID > 0) 274 275 // No ID when Delete 276 var user1 User 277 s.Nil(query.Find(&user1, user.ID)) 278 s.True(user1.ID > 0) 279 s.Nil(query.Model(&user1).Association("Address").Clear()) 280 281 s.Nil(query.Load(&user1, "Address")) 282 s.Nil(user1.Address) 283 }, 284 }, 285 { 286 name: "Count", 287 setup: func() { 288 user := User{ 289 Name: "association_count_name", 290 Books: []*Book{ 291 {Name: "association_count_address1"}, 292 {Name: "association_count_address2"}, 293 }, 294 } 295 296 s.Nil(query.Select(orm.Associations).Create(&user)) 297 s.True(user.ID > 0) 298 s.True(user.Books[0].ID > 0) 299 s.True(user.Books[1].ID > 0) 300 301 var user1 User 302 s.Nil(query.Find(&user1, user.ID)) 303 s.True(user1.ID > 0) 304 s.Equal(int64(2), query.Model(&user1).Association("Books").Count()) 305 }, 306 }, 307 } 308 309 for _, test := range tests { 310 s.Run(test.name, func() { 311 test.setup() 312 }) 313 } 314 } 315 } 316 317 func (s *QueryTestSuite) TestBelongsTo() { 318 for driver, query := range s.queries { 319 s.Run(driver.String(), func() { 320 user := &User{ 321 Name: "belongs_to_name", 322 Address: &Address{ 323 Name: "belongs_to_address", 324 }, 325 } 326 327 s.Nil(query.Select(orm.Associations).Create(&user)) 328 s.True(user.ID > 0) 329 s.True(user.Address.ID > 0) 330 331 var userAddress Address 332 s.Nil(query.With("User").Where("name = ?", "belongs_to_address").First(&userAddress)) 333 s.True(userAddress.ID > 0) 334 s.True(userAddress.User.ID > 0) 335 }) 336 } 337 } 338 339 func (s *QueryTestSuite) TestCount() { 340 for driver, query := range s.queries { 341 s.Run(driver.String(), func() { 342 user := User{Name: "count_user", Avatar: "count_avatar"} 343 s.Nil(query.Create(&user)) 344 s.True(user.ID > 0) 345 346 user1 := User{Name: "count_user", Avatar: "count_avatar1"} 347 s.Nil(query.Create(&user1)) 348 s.True(user1.ID > 0) 349 350 var count int64 351 s.Nil(query.Model(&User{}).Where("name = ?", "count_user").Count(&count)) 352 s.True(count > 0) 353 354 var count1 int64 355 s.Nil(query.Table("users").Where("name = ?", "count_user").Count(&count1)) 356 s.True(count1 > 0) 357 }) 358 } 359 } 360 361 func (s *QueryTestSuite) TestCreate() { 362 for driver, query := range s.queries { 363 tests := []struct { 364 name string 365 setup func() 366 }{ 367 { 368 name: "success when refresh connection", 369 setup: func() { 370 s.mockDummyConnection(driver) 371 372 people := People{Body: "create_people"} 373 s.Nil(query.Create(&people)) 374 s.True(people.ID > 0) 375 376 people1 := People{Body: "create_people1"} 377 s.Nil(query.Model(&People{}).Create(&people1)) 378 s.True(people1.ID > 0) 379 }, 380 }, 381 { 382 name: "success when create with no relationships", 383 setup: func() { 384 user := User{Name: "create_user", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 385 user.Address.Name = "create_address" 386 user.Books[0].Name = "create_book0" 387 user.Books[1].Name = "create_book1" 388 s.Nil(query.Create(&user)) 389 s.True(user.ID > 0) 390 s.True(user.Address.ID == 0) 391 s.True(user.Books[0].ID == 0) 392 s.True(user.Books[1].ID == 0) 393 }, 394 }, 395 { 396 name: "success when create with select orm.Associations", 397 setup: func() { 398 user := User{Name: "create_user", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 399 user.Address.Name = "create_address" 400 user.Books[0].Name = "create_book0" 401 user.Books[1].Name = "create_book1" 402 s.Nil(query.Select(orm.Associations).Create(&user)) 403 s.True(user.ID > 0) 404 s.True(user.Address.ID > 0) 405 s.True(user.Books[0].ID > 0) 406 s.True(user.Books[1].ID > 0) 407 }, 408 }, 409 { 410 name: "success when create with select fields", 411 setup: func() { 412 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 413 user.Address.Name = "create_address" 414 user.Books[0].Name = "create_book0" 415 user.Books[1].Name = "create_book1" 416 s.Nil(query.Select("Name", "Avatar", "Address").Create(&user)) 417 s.True(user.ID > 0) 418 s.True(user.Address.ID > 0) 419 s.True(user.Books[0].ID == 0) 420 s.True(user.Books[1].ID == 0) 421 }, 422 }, 423 { 424 name: "success when create with omit fields", 425 setup: func() { 426 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 427 user.Address.Name = "create_address" 428 user.Books[0].Name = "create_book0" 429 user.Books[1].Name = "create_book1" 430 s.Nil(query.Omit("Address").Create(&user)) 431 s.True(user.ID > 0) 432 s.True(user.Address.ID == 0) 433 s.True(user.Books[0].ID > 0) 434 s.True(user.Books[1].ID > 0) 435 }, 436 }, 437 { 438 name: "success create with omit orm.Associations", 439 setup: func() { 440 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 441 user.Address.Name = "create_address" 442 user.Books[0].Name = "create_book0" 443 user.Books[1].Name = "create_book1" 444 s.Nil(query.Omit(orm.Associations).Create(&user)) 445 s.True(user.ID > 0) 446 s.True(user.Address.ID == 0) 447 s.True(user.Books[0].ID == 0) 448 s.True(user.Books[1].ID == 0) 449 }, 450 }, 451 { 452 name: "error when set select and omit at the same time", 453 setup: func() { 454 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 455 user.Address.Name = "create_address" 456 user.Books[0].Name = "create_book0" 457 user.Books[1].Name = "create_book1" 458 s.EqualError(query.Omit(orm.Associations).Select("Name").Create(&user), "cannot set Select and Omits at the same time") 459 }, 460 }, 461 { 462 name: "error when select that set fields and orm.Associations at the same time", 463 setup: func() { 464 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 465 user.Address.Name = "create_address" 466 user.Books[0].Name = "create_book0" 467 user.Books[1].Name = "create_book1" 468 s.EqualError(query.Select("Name", orm.Associations).Create(&user), "cannot set orm.Associations and other fields at the same time") 469 }, 470 }, 471 { 472 name: "error when omit that set fields and orm.Associations at the same time", 473 setup: func() { 474 user := User{Name: "create_user", Avatar: "create_avatar", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 475 user.Address.Name = "create_address" 476 user.Books[0].Name = "create_book0" 477 user.Books[1].Name = "create_book1" 478 s.EqualError(query.Omit("Name", orm.Associations).Create(&user), "cannot set orm.Associations and other fields at the same time") 479 }, 480 }, 481 } 482 for _, test := range tests { 483 s.Run(test.name, func() { 484 test.setup() 485 }) 486 } 487 } 488 } 489 490 func (s *QueryTestSuite) TestCursor() { 491 for driver, query := range s.queries { 492 s.Run(driver.String(), func() { 493 user := User{Name: "cursor_user", Avatar: "cursor_avatar", Address: &Address{Name: "cursor_address"}, Books: []*Book{ 494 {Name: "cursor_book"}, 495 }} 496 s.Nil(query.Select(orm.Associations).Create(&user)) 497 s.True(user.ID > 0) 498 499 user1 := User{Name: "cursor_user", Avatar: "cursor_avatar1"} 500 s.Nil(query.Create(&user1)) 501 s.True(user1.ID > 0) 502 503 user2 := User{Name: "cursor_user", Avatar: "cursor_avatar2"} 504 s.Nil(query.Create(&user2)) 505 s.True(user2.ID > 0) 506 res, err := query.Delete(&user2) 507 s.Nil(err) 508 s.Equal(int64(1), res.RowsAffected) 509 510 users, err := query.Model(&User{}).Where("name = ?", "cursor_user").WithTrashed().With("Address").With("Books").Cursor() 511 s.Nil(err) 512 var size int 513 var addressNum int 514 var bookNum int 515 for row := range users { 516 var tempUser User 517 s.Nil(row.Scan(&tempUser)) 518 s.True(tempUser.ID > 0) 519 s.True(len(tempUser.Name) > 0) 520 s.NotEmpty(tempUser.CreatedAt.String()) 521 s.NotEmpty(tempUser.UpdatedAt.String()) 522 s.Equal(tempUser.DeletedAt.Valid, tempUser.ID == user2.ID) 523 size++ 524 525 if tempUser.Address != nil { 526 addressNum++ 527 } 528 bookNum += len(tempUser.Books) 529 } 530 s.Equal(3, size) 531 s.Equal(1, addressNum) 532 s.Equal(1, bookNum) 533 }) 534 } 535 } 536 537 func (s *QueryTestSuite) TestDBRaw() { 538 userName := "db_raw" 539 for driver, query := range s.queries { 540 s.Run(driver.String(), func() { 541 user := User{Name: userName} 542 543 s.Nil(query.Create(&user)) 544 s.True(user.ID > 0) 545 switch driver { 546 case ormcontract.DriverSqlserver, ormcontract.DriverMysql: 547 res, err := query.Model(&user).Update("Name", databasedb.Raw("concat(name, ?)", driver.String())) 548 s.Nil(err) 549 s.Equal(int64(1), res.RowsAffected) 550 default: 551 res, err := query.Model(&user).Update("Name", databasedb.Raw("name || ?", driver.String())) 552 s.Nil(err) 553 s.Equal(int64(1), res.RowsAffected) 554 } 555 556 var user1 User 557 s.Nil(query.Find(&user1, user.ID)) 558 s.True(user1.ID > 0) 559 s.True(user1.Name == userName+driver.String()) 560 }) 561 } 562 } 563 564 func (s *QueryTestSuite) TestDelete() { 565 for driver, query := range s.queries { 566 tests := []struct { 567 name string 568 setup func() 569 }{ 570 { 571 name: "success", 572 setup: func() { 573 user := User{Name: "delete_user", Avatar: "delete_avatar"} 574 s.Nil(query.Create(&user)) 575 s.True(user.ID > 0) 576 577 res, err := query.Delete(&user) 578 s.Equal(int64(1), res.RowsAffected) 579 s.Nil(err) 580 581 var user1 User 582 s.Nil(query.Find(&user1, user.ID)) 583 s.Equal(uint(0), user1.ID) 584 }, 585 }, 586 { 587 name: "success when refresh connection", 588 setup: func() { 589 user := User{Name: "delete_user", Avatar: "delete_avatar"} 590 s.Nil(query.Create(&user)) 591 s.True(user.ID > 0) 592 593 res, err := query.Delete(&user) 594 s.Equal(int64(1), res.RowsAffected) 595 s.Nil(err) 596 597 var user1 User 598 s.Nil(query.Find(&user1, user.ID)) 599 s.Equal(uint(0), user1.ID) 600 601 // refresh connection 602 s.mockDummyConnection(driver) 603 604 people := People{Body: "delete_people"} 605 s.Nil(query.Create(&people)) 606 s.True(people.ID > 0) 607 608 res, err = query.Delete(&people) 609 s.Equal(int64(1), res.RowsAffected) 610 s.Nil(err) 611 612 var people1 People 613 s.Nil(query.Find(&people1, people.ID)) 614 s.Equal(uint(0), people1.ID) 615 }, 616 }, 617 { 618 name: "success by id", 619 setup: func() { 620 user := User{Name: "delete_user", Avatar: "delete_avatar"} 621 s.Nil(query.Create(&user)) 622 s.True(user.ID > 0) 623 624 res, err := query.Delete(&User{}, user.ID) 625 s.Equal(int64(1), res.RowsAffected) 626 s.Nil(err) 627 628 var user1 User 629 s.Nil(query.Find(&user1, user.ID)) 630 s.Equal(uint(0), user1.ID) 631 }, 632 }, 633 { 634 name: "success by multiple", 635 setup: func() { 636 users := []User{{Name: "delete_user", Avatar: "delete_avatar"}, {Name: "delete_user1", Avatar: "delete_avatar1"}} 637 s.Nil(query.Create(&users)) 638 s.True(users[0].ID > 0) 639 s.True(users[1].ID > 0) 640 641 res, err := query.Delete(&User{}, []uint{users[0].ID, users[1].ID}) 642 s.Equal(int64(2), res.RowsAffected) 643 s.Nil(err) 644 645 var count int64 646 s.Nil(query.Model(&User{}).Where("name", "delete_user").OrWhere("name", "delete_user1").Count(&count)) 647 s.True(count == 0) 648 }, 649 }, 650 } 651 for _, test := range tests { 652 s.Run(test.name, func() { 653 test.setup() 654 }) 655 } 656 } 657 } 658 659 func (s *QueryTestSuite) TestDistinct() { 660 for driver, query := range s.queries { 661 s.Run(driver.String(), func() { 662 user := User{Name: "distinct_user", Avatar: "distinct_avatar"} 663 s.Nil(query.Create(&user)) 664 s.True(user.ID > 0) 665 666 user1 := User{Name: "distinct_user", Avatar: "distinct_avatar1"} 667 s.Nil(query.Create(&user1)) 668 s.True(user1.ID > 0) 669 670 var users []User 671 s.Nil(query.Distinct("name").Find(&users, []uint{user.ID, user1.ID})) 672 s.Equal(1, len(users)) 673 }) 674 } 675 } 676 677 func (s *QueryTestSuite) TestEvent_Creating() { 678 for _, query := range s.queries { 679 tests := []struct { 680 name string 681 setup func() 682 }{ 683 { 684 name: "trigger when create", 685 setup: func() { 686 user := User{Name: "event_creating_name"} 687 s.Nil(query.Create(&user)) 688 s.Equal("event_creating_avatar", user.Avatar) 689 690 var user1 User 691 s.Nil(query.Find(&user1, user.ID)) 692 s.Equal("event_creating_name", user1.Name) 693 s.Equal("event_creating_avatar", user1.Avatar) 694 }, 695 }, 696 { 697 name: "trigger when FirstOrCreate", 698 setup: func() { 699 var user User 700 s.Nil(query.FirstOrCreate(&user, User{Name: "event_creating_FirstOrCreate_name"})) 701 s.True(user.ID > 0) 702 s.Equal("event_creating_FirstOrCreate_name", user.Name) 703 s.Equal("event_creating_FirstOrCreate_avatar", user.Avatar) 704 705 var user1 User 706 s.Nil(query.Find(&user1, user.ID)) 707 s.Equal("event_creating_FirstOrCreate_name", user1.Name) 708 s.Equal("event_creating_FirstOrCreate_avatar", user1.Avatar) 709 }, 710 }, 711 } 712 for _, test := range tests { 713 s.Run(test.name, func() { 714 test.setup() 715 }) 716 } 717 } 718 } 719 720 func (s *QueryTestSuite) TestEvent_Created() { 721 for _, query := range s.queries { 722 tests := []struct { 723 name string 724 setup func() 725 }{ 726 { 727 name: "trigger when create", 728 setup: func() { 729 user := User{Name: "event_created_name", Avatar: "avatar"} 730 s.Nil(query.Create(&user)) 731 s.Equal("event_created_avatar", user.Avatar) 732 733 var user1 User 734 s.Nil(query.Find(&user1, user.ID)) 735 s.Equal("event_created_name", user1.Name) 736 s.Equal("avatar", user1.Avatar) 737 }, 738 }, 739 { 740 name: "trigger when FirstOrCreate", 741 setup: func() { 742 var user User 743 s.Nil(query.FirstOrCreate(&user, User{Name: "event_created_FirstOrCreate_name"})) 744 s.True(user.ID > 0) 745 s.Equal("event_created_FirstOrCreate_name", user.Name) 746 s.Equal("event_created_FirstOrCreate_avatar", user.Avatar) 747 748 var user1 User 749 s.Nil(query.Find(&user1, user.ID)) 750 s.Equal("event_created_FirstOrCreate_name", user1.Name) 751 s.Equal("", user1.Avatar) 752 }, 753 }, 754 } 755 for _, test := range tests { 756 s.Run(test.name, func() { 757 test.setup() 758 }) 759 } 760 } 761 } 762 763 func (s *QueryTestSuite) TestEvent_Saving() { 764 for _, query := range s.queries { 765 tests := []struct { 766 name string 767 setup func() 768 }{ 769 { 770 name: "trigger when create", 771 setup: func() { 772 user := User{Name: "event_saving_create_name"} 773 s.Nil(query.Create(&user)) 774 s.Equal("event_saving_create_avatar", user.Avatar) 775 776 var user1 User 777 s.Nil(query.Find(&user1, user.ID)) 778 s.Equal("event_saving_create_name", user1.Name) 779 s.Equal("event_saving_create_avatar", user1.Avatar) 780 }, 781 }, 782 { 783 name: "trigger when FirstOrCreate", 784 setup: func() { 785 var user User 786 s.Nil(query.FirstOrCreate(&user, User{Name: "event_saving_FirstOrCreate_name"})) 787 s.True(user.ID > 0) 788 s.Equal("event_saving_FirstOrCreate_name", user.Name) 789 s.Equal("event_saving_FirstOrCreate_avatar", user.Avatar) 790 791 var user1 User 792 s.Nil(query.Find(&user1, user.ID)) 793 s.Equal("event_saving_FirstOrCreate_name", user1.Name) 794 s.Equal("event_saving_FirstOrCreate_avatar", user1.Avatar) 795 }, 796 }, 797 { 798 name: "trigger when save", 799 setup: func() { 800 user := User{Name: "event_saving_save_name"} 801 s.Nil(query.Save(&user)) 802 s.True(user.ID > 0) 803 s.Equal("event_saving_save_avatar", user.Avatar) 804 805 var user1 User 806 s.Nil(query.Find(&user1, user.ID)) 807 s.Equal("event_saving_save_name", user1.Name) 808 s.Equal("event_saving_save_avatar", user1.Avatar) 809 }, 810 }, 811 { 812 name: "trigger when update by single column", 813 setup: func() { 814 user := User{Name: "event_saving_single_update_name", Avatar: "avatar"} 815 s.Nil(query.Create(&user)) 816 817 res, err := query.Model(&user).Update("avatar", "event_saving_single_update_avatar") 818 s.Nil(err) 819 s.Equal(int64(1), res.RowsAffected) 820 s.Equal("event_saving_single_update_avatar1", user.Avatar) 821 822 var user1 User 823 s.Nil(query.Find(&user1, user.ID)) 824 s.Equal("event_saving_single_update_name", user1.Name) 825 s.Equal("event_saving_single_update_avatar1", user1.Avatar) 826 }, 827 }, 828 } 829 for _, test := range tests { 830 s.Run(test.name, func() { 831 test.setup() 832 }) 833 } 834 } 835 } 836 837 func (s *QueryTestSuite) TestEvent_Saved() { 838 for _, query := range s.queries { 839 tests := []struct { 840 name string 841 setup func() 842 }{ 843 { 844 name: "trigger when create", 845 setup: func() { 846 user := User{Name: "event_saved_create_name", Avatar: "avatar"} 847 s.Nil(query.Create(&user)) 848 s.Equal("event_saved_create_avatar", user.Avatar) 849 850 var user1 User 851 s.Nil(query.Find(&user1, user.ID)) 852 s.Equal("event_saved_create_name", user1.Name) 853 s.Equal("avatar", user1.Avatar) 854 }, 855 }, 856 { 857 name: "trigger when FirstOrCreate", 858 setup: func() { 859 var user User 860 s.Nil(query.FirstOrCreate(&user, User{Name: "event_saved_FirstOrCreate_name"})) 861 s.True(user.ID > 0) 862 s.Equal("event_saved_FirstOrCreate_name", user.Name) 863 s.Equal("event_saved_FirstOrCreate_avatar", user.Avatar) 864 865 var user1 User 866 s.Nil(query.Find(&user1, user.ID)) 867 s.Equal("event_saved_FirstOrCreate_name", user1.Name) 868 s.Equal("", user1.Avatar) 869 }, 870 }, 871 { 872 name: "trigger when save", 873 setup: func() { 874 user := User{Name: "event_saved_save_name", Avatar: "avatar"} 875 s.Nil(query.Save(&user)) 876 s.True(user.ID > 0) 877 s.Equal("event_saved_save_avatar", user.Avatar) 878 879 var user1 User 880 s.Nil(query.Find(&user1, user.ID)) 881 s.Equal("event_saved_save_name", user1.Name) 882 s.Equal("avatar", user1.Avatar) 883 }, 884 }, 885 { 886 name: "trigger when update by map", 887 setup: func() { 888 user := User{Name: "event_saved_map_update_name", Avatar: "avatar"} 889 s.Nil(query.Create(&user)) 890 891 res, err := query.Model(&user).Update(map[string]any{ 892 "avatar": "event_saved_map_update_avatar", 893 }) 894 s.Nil(err) 895 s.Equal(int64(1), res.RowsAffected) 896 s.Equal("event_saved_map_update_avatar", user.Avatar) 897 898 var user1 User 899 s.Nil(query.Find(&user1, user.ID)) 900 s.Equal("event_saved_map_update_name", user1.Name) 901 s.Equal("event_saved_map_update_avatar", user1.Avatar) 902 }, 903 }, 904 } 905 for _, test := range tests { 906 s.Run(test.name, func() { 907 test.setup() 908 }) 909 } 910 } 911 } 912 913 func (s *QueryTestSuite) TestEvent_Updating() { 914 for _, query := range s.queries { 915 tests := []struct { 916 name string 917 setup func() 918 }{ 919 { 920 name: "not trigger when create", 921 setup: func() { 922 user := User{Name: "event_updating_create_name", Avatar: "avatar"} 923 s.Nil(query.Create(&user)) 924 s.True(user.ID > 0) 925 s.Equal("avatar", user.Avatar) 926 }, 927 }, 928 { 929 name: "not trigger when create by save", 930 setup: func() { 931 user := User{Name: "event_updating_save_name", Avatar: "avatar"} 932 s.Nil(query.Save(&user)) 933 s.True(user.ID > 0) 934 s.Equal("avatar", user.Avatar) 935 }, 936 }, 937 { 938 name: "trigger when save", 939 setup: func() { 940 user := User{Name: "event_updating_save_name", Avatar: "avatar"} 941 s.Nil(query.Save(&user)) 942 943 user.Avatar = "event_updating_save_avatar" 944 s.Nil(query.Save(&user)) 945 s.Equal("event_updating_save_avatar1", user.Avatar) 946 947 var user1 User 948 s.Nil(query.Find(&user1, user.ID)) 949 s.Equal("event_updating_save_name", user1.Name) 950 s.Equal("event_updating_save_avatar1", user1.Avatar) 951 }, 952 }, 953 { 954 name: "trigger when update by model", 955 setup: func() { 956 user := User{Name: "event_updating_model_update_name", Avatar: "avatar"} 957 s.Nil(query.Create(&user)) 958 959 res, err := query.Model(&user).Update(User{ 960 Avatar: "event_updating_model_update_avatar", 961 }) 962 s.Nil(err) 963 s.Equal(int64(1), res.RowsAffected) 964 s.Equal("event_updating_model_update_avatar1", user.Avatar) 965 966 var user1 User 967 s.Nil(query.Find(&user1, user.ID)) 968 s.Equal("event_updating_model_update_name", user1.Name) 969 s.Equal("event_updating_model_update_avatar1", user1.Avatar) 970 }, 971 }, 972 } 973 for _, test := range tests { 974 s.Run(test.name, func() { 975 test.setup() 976 }) 977 } 978 } 979 } 980 981 func (s *QueryTestSuite) TestEvent_Updated() { 982 for _, query := range s.queries { 983 tests := []struct { 984 name string 985 setup func() 986 }{ 987 { 988 name: "not trigger when create", 989 setup: func() { 990 user := User{Name: "event_updated_create_name", Avatar: "avatar"} 991 s.Nil(query.Create(&user)) 992 s.True(user.ID > 0) 993 s.Equal("avatar", user.Avatar) 994 }, 995 }, 996 { 997 name: "not trigger when create by save", 998 setup: func() { 999 user := User{Name: "event_updated_save_name", Avatar: "avatar"} 1000 s.Nil(query.Save(&user)) 1001 s.True(user.ID > 0) 1002 s.Equal("avatar", user.Avatar) 1003 }, 1004 }, 1005 { 1006 name: "trigger when save", 1007 setup: func() { 1008 user := User{Name: "event_updated_save_name", Avatar: "avatar"} 1009 s.Nil(query.Save(&user)) 1010 1011 user.Avatar = "event_updated_save_avatar" 1012 s.Nil(query.Save(&user)) 1013 s.Equal("event_updated_save_avatar1", user.Avatar) 1014 1015 var user1 User 1016 s.Nil(query.Find(&user1, user.ID)) 1017 s.Equal("event_updated_save_name", user1.Name) 1018 s.Equal("event_updated_save_avatar", user1.Avatar) 1019 }, 1020 }, 1021 { 1022 name: "trigger when update by model", 1023 setup: func() { 1024 user := User{Name: "event_updated_model_update_name", Avatar: "avatar"} 1025 s.Nil(query.Create(&user)) 1026 1027 res, err := query.Model(&user).Update(User{ 1028 Avatar: "event_updated_model_update_avatar", 1029 }) 1030 s.Nil(err) 1031 s.Equal(int64(1), res.RowsAffected) 1032 s.Equal("event_updated_model_update_avatar", user.Avatar) 1033 1034 var user1 User 1035 s.Nil(query.Find(&user1, user.ID)) 1036 s.Equal("event_updated_model_update_name", user1.Name) 1037 s.Equal("event_updated_model_update_avatar", user1.Avatar) 1038 }, 1039 }, 1040 } 1041 for _, test := range tests { 1042 s.Run(test.name, func() { 1043 test.setup() 1044 }) 1045 } 1046 } 1047 } 1048 1049 func (s *QueryTestSuite) TestEvent_Deleting() { 1050 for _, query := range s.queries { 1051 user := User{Name: "event_deleting_name", Avatar: "event_deleting_avatar"} 1052 s.Nil(query.Create(&user)) 1053 1054 res, err := query.Delete(&user) 1055 s.EqualError(err, "deleting error") 1056 s.Nil(res) 1057 1058 var user1 User 1059 s.Nil(query.Find(&user1, user.ID)) 1060 s.True(user1.ID > 0) 1061 } 1062 } 1063 1064 func (s *QueryTestSuite) TestEvent_Deleted() { 1065 for _, query := range s.queries { 1066 user := User{Name: "event_deleted_name", Avatar: "event_deleted_avatar"} 1067 s.Nil(query.Create(&user)) 1068 1069 res, err := query.Delete(&user) 1070 s.EqualError(err, "deleted error") 1071 s.Nil(res) 1072 1073 var user1 User 1074 s.Nil(query.Find(&user1, user.ID)) 1075 s.True(user1.ID == 0) 1076 } 1077 } 1078 1079 func (s *QueryTestSuite) TestEvent_ForceDeleting() { 1080 for _, query := range s.queries { 1081 user := User{Name: "event_force_deleting_name", Avatar: "event_force_deleting_avatar"} 1082 s.Nil(query.Create(&user)) 1083 1084 res, err := query.ForceDelete(&user) 1085 s.EqualError(err, "force deleting error") 1086 s.Nil(res) 1087 1088 var user1 User 1089 s.Nil(query.Find(&user1, user.ID)) 1090 s.True(user1.ID > 0) 1091 } 1092 } 1093 1094 func (s *QueryTestSuite) TestEvent_ForceDeleted() { 1095 for _, query := range s.queries { 1096 user := User{Name: "event_force_deleted_name", Avatar: "event_force_deleted_avatar"} 1097 s.Nil(query.Create(&user)) 1098 1099 res, err := query.ForceDelete(&user) 1100 s.EqualError(err, "force deleted error") 1101 s.Nil(res) 1102 1103 var user1 User 1104 s.Nil(query.Find(&user1, user.ID)) 1105 s.True(user1.ID == 0) 1106 } 1107 } 1108 1109 func (s *QueryTestSuite) TestEvent_Retrieved() { 1110 for _, query := range s.queries { 1111 tests := []struct { 1112 name string 1113 setup func() 1114 }{ 1115 { 1116 name: "trigger when Find", 1117 setup: func() { 1118 var user1 User 1119 s.Nil(query.Where("name", "event_retrieved_name").Find(&user1)) 1120 s.True(user1.ID > 0) 1121 s.Equal("event_retrieved_name1", user1.Name) 1122 }, 1123 }, 1124 { 1125 name: "trigger when First", 1126 setup: func() { 1127 var user1 User 1128 s.Nil(query.Where("name", "event_retrieved_name").First(&user1)) 1129 s.True(user1.ID > 0) 1130 s.Equal("event_retrieved_name1", user1.Name) 1131 1132 var user2 User 1133 s.Nil(query.Where("name", "event_retrieved_name1").First(&user2)) 1134 s.True(user2.ID == 0) 1135 s.Equal("", user2.Name) 1136 }, 1137 }, 1138 { 1139 name: "trigger when FirstOr", 1140 setup: func() { 1141 var user1 User 1142 s.Nil(query.Where("name", "event_retrieved_name").Find(&user1)) 1143 s.True(user1.ID > 0) 1144 s.Equal("event_retrieved_name1", user1.Name) 1145 }, 1146 }, 1147 { 1148 name: "trigger when FirstOrCreate", 1149 setup: func() { 1150 var user1 User 1151 s.Nil(query.FirstOrCreate(&user1, User{Name: "event_retrieved_name"})) 1152 s.True(user1.ID > 0) 1153 s.Equal("event_retrieved_name1", user1.Name) 1154 }, 1155 }, 1156 { 1157 name: "trigger when FirstOrFail", 1158 setup: func() { 1159 var user1 User 1160 s.Nil(query.Where("name", "event_retrieved_name").FirstOrFail(&user1)) 1161 s.True(user1.ID > 0) 1162 s.Equal("event_retrieved_name1", user1.Name) 1163 }, 1164 }, 1165 { 1166 name: "trigger when FirstOrNew", 1167 setup: func() { 1168 var user1 User 1169 s.Nil(query.FirstOrNew(&user1, User{Name: "event_retrieved_name"})) 1170 s.True(user1.ID > 0) 1171 s.Equal("event_retrieved_name1", user1.Name) 1172 }, 1173 }, 1174 { 1175 name: "trigger when FirstOrFail", 1176 setup: func() { 1177 var user1 User 1178 s.Nil(query.Where("name", "event_retrieved_name").FirstOrFail(&user1)) 1179 s.True(user1.ID > 0) 1180 s.Equal("event_retrieved_name1", user1.Name) 1181 }, 1182 }, 1183 } 1184 for _, test := range tests { 1185 s.Run(test.name, func() { 1186 user := User{Name: "event_retrieved_name"} 1187 s.Nil(query.Create(&user)) 1188 s.True(user.ID > 0) 1189 1190 test.setup() 1191 }) 1192 } 1193 } 1194 } 1195 1196 func (s *QueryTestSuite) TestEvent_IsDirty() { 1197 for _, query := range s.queries { 1198 tests := []struct { 1199 name string 1200 setup func() 1201 }{ 1202 { 1203 name: "create", 1204 setup: func() { 1205 user := User{Name: "event_creating_IsDirty_name", Avatar: "is_dirty_avatar"} 1206 s.Nil(query.Create(&user)) 1207 s.True(user.ID > 0) 1208 s.Equal("event_creating_IsDirty_avatar", user.Avatar) 1209 }, 1210 }, 1211 { 1212 name: "save", 1213 setup: func() { 1214 user := User{Name: "event_saving_IsDirty_name", Avatar: "is_dirty_avatar"} 1215 s.Nil(query.Save(&user)) 1216 s.True(user.ID > 0) 1217 s.Equal("event_saving_IsDirty_avatar", user.Avatar) 1218 }, 1219 }, 1220 { 1221 name: "update by single column", 1222 setup: func() { 1223 user := User{Name: "event_updating_single_update_IsDirty_name", Avatar: "is_dirty_avatar"} 1224 s.Nil(query.Create(&user)) 1225 s.True(user.ID > 0) 1226 1227 res, err := query.Model(&user).Update("name", "event_updating_single_update_IsDirty_name1") 1228 s.Equal(int64(1), res.RowsAffected) 1229 s.Nil(err) 1230 s.Equal("event_updating_single_update_IsDirty_name1", user.Name) 1231 s.Equal("event_updating_single_update_IsDirty_avatar", user.Avatar) 1232 1233 var user1 User 1234 s.Nil(query.Find(&user1, user.ID)) 1235 s.Equal("event_updating_single_update_IsDirty_name1", user.Name) 1236 s.Equal("event_updating_single_update_IsDirty_avatar", user.Avatar) 1237 }, 1238 }, 1239 { 1240 name: "update by map", 1241 setup: func() { 1242 user := User{Name: "event_updating_map_update_IsDirty_name", Avatar: "is_dirty_avatar"} 1243 s.Nil(query.Create(&user)) 1244 s.True(user.ID > 0) 1245 1246 res, err := query.Model(&user).Update(map[string]any{ 1247 "name": "event_updating_map_update_IsDirty_name1", 1248 }) 1249 s.Nil(err) 1250 s.Equal(int64(1), res.RowsAffected) 1251 s.Equal("event_updating_map_update_IsDirty_name1", user.Name) 1252 s.Equal("event_updating_map_update_IsDirty_avatar", user.Avatar) 1253 1254 var user1 User 1255 s.Nil(query.Find(&user1, user.ID)) 1256 s.Equal("event_updating_map_update_IsDirty_name1", user.Name) 1257 s.Equal("event_updating_map_update_IsDirty_avatar", user.Avatar) 1258 }, 1259 }, 1260 { 1261 name: "update by model", 1262 setup: func() { 1263 user := User{Name: "event_updating_model_update_IsDirty_name", Avatar: "is_dirty_avatar"} 1264 s.Nil(query.Create(&user)) 1265 s.True(user.ID > 0) 1266 1267 res, err := query.Model(&user).Update(User{ 1268 Name: "event_updating_model_update_IsDirty_name1", 1269 }) 1270 s.Equal(int64(1), res.RowsAffected) 1271 s.Nil(err) 1272 s.Equal("event_updating_model_update_IsDirty_name1", user.Name) 1273 s.Equal("event_updating_model_update_IsDirty_avatar", user.Avatar) 1274 1275 var user1 User 1276 s.Nil(query.Find(&user1, user.ID)) 1277 s.Equal("event_updating_model_update_IsDirty_name1", user.Name) 1278 s.Equal("event_updating_model_update_IsDirty_avatar", user.Avatar) 1279 }, 1280 }, 1281 } 1282 for _, test := range tests { 1283 s.Run(test.name, func() { 1284 test.setup() 1285 }) 1286 } 1287 } 1288 } 1289 1290 func (s *QueryTestSuite) TestEvent_Context() { 1291 for _, query := range s.queries { 1292 user := User{Name: "event_context"} 1293 s.Nil(query.Create(&user)) 1294 s.Equal("goravel", user.Avatar) 1295 } 1296 } 1297 1298 func (s *QueryTestSuite) TestEvent_Query() { 1299 for _, query := range s.queries { 1300 user := User{Name: "event_query"} 1301 s.Nil(query.Create(&user)) 1302 s.True(user.ID > 0) 1303 s.Equal("event_query", user.Name) 1304 1305 var user1 User 1306 s.Nil(query.Where("name", "event_query1").Find(&user1)) 1307 s.True(user1.ID > 0) 1308 } 1309 } 1310 1311 func (s *QueryTestSuite) TestExec() { 1312 for driver, query := range s.queries { 1313 s.Run(driver.String(), func() { 1314 res, err := query.Exec("INSERT INTO users (name, avatar, created_at, updated_at) VALUES ('exec_user', 'exec_avatar', '2023-03-09 18:56:33', '2023-03-09 18:56:35');") 1315 s.Equal(int64(1), res.RowsAffected) 1316 s.Nil(err) 1317 1318 var user User 1319 err = query.Where("name", "exec_user").First(&user) 1320 s.Nil(err) 1321 s.True(user.ID > 0) 1322 1323 res, err = query.Exec(fmt.Sprintf("UPDATE users set name = 'exec_user1' where id = %d", user.ID)) 1324 s.Equal(int64(1), res.RowsAffected) 1325 s.Nil(err) 1326 1327 res, err = query.Exec(fmt.Sprintf("DELETE FROM users where id = %d", user.ID)) 1328 s.Equal(int64(1), res.RowsAffected) 1329 s.Nil(err) 1330 }) 1331 } 1332 } 1333 1334 func (s *QueryTestSuite) TestFind() { 1335 for _, query := range s.queries { 1336 user := User{Name: "find_user"} 1337 s.Nil(query.Create(&user)) 1338 s.True(user.ID > 0) 1339 1340 var user2 User 1341 s.Nil(query.Find(&user2, user.ID)) 1342 s.True(user2.ID > 0) 1343 1344 var user3 []User 1345 s.Nil(query.Find(&user3, []uint{user.ID})) 1346 s.Equal(1, len(user3)) 1347 1348 var user4 []User 1349 s.Nil(query.Where("id in ?", []uint{user.ID}).Find(&user4)) 1350 s.Equal(1, len(user4)) 1351 } 1352 } 1353 1354 func (s *QueryTestSuite) TestFindOrFail() { 1355 for _, query := range s.queries { 1356 tests := []struct { 1357 name string 1358 setup func() 1359 }{ 1360 { 1361 name: "success", 1362 setup: func() { 1363 user := User{Name: "find_user"} 1364 s.Nil(query.Create(&user)) 1365 s.True(user.ID > 0) 1366 1367 var user2 User 1368 s.Nil(query.FindOrFail(&user2, user.ID)) 1369 s.True(user2.ID > 0) 1370 }, 1371 }, 1372 { 1373 name: "error", 1374 setup: func() { 1375 var user User 1376 s.ErrorIs(query.FindOrFail(&user, 10000), orm.ErrRecordNotFound) 1377 }, 1378 }, 1379 } 1380 for _, test := range tests { 1381 s.Run(test.name, func() { 1382 test.setup() 1383 }) 1384 } 1385 } 1386 } 1387 1388 func (s *QueryTestSuite) TestFirst() { 1389 for driver, query := range s.queries { 1390 user := User{Name: "first_user"} 1391 s.Nil(query.Create(&user)) 1392 s.True(user.ID > 0) 1393 1394 var user1 User 1395 s.Nil(query.Where("name", "first_user").First(&user1)) 1396 s.True(user1.ID > 0) 1397 1398 // refresh connection 1399 s.mockDummyConnection(driver) 1400 1401 people := People{Body: "first_people"} 1402 s.Nil(query.Create(&people)) 1403 s.True(people.ID > 0) 1404 1405 var people1 People 1406 s.Nil(query.Where("id in ?", []uint{people.ID}).First(&people1)) 1407 s.True(people1.ID > 0) 1408 } 1409 } 1410 1411 func (s *QueryTestSuite) TestFirstOr() { 1412 for _, query := range s.queries { 1413 tests := []struct { 1414 name string 1415 setup func() 1416 }{ 1417 { 1418 name: "not found, new one", 1419 setup: func() { 1420 var user User 1421 s.Nil(query.Where("name", "first_or_user").FirstOr(&user, func() error { 1422 user.Name = "goravel" 1423 1424 return nil 1425 })) 1426 s.Equal(uint(0), user.ID) 1427 s.Equal("goravel", user.Name) 1428 1429 }, 1430 }, 1431 { 1432 name: "found", 1433 setup: func() { 1434 user := User{Name: "first_or_name"} 1435 s.Nil(query.Create(&user)) 1436 s.True(user.ID > 0) 1437 1438 var user1 User 1439 s.Nil(query.Where("name", "first_or_name").Find(&user1)) 1440 s.True(user1.ID > 0) 1441 }, 1442 }, 1443 } 1444 for _, test := range tests { 1445 s.Run(test.name, func() { 1446 test.setup() 1447 }) 1448 } 1449 } 1450 } 1451 1452 func (s *QueryTestSuite) TestFirstOrCreate() { 1453 for _, query := range s.queries { 1454 tests := []struct { 1455 name string 1456 setup func() 1457 }{ 1458 { 1459 name: "error when empty conditions", 1460 setup: func() { 1461 var user User 1462 s.EqualError(query.FirstOrCreate(&user), "query condition is require") 1463 s.True(user.ID == 0) 1464 }, 1465 }, 1466 { 1467 name: "success", 1468 setup: func() { 1469 var user User 1470 s.Nil(query.FirstOrCreate(&user, User{Name: "first_or_create_user"})) 1471 s.True(user.ID > 0) 1472 s.Equal("first_or_create_user", user.Name) 1473 1474 var user1 User 1475 s.Nil(query.FirstOrCreate(&user1, User{Name: "first_or_create_user"})) 1476 s.Equal(user.ID, user1.ID) 1477 1478 var user2 User 1479 s.Nil(query.Where("avatar", "first_or_create_avatar").FirstOrCreate(&user2, User{Name: "user"}, User{Avatar: "first_or_create_avatar2"})) 1480 s.True(user2.ID > 0) 1481 s.True(user2.Avatar == "first_or_create_avatar2") 1482 }, 1483 }, 1484 } 1485 for _, test := range tests { 1486 s.Run(test.name, func() { 1487 test.setup() 1488 }) 1489 } 1490 } 1491 } 1492 1493 func (s *QueryTestSuite) TestFirstOrFail() { 1494 for _, query := range s.queries { 1495 tests := []struct { 1496 name string 1497 setup func() 1498 }{ 1499 { 1500 name: "fail", 1501 setup: func() { 1502 var user User 1503 s.Equal(orm.ErrRecordNotFound, query.Where("name", "first_or_fail_user").FirstOrFail(&user)) 1504 s.Equal(uint(0), user.ID) 1505 }, 1506 }, 1507 { 1508 name: "success", 1509 setup: func() { 1510 user := User{Name: "first_or_fail_name"} 1511 s.Nil(query.Create(&user)) 1512 s.True(user.ID > 0) 1513 s.Equal("first_or_fail_name", user.Name) 1514 1515 var user1 User 1516 s.Nil(query.Where("name", "first_or_fail_name").FirstOrFail(&user1)) 1517 s.True(user1.ID > 0) 1518 }, 1519 }, 1520 } 1521 for _, test := range tests { 1522 s.Run(test.name, func() { 1523 test.setup() 1524 }) 1525 } 1526 } 1527 } 1528 1529 func (s *QueryTestSuite) TestFirstOrNew() { 1530 for _, query := range s.queries { 1531 tests := []struct { 1532 name string 1533 setup func() 1534 }{ 1535 { 1536 name: "not found, new one", 1537 setup: func() { 1538 var user User 1539 s.Nil(query.FirstOrNew(&user, User{Name: "first_or_new_name"})) 1540 s.Equal(uint(0), user.ID) 1541 s.Equal("first_or_new_name", user.Name) 1542 s.Equal("", user.Avatar) 1543 1544 var user1 User 1545 s.Nil(query.FirstOrNew(&user1, User{Name: "first_or_new_name"}, User{Avatar: "first_or_new_avatar"})) 1546 s.Equal(uint(0), user1.ID) 1547 s.Equal("first_or_new_name", user1.Name) 1548 s.Equal("first_or_new_avatar", user1.Avatar) 1549 }, 1550 }, 1551 { 1552 name: "found", 1553 setup: func() { 1554 user := User{Name: "first_or_new_name"} 1555 s.Nil(query.Create(&user)) 1556 s.True(user.ID > 0) 1557 s.Equal("first_or_new_name", user.Name) 1558 1559 var user1 User 1560 s.Nil(query.FirstOrNew(&user1, User{Name: "first_or_new_name"})) 1561 s.True(user1.ID > 0) 1562 s.Equal("first_or_new_name", user1.Name) 1563 }, 1564 }, 1565 } 1566 for _, test := range tests { 1567 s.Run(test.name, func() { 1568 test.setup() 1569 }) 1570 } 1571 } 1572 } 1573 1574 func (s *QueryTestSuite) TestForceDelete() { 1575 for _, query := range s.queries { 1576 tests := []struct { 1577 name string 1578 setup func() 1579 }{ 1580 { 1581 name: "success", 1582 setup: func() { 1583 user := User{Name: "force_delete_name"} 1584 s.Nil(query.Create(&user)) 1585 s.True(user.ID > 0) 1586 s.Equal("force_delete_name", user.Name) 1587 1588 res, err := query.Where("name = ?", "force_delete_name").ForceDelete(&User{}) 1589 s.Equal(int64(1), res.RowsAffected) 1590 s.Nil(err) 1591 s.Equal("force_delete_name", user.Name) 1592 1593 var user1 User 1594 s.Nil(query.WithTrashed().Find(&user1, user.ID)) 1595 s.Equal(uint(0), user1.ID) 1596 }, 1597 }, 1598 } 1599 for _, test := range tests { 1600 s.Run(test.name, func() { 1601 test.setup() 1602 }) 1603 } 1604 } 1605 } 1606 1607 func (s *QueryTestSuite) TestGet() { 1608 for driver, query := range s.queries { 1609 s.Run(driver.String(), func() { 1610 user := User{Name: "get_user"} 1611 s.Nil(query.Create(&user)) 1612 s.True(user.ID > 0) 1613 1614 var user1 []User 1615 s.Nil(query.Where("id in ?", []uint{user.ID}).Get(&user1)) 1616 s.Equal(1, len(user1)) 1617 1618 // refresh connection 1619 s.mockDummyConnection(driver) 1620 1621 people := People{Body: "get_people"} 1622 s.Nil(query.Create(&people)) 1623 s.True(people.ID > 0) 1624 1625 var people1 []People 1626 s.Nil(query.Where("id in ?", []uint{people.ID}).Get(&people1)) 1627 s.Equal(1, len(people1)) 1628 1629 var user2 []User 1630 s.Nil(query.Where("id in ?", []uint{user.ID}).Get(&user2)) 1631 s.Equal(1, len(user2)) 1632 }) 1633 break 1634 } 1635 } 1636 1637 func (s *QueryTestSuite) TestJoin() { 1638 for driver, query := range s.queries { 1639 s.Run(driver.String(), func() { 1640 user := User{Name: "join_user", Avatar: "join_avatar"} 1641 s.Nil(query.Create(&user)) 1642 s.True(user.ID > 0) 1643 1644 userAddress := Address{UserID: user.ID, Name: "join_address", Province: "join_province"} 1645 s.Nil(query.Create(&userAddress)) 1646 s.True(userAddress.ID > 0) 1647 1648 type Result struct { 1649 UserName string 1650 UserAddressName string 1651 } 1652 var result []Result 1653 s.Nil(query.Model(&User{}).Where("users.id = ?", user.ID).Join("left join addresses ua on users.id = ua.user_id"). 1654 Select("users.name user_name, ua.name user_address_name").Get(&result)) 1655 s.Equal(1, len(result)) 1656 s.Equal("join_user", result[0].UserName) 1657 s.Equal("join_address", result[0].UserAddressName) 1658 }) 1659 } 1660 } 1661 1662 func (s *QueryTestSuite) TestLockForUpdate() { 1663 for driver, query := range s.queries { 1664 if driver != ormcontract.DriverSqlite { 1665 s.Run(driver.String(), func() { 1666 user := User{Name: "lock_for_update_user"} 1667 s.Nil(query.Create(&user)) 1668 s.True(user.ID > 0) 1669 1670 for i := 0; i < 10; i++ { 1671 go func() { 1672 tx, err := query.Begin() 1673 s.Nil(err) 1674 1675 var user1 User 1676 s.Nil(tx.LockForUpdate().Find(&user1, user.ID)) 1677 s.True(user1.ID > 0) 1678 user1.Name += "1" 1679 s.Nil(tx.Save(&user1)) 1680 1681 s.Nil(tx.Commit()) 1682 }() 1683 } 1684 1685 time.Sleep(2 * time.Second) 1686 1687 var user2 User 1688 s.Nil(query.Find(&user2, user.ID)) 1689 s.Equal("lock_for_update_user1111111111", user2.Name) 1690 }) 1691 } 1692 } 1693 } 1694 1695 func (s *QueryTestSuite) TestOffset() { 1696 for driver, query := range s.queries { 1697 s.Run(driver.String(), func() { 1698 user := User{Name: "offset_user", Avatar: "offset_avatar"} 1699 s.Nil(query.Create(&user)) 1700 s.True(user.ID > 0) 1701 1702 user1 := User{Name: "offset_user", Avatar: "offset_avatar1"} 1703 s.Nil(query.Create(&user1)) 1704 s.True(user1.ID > 0) 1705 1706 var user2 []User 1707 s.Nil(query.Where("name = ?", "offset_user").Offset(1).Limit(1).Get(&user2)) 1708 s.True(len(user2) > 0) 1709 s.True(user2[0].ID > 0) 1710 }) 1711 } 1712 } 1713 1714 func (s *QueryTestSuite) TestOrder() { 1715 for driver, query := range s.queries { 1716 s.Run(driver.String(), func() { 1717 user := User{Name: "order_user", Avatar: "order_avatar"} 1718 s.Nil(query.Create(&user)) 1719 s.True(user.ID > 0) 1720 1721 user1 := User{Name: "order_user", Avatar: "order_avatar1"} 1722 s.Nil(query.Create(&user1)) 1723 s.True(user1.ID > 0) 1724 1725 var user2 []User 1726 s.Nil(query.Where("name = ?", "order_user").Order("id desc").Order("name asc").Get(&user2)) 1727 s.True(len(user2) > 0) 1728 s.True(user2[0].ID > 0) 1729 }) 1730 } 1731 } 1732 1733 func (s *QueryTestSuite) TestPaginate() { 1734 for driver, query := range s.queries { 1735 s.Run(driver.String(), func() { 1736 user := User{Name: "paginate_user", Avatar: "paginate_avatar"} 1737 s.Nil(query.Create(&user)) 1738 s.True(user.ID > 0) 1739 1740 user1 := User{Name: "paginate_user", Avatar: "paginate_avatar1"} 1741 s.Nil(query.Create(&user1)) 1742 s.True(user1.ID > 0) 1743 1744 user2 := User{Name: "paginate_user", Avatar: "paginate_avatar2"} 1745 s.Nil(query.Create(&user2)) 1746 s.True(user2.ID > 0) 1747 1748 user3 := User{Name: "paginate_user", Avatar: "paginate_avatar3"} 1749 s.Nil(query.Create(&user3)) 1750 s.True(user3.ID > 0) 1751 1752 var users []User 1753 s.Nil(query.Where("name = ?", "paginate_user").Paginate(1, 3, &users, nil)) 1754 s.Equal(3, len(users)) 1755 1756 var users1 []User 1757 var total1 int64 1758 s.Nil(query.Where("name = ?", "paginate_user").Paginate(2, 3, &users1, &total1)) 1759 s.Equal(1, len(users1)) 1760 s.Equal(int64(4), total1) 1761 1762 var users2 []User 1763 var total2 int64 1764 s.Nil(query.Model(User{}).Where("name = ?", "paginate_user").Paginate(1, 3, &users2, &total2)) 1765 s.Equal(3, len(users2)) 1766 s.Equal(int64(4), total2) 1767 1768 var users3 []User 1769 var total3 int64 1770 s.Nil(query.Table("users").Where("name = ?", "paginate_user").Paginate(1, 3, &users3, &total3)) 1771 s.Equal(3, len(users3)) 1772 s.Equal(int64(4), total3) 1773 }) 1774 } 1775 } 1776 1777 func (s *QueryTestSuite) TestPluck() { 1778 for driver, query := range s.queries { 1779 s.Run(driver.String(), func() { 1780 user := User{Name: "pluck_user", Avatar: "pluck_avatar"} 1781 s.Nil(query.Create(&user)) 1782 s.True(user.ID > 0) 1783 1784 user1 := User{Name: "pluck_user", Avatar: "pluck_avatar1"} 1785 s.Nil(query.Create(&user1)) 1786 s.True(user1.ID > 0) 1787 1788 var avatars []string 1789 s.Nil(query.Model(&User{}).Where("name = ?", "pluck_user").Pluck("avatar", &avatars)) 1790 s.Equal(2, len(avatars)) 1791 s.Equal("pluck_avatar", avatars[0]) 1792 s.Equal("pluck_avatar1", avatars[1]) 1793 }) 1794 } 1795 } 1796 1797 func (s *QueryTestSuite) TestHasOne() { 1798 for driver, query := range s.queries { 1799 s.Run(driver.String(), func() { 1800 user := &User{ 1801 Name: "has_one_name", 1802 Address: &Address{ 1803 Name: "has_one_address", 1804 }, 1805 } 1806 1807 s.Nil(query.Select(orm.Associations).Create(&user)) 1808 s.True(user.ID > 0) 1809 s.True(user.Address.ID > 0) 1810 1811 var user1 User 1812 s.Nil(query.With("Address").Where("name = ?", "has_one_name").First(&user1)) 1813 s.True(user.ID > 0) 1814 s.True(user.Address.ID > 0) 1815 }) 1816 } 1817 } 1818 1819 func (s *QueryTestSuite) TestHasOneMorph() { 1820 for driver, query := range s.queries { 1821 s.Run(driver.String(), func() { 1822 user := &User{ 1823 Name: "has_one_morph_name", 1824 House: &House{ 1825 Name: "has_one_morph_house", 1826 }, 1827 } 1828 s.Nil(query.Select(orm.Associations).Create(&user)) 1829 s.True(user.ID > 0) 1830 s.True(user.House.ID > 0) 1831 1832 var user1 User 1833 s.Nil(query.With("House").Where("name = ?", "has_one_morph_name").First(&user1)) 1834 s.True(user.ID > 0) 1835 s.True(user.Name == "has_one_morph_name") 1836 s.True(user.House.ID > 0) 1837 s.True(user.House.Name == "has_one_morph_house") 1838 1839 var house House 1840 s.Nil(query.Where("name = ?", "has_one_morph_house").Where("houseable_type = ?", "users").Where("houseable_id = ?", user.ID).First(&house)) 1841 s.True(house.ID > 0) 1842 }) 1843 } 1844 } 1845 1846 func (s *QueryTestSuite) TestHasMany() { 1847 for driver, query := range s.queries { 1848 s.Run(driver.String(), func() { 1849 user := &User{ 1850 Name: "has_many_name", 1851 Books: []*Book{ 1852 {Name: "has_many_book1"}, 1853 {Name: "has_many_book2"}, 1854 }, 1855 } 1856 1857 s.Nil(query.Select(orm.Associations).Create(&user)) 1858 s.True(user.ID > 0) 1859 s.True(user.Books[0].ID > 0) 1860 s.True(user.Books[1].ID > 0) 1861 1862 var user1 User 1863 s.Nil(query.With("Books").Where("name = ?", "has_many_name").First(&user1)) 1864 s.True(user.ID > 0) 1865 s.True(len(user.Books) == 2) 1866 }) 1867 } 1868 } 1869 1870 func (s *QueryTestSuite) TestHasManyMorph() { 1871 for driver, query := range s.queries { 1872 s.Run(driver.String(), func() { 1873 user := &User{ 1874 Name: "has_many_morph_name", 1875 Phones: []*Phone{ 1876 {Name: "has_many_morph_phone1"}, 1877 {Name: "has_many_morph_phone2"}, 1878 }, 1879 } 1880 s.Nil(query.Select(orm.Associations).Create(&user)) 1881 s.True(user.ID > 0) 1882 s.True(user.Phones[0].ID > 0) 1883 s.True(user.Phones[1].ID > 0) 1884 1885 var user1 User 1886 s.Nil(query.With("Phones").Where("name = ?", "has_many_morph_name").First(&user1)) 1887 s.True(user.ID > 0) 1888 s.True(user.Name == "has_many_morph_name") 1889 s.True(len(user.Phones) == 2) 1890 s.True(user.Phones[0].Name == "has_many_morph_phone1") 1891 s.True(user.Phones[1].Name == "has_many_morph_phone2") 1892 1893 var phones []Phone 1894 s.Nil(query.Where("name like ?", "has_many_morph_phone%").Where("phoneable_type = ?", "users").Where("phoneable_id = ?", user.ID).Find(&phones)) 1895 s.True(len(phones) == 2) 1896 }) 1897 } 1898 } 1899 1900 func (s *QueryTestSuite) TestManyToMany() { 1901 for driver, query := range s.queries { 1902 s.Run(driver.String(), func() { 1903 user := &User{ 1904 Name: "many_to_many_name", 1905 Roles: []*Role{ 1906 {Name: "many_to_many_role1"}, 1907 {Name: "many_to_many_role2"}, 1908 }, 1909 } 1910 1911 s.Nil(query.Select(orm.Associations).Create(&user)) 1912 s.True(user.ID > 0) 1913 s.True(user.Roles[0].ID > 0) 1914 s.True(user.Roles[1].ID > 0) 1915 1916 var user1 User 1917 s.Nil(query.With("Roles").Where("name = ?", "many_to_many_name").First(&user1)) 1918 s.True(user.ID > 0) 1919 s.True(len(user.Roles) == 2) 1920 1921 var role Role 1922 s.Nil(query.With("Users").Where("name = ?", "many_to_many_role1").First(&role)) 1923 s.True(role.ID > 0) 1924 s.True(len(role.Users) == 1) 1925 s.Equal("many_to_many_name", role.Users[0].Name) 1926 }) 1927 } 1928 } 1929 1930 func (s *QueryTestSuite) TestLimit() { 1931 for driver, query := range s.queries { 1932 s.Run(driver.String(), func() { 1933 user := User{Name: "limit_user", Avatar: "limit_avatar"} 1934 s.Nil(query.Create(&user)) 1935 s.True(user.ID > 0) 1936 1937 user1 := User{Name: "limit_user", Avatar: "limit_avatar1"} 1938 s.Nil(query.Create(&user1)) 1939 s.True(user1.ID > 0) 1940 1941 var user2 []User 1942 s.Nil(query.Where("name = ?", "limit_user").Limit(1).Get(&user2)) 1943 s.True(len(user2) > 0) 1944 s.True(user2[0].ID > 0) 1945 }) 1946 } 1947 } 1948 1949 func (s *QueryTestSuite) TestLoad() { 1950 for _, query := range s.queries { 1951 user := User{Name: "load_user", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 1952 user.Address.Name = "load_address" 1953 user.Books[0].Name = "load_book0" 1954 user.Books[1].Name = "load_book1" 1955 s.Nil(query.Select(orm.Associations).Create(&user)) 1956 s.True(user.ID > 0) 1957 s.True(user.Address.ID > 0) 1958 s.True(user.Books[0].ID > 0) 1959 s.True(user.Books[1].ID > 0) 1960 1961 tests := []struct { 1962 description string 1963 setup func(description string) 1964 }{ 1965 { 1966 description: "simple load relationship", 1967 setup: func(description string) { 1968 var user1 User 1969 s.Nil(query.Find(&user1, user.ID)) 1970 s.True(user1.ID > 0) 1971 s.Nil(user1.Address) 1972 s.True(len(user1.Books) == 0) 1973 s.Nil(query.Load(&user1, "Address")) 1974 s.True(user1.Address.ID > 0) 1975 s.True(len(user1.Books) == 0) 1976 s.Nil(query.Load(&user1, "Books")) 1977 s.True(user1.Address.ID > 0) 1978 s.True(len(user1.Books) == 2) 1979 }, 1980 }, 1981 { 1982 description: "load relationship with simple condition", 1983 setup: func(description string) { 1984 var user1 User 1985 s.Nil(query.Find(&user1, user.ID)) 1986 s.True(user1.ID > 0) 1987 s.Nil(user1.Address) 1988 s.Equal(0, len(user1.Books)) 1989 s.Nil(query.Load(&user1, "Books", "name = ?", "load_book0")) 1990 s.True(user1.ID > 0) 1991 s.Nil(user1.Address) 1992 s.Equal(1, len(user1.Books)) 1993 s.Equal("load_book0", user.Books[0].Name) 1994 }, 1995 }, 1996 { 1997 description: "load relationship with func condition", 1998 setup: func(description string) { 1999 var user1 User 2000 s.Nil(query.Find(&user1, user.ID)) 2001 s.True(user1.ID > 0) 2002 s.Nil(user1.Address) 2003 s.Equal(0, len(user1.Books)) 2004 s.Nil(query.Load(&user1, "Books", func(query ormcontract.Query) ormcontract.Query { 2005 return query.Where("name = ?", "load_book0") 2006 })) 2007 s.True(user1.ID > 0) 2008 s.Nil(user1.Address) 2009 s.Equal(1, len(user1.Books)) 2010 s.Equal("load_book0", user.Books[0].Name) 2011 }, 2012 }, 2013 { 2014 description: "error when relation is empty", 2015 setup: func(description string) { 2016 var user1 User 2017 s.Nil(query.Find(&user1, user.ID)) 2018 s.True(user1.ID > 0) 2019 s.Nil(user1.Address) 2020 s.Equal(0, len(user1.Books)) 2021 s.EqualError(query.Load(&user1, ""), "relation cannot be empty") 2022 }, 2023 }, 2024 { 2025 description: "error when id is nil", 2026 setup: func(description string) { 2027 type UserNoID struct { 2028 Name string 2029 Avatar string 2030 } 2031 var userNoID UserNoID 2032 s.EqualError(query.Load(&userNoID, "Book"), "id cannot be empty") 2033 }, 2034 }, 2035 } 2036 for _, test := range tests { 2037 s.Run(test.description, func() { 2038 test.setup(test.description) 2039 }) 2040 } 2041 } 2042 } 2043 2044 func (s *QueryTestSuite) TestLoadMissing() { 2045 for driver, query := range s.queries { 2046 s.Run(driver.String(), func() { 2047 user := User{Name: "load_missing_user", Address: &Address{}, Books: []*Book{&Book{}, &Book{}}} 2048 user.Address.Name = "load_missing_address" 2049 user.Books[0].Name = "load_missing_book0" 2050 user.Books[1].Name = "load_missing_book1" 2051 s.Nil(query.Select(orm.Associations).Create(&user)) 2052 s.True(user.ID > 0) 2053 s.True(user.Address.ID > 0) 2054 s.True(user.Books[0].ID > 0) 2055 s.True(user.Books[1].ID > 0) 2056 2057 tests := []struct { 2058 description string 2059 setup func(description string) 2060 }{ 2061 { 2062 description: "load when missing", 2063 setup: func(description string) { 2064 var user1 User 2065 s.Nil(query.Find(&user1, user.ID)) 2066 s.True(user1.ID > 0) 2067 s.Nil(user1.Address) 2068 s.True(len(user1.Books) == 0) 2069 s.Nil(query.LoadMissing(&user1, "Address")) 2070 s.True(user1.Address.ID > 0) 2071 s.True(len(user1.Books) == 0) 2072 s.Nil(query.LoadMissing(&user1, "Books")) 2073 s.True(user1.Address.ID > 0) 2074 s.True(len(user1.Books) == 2) 2075 }, 2076 }, 2077 { 2078 description: "don't load when not missing", 2079 setup: func(description string) { 2080 var user1 User 2081 s.Nil(query.With("Books", "name = ?", "load_missing_book0").Find(&user1, user.ID)) 2082 s.True(user1.ID > 0) 2083 s.Nil(user1.Address) 2084 s.True(len(user1.Books) == 1) 2085 s.Nil(query.LoadMissing(&user1, "Address")) 2086 s.True(user1.Address.ID > 0) 2087 s.Nil(query.LoadMissing(&user1, "Books")) 2088 s.True(len(user1.Books) == 1) 2089 }, 2090 }, 2091 } 2092 for _, test := range tests { 2093 test.setup(test.description) 2094 } 2095 }) 2096 } 2097 } 2098 2099 func (s *QueryTestSuite) TestRaw() { 2100 for driver, query := range s.queries { 2101 s.Run(driver.String(), func() { 2102 user := User{Name: "raw_user", Avatar: "raw_avatar"} 2103 s.Nil(query.Create(&user)) 2104 s.True(user.ID > 0) 2105 2106 var user1 User 2107 s.Nil(query.Raw("SELECT id, name FROM users WHERE name = ?", "raw_user").Scan(&user1)) 2108 s.True(user1.ID > 0) 2109 s.Equal("raw_user", user1.Name) 2110 s.Equal("", user1.Avatar) 2111 }) 2112 } 2113 } 2114 2115 func (s *QueryTestSuite) TestReuse() { 2116 for _, query := range s.queries { 2117 users := []User{{Name: "reuse_user", Avatar: "reuse_avatar"}, {Name: "reuse_user1", Avatar: "reuse_avatar1"}} 2118 s.Nil(query.Create(&users)) 2119 s.True(users[0].ID > 0) 2120 s.True(users[1].ID > 0) 2121 2122 q := query.Where("name", "reuse_user") 2123 2124 var users1 User 2125 s.Nil(q.Where("avatar", "reuse_avatar").Find(&users1)) 2126 s.True(users1.ID > 0) 2127 2128 var users2 User 2129 s.Nil(q.Where("avatar", "reuse_avatar1").Find(&users2)) 2130 s.True(users2.ID == 0) 2131 2132 var users3 User 2133 s.Nil(query.Where("avatar", "reuse_avatar1").Find(&users3)) 2134 s.True(users3.ID > 0) 2135 } 2136 } 2137 2138 func (s *QueryTestSuite) TestRefreshConnection() { 2139 tests := []struct { 2140 name string 2141 model any 2142 setup func() 2143 expectConnection string 2144 expectErr string 2145 }{ 2146 { 2147 name: "invalid model", 2148 model: func() any { 2149 var product string 2150 return product 2151 }(), 2152 setup: func() {}, 2153 expectErr: "invalid model", 2154 }, 2155 { 2156 name: "the connection of model is empty", 2157 model: func() any { 2158 var review Review 2159 return review 2160 }(), 2161 setup: func() {}, 2162 expectConnection: "mysql", 2163 }, 2164 { 2165 name: "the connection of model is same as current connection", 2166 model: func() any { 2167 var box Box 2168 return box 2169 }(), 2170 setup: func() {}, 2171 expectConnection: "mysql", 2172 }, 2173 { 2174 name: "connections are different, but drivers are same", 2175 model: func() any { 2176 var people People 2177 return people 2178 }(), 2179 setup: func() { 2180 mockDummyConnection(s.mysqlDocker.MockConfig, s.mysqlDocker1.Port) 2181 }, 2182 expectConnection: "dummy", 2183 }, 2184 { 2185 name: "connections and drivers are different", 2186 model: func() any { 2187 var product Product 2188 return product 2189 }(), 2190 setup: func() { 2191 mockPostgresqlConnection(s.mysqlDocker.MockConfig, s.postgresqlDocker.Port) 2192 }, 2193 expectConnection: "postgresql", 2194 }, 2195 } 2196 2197 for _, test := range tests { 2198 s.Run(test.name, func() { 2199 test.setup() 2200 queryImpl := s.queries[ormcontract.DriverMysql].(*QueryImpl) 2201 query, err := queryImpl.refreshConnection(test.model) 2202 if test.expectErr != "" { 2203 s.EqualError(err, test.expectErr) 2204 } else { 2205 s.Nil(err) 2206 } 2207 if test.expectConnection == "" { 2208 s.Nil(query) 2209 } else { 2210 s.Equal(test.expectConnection, query.connection) 2211 } 2212 }) 2213 } 2214 } 2215 2216 func (s *QueryTestSuite) TestSave() { 2217 for _, query := range s.queries { 2218 tests := []struct { 2219 name string 2220 setup func() 2221 }{ 2222 { 2223 name: "success when create", 2224 setup: func() { 2225 user := User{Name: "save_create_user", Avatar: "save_create_avatar"} 2226 s.Nil(query.Save(&user)) 2227 s.True(user.ID > 0) 2228 2229 var user1 User 2230 s.Nil(query.Find(&user1, user.ID)) 2231 s.Equal("save_create_user", user1.Name) 2232 }, 2233 }, 2234 { 2235 name: "success when update", 2236 setup: func() { 2237 user := User{Name: "save_update_user", Avatar: "save_update_avatar"} 2238 s.Nil(query.Create(&user)) 2239 s.True(user.ID > 0) 2240 2241 user.Name = "save_update_user1" 2242 s.Nil(query.Save(&user)) 2243 2244 var user1 User 2245 s.Nil(query.Find(&user1, user.ID)) 2246 s.Equal("save_update_user1", user1.Name) 2247 }, 2248 }, 2249 } 2250 for _, test := range tests { 2251 s.Run(test.name, func() { 2252 test.setup() 2253 }) 2254 } 2255 } 2256 } 2257 2258 func (s *QueryTestSuite) TestSaveQuietly() { 2259 for _, query := range s.queries { 2260 user := User{Name: "event_save_quietly_name", Avatar: "save_quietly_avatar"} 2261 s.Nil(query.SaveQuietly(&user)) 2262 s.True(user.ID > 0) 2263 s.Equal("event_save_quietly_name", user.Name) 2264 s.Equal("save_quietly_avatar", user.Avatar) 2265 2266 var user1 User 2267 s.Nil(query.Find(&user1, user.ID)) 2268 s.Equal("event_save_quietly_name", user1.Name) 2269 s.Equal("save_quietly_avatar", user1.Avatar) 2270 } 2271 } 2272 2273 func (s *QueryTestSuite) TestScope() { 2274 for driver, query := range s.queries { 2275 s.Run(driver.String(), func() { 2276 users := []User{{Name: "scope_user", Avatar: "scope_avatar"}, {Name: "scope_user1", Avatar: "scope_avatar1"}} 2277 s.Nil(query.Create(&users)) 2278 s.True(users[0].ID > 0) 2279 s.True(users[1].ID > 0) 2280 2281 var users1 []User 2282 s.Nil(query.Scopes(paginator("1", "1")).Find(&users1)) 2283 2284 s.Equal(1, len(users1)) 2285 s.True(users1[0].ID > 0) 2286 }) 2287 } 2288 } 2289 2290 func (s *QueryTestSuite) TestSelect() { 2291 for driver, query := range s.queries { 2292 s.Run(driver.String(), func() { 2293 user := User{Name: "select_user", Avatar: "select_avatar"} 2294 s.Nil(query.Create(&user)) 2295 s.True(user.ID > 0) 2296 2297 user1 := User{Name: "select_user", Avatar: "select_avatar1"} 2298 s.Nil(query.Create(&user1)) 2299 s.True(user1.ID > 0) 2300 2301 user2 := User{Name: "select_user1", Avatar: "select_avatar1"} 2302 s.Nil(query.Create(&user2)) 2303 s.True(user2.ID > 0) 2304 2305 type Result struct { 2306 Name string 2307 Count string 2308 } 2309 var result []Result 2310 s.Nil(query.Model(&User{}).Select("name, count(avatar) as count").Where("id in ?", []uint{user.ID, user1.ID, user2.ID}).Group("name").Get(&result)) 2311 s.Equal(2, len(result)) 2312 s.Equal("select_user", result[0].Name) 2313 s.Equal("2", result[0].Count) 2314 s.Equal("select_user1", result[1].Name) 2315 s.Equal("1", result[1].Count) 2316 2317 var result1 []Result 2318 s.Nil(query.Model(&User{}).Select("name, count(avatar) as count").Group("name").Having("name = ?", "select_user").Get(&result1)) 2319 2320 s.Equal(1, len(result1)) 2321 s.Equal("select_user", result1[0].Name) 2322 s.Equal("2", result1[0].Count) 2323 }) 2324 } 2325 } 2326 2327 func (s *QueryTestSuite) TestSharedLock() { 2328 for driver, query := range s.queries { 2329 if driver != ormcontract.DriverSqlite { 2330 s.Run(driver.String(), func() { 2331 user := User{Name: "shared_lock_user"} 2332 s.Nil(query.Create(&user)) 2333 s.True(user.ID > 0) 2334 2335 tx, err := query.Begin() 2336 s.Nil(err) 2337 var user1 User 2338 s.Nil(tx.SharedLock().Find(&user1, user.ID)) 2339 s.True(user1.ID > 0) 2340 2341 var user2 User 2342 s.Nil(query.SharedLock().Find(&user2, user.ID)) 2343 s.True(user2.ID > 0) 2344 2345 user1.Name += "1" 2346 s.Nil(tx.Save(&user1)) 2347 2348 s.Nil(tx.Commit()) 2349 2350 var user3 User 2351 s.Nil(query.Find(&user3, user.ID)) 2352 s.Equal("shared_lock_user1", user3.Name) 2353 }) 2354 } 2355 } 2356 } 2357 2358 func (s *QueryTestSuite) TestSoftDelete() { 2359 for driver, query := range s.queries { 2360 s.Run(driver.String(), func() { 2361 user := User{Name: "soft_delete_user", Avatar: "soft_delete_avatar"} 2362 s.Nil(query.Create(&user)) 2363 s.True(user.ID > 0) 2364 2365 res, err := query.Where("name = ?", "soft_delete_user").Delete(&User{}) 2366 s.Equal(int64(1), res.RowsAffected) 2367 s.Nil(err) 2368 2369 var user1 User 2370 s.Nil(query.Find(&user1, user.ID)) 2371 s.Equal(uint(0), user1.ID) 2372 2373 var user2 User 2374 s.Nil(query.WithTrashed().Find(&user2, user.ID)) 2375 s.True(user2.ID > 0) 2376 2377 res, err = query.Where("name = ?", "soft_delete_user").ForceDelete(&User{}) 2378 s.Equal(int64(1), res.RowsAffected) 2379 s.Nil(err) 2380 2381 var user3 User 2382 s.Nil(query.WithTrashed().Find(&user3, user.ID)) 2383 s.Equal(uint(0), user3.ID) 2384 }) 2385 } 2386 } 2387 2388 func (s *QueryTestSuite) TestSum() { 2389 for driver, query := range s.queries { 2390 s.Run(driver.String(), func() { 2391 user := User{Name: "count_user", Avatar: "count_avatar"} 2392 s.Nil(query.Create(&user)) 2393 s.True(user.ID > 0) 2394 2395 user1 := User{Name: "count_user", Avatar: "count_avatar1"} 2396 s.Nil(query.Create(&user1)) 2397 s.True(user1.ID > 0) 2398 2399 var value float64 2400 err := query.Table("users").Sum("id", &value) 2401 s.Nil(err) 2402 s.True(value > 0) 2403 }) 2404 } 2405 } 2406 2407 func (s *QueryTestSuite) TestTransactionSuccess() { 2408 for driver, query := range s.queries { 2409 s.Run(driver.String(), func() { 2410 user := User{Name: "transaction_success_user", Avatar: "transaction_success_avatar"} 2411 user1 := User{Name: "transaction_success_user1", Avatar: "transaction_success_avatar1"} 2412 tx, err := query.Begin() 2413 s.Nil(err) 2414 s.Nil(tx.Create(&user)) 2415 s.Nil(tx.Create(&user1)) 2416 s.Nil(tx.Commit()) 2417 2418 var user2, user3 User 2419 s.Nil(query.Find(&user2, user.ID)) 2420 s.Nil(query.Find(&user3, user1.ID)) 2421 }) 2422 } 2423 } 2424 2425 func (s *QueryTestSuite) TestTransactionError() { 2426 for driver, query := range s.queries { 2427 s.Run(driver.String(), func() { 2428 user := User{Name: "transaction_error_user", Avatar: "transaction_error_avatar"} 2429 user1 := User{Name: "transaction_error_user1", Avatar: "transaction_error_avatar1"} 2430 tx, err := query.Begin() 2431 s.Nil(err) 2432 s.Nil(tx.Create(&user)) 2433 s.Nil(tx.Create(&user1)) 2434 s.Nil(tx.Rollback()) 2435 2436 var users []User 2437 s.Nil(query.Where("name = ? or name = ?", "transaction_error_user", "transaction_error_user1").Find(&users)) 2438 s.Equal(0, len(users)) 2439 }) 2440 } 2441 } 2442 2443 func (s *QueryTestSuite) TestUpdate() { 2444 for _, query := range s.queries { 2445 tests := []struct { 2446 name string 2447 setup func() 2448 }{ 2449 { 2450 name: "update single column, success", 2451 setup: func() { 2452 users := []User{{Name: "updates_single_name", Avatar: "updates_single_avatar"}, {Name: "updates_single_name", Avatar: "updates_single_avatar1"}} 2453 s.Nil(query.Create(&users)) 2454 s.True(users[0].ID > 0) 2455 s.True(users[1].ID > 0) 2456 2457 res, err := query.Model(&User{}).Where("name = ?", "updates_single_name").Update("avatar", "update_single_avatar2") 2458 s.Equal(int64(2), res.RowsAffected) 2459 s.Nil(err) 2460 2461 var user2 User 2462 s.Nil(query.Find(&user2, users[0].ID)) 2463 s.Equal("update_single_avatar2", user2.Avatar) 2464 var user3 User 2465 s.Nil(query.Find(&user3, users[1].ID)) 2466 s.Equal("update_single_avatar2", user3.Avatar) 2467 }, 2468 }, 2469 { 2470 name: "update columns by map, success", 2471 setup: func() { 2472 users := []User{{Name: "update_map_name", Avatar: "update_map_avatar"}, {Name: "update_map_name", Avatar: "update_map_avatar1"}} 2473 s.Nil(query.Create(&users)) 2474 s.True(users[0].ID > 0) 2475 s.True(users[1].ID > 0) 2476 2477 res, err := query.Model(&User{}).Where("name = ?", "update_map_name").Update(map[string]any{ 2478 "avatar": "update_map_avatar2", 2479 }) 2480 s.Equal(int64(2), res.RowsAffected) 2481 s.Nil(err) 2482 2483 var user2 User 2484 s.Nil(query.Find(&user2, users[0].ID)) 2485 s.Equal("update_map_avatar2", user2.Avatar) 2486 var user3 User 2487 s.Nil(query.Find(&user3, users[0].ID)) 2488 s.Equal("update_map_avatar2", user3.Avatar) 2489 }, 2490 }, 2491 { 2492 name: "update columns by model, success", 2493 setup: func() { 2494 users := []User{{Name: "update_model_name", Avatar: "update_model_avatar"}, {Name: "update_model_name", Avatar: "update_model_avatar1"}} 2495 s.Nil(query.Create(&users)) 2496 s.True(users[0].ID > 0) 2497 s.True(users[1].ID > 0) 2498 2499 res, err := query.Model(&User{}).Where("name = ?", "update_model_name").Update(User{Avatar: "update_model_avatar2"}) 2500 s.Equal(int64(2), res.RowsAffected) 2501 s.Nil(err) 2502 2503 var user2 User 2504 s.Nil(query.Find(&user2, users[0].ID)) 2505 s.Equal("update_model_avatar2", user2.Avatar) 2506 var user3 User 2507 s.Nil(query.Find(&user3, users[0].ID)) 2508 s.Equal("update_model_avatar2", user3.Avatar) 2509 }, 2510 }, 2511 } 2512 for _, test := range tests { 2513 s.Run(test.name, func() { 2514 test.setup() 2515 }) 2516 } 2517 } 2518 } 2519 2520 func (s *QueryTestSuite) TestUpdateOrCreate() { 2521 for driver, query := range s.queries { 2522 s.Run(driver.String(), func() { 2523 var user User 2524 err := query.UpdateOrCreate(&user, User{Name: "update_or_create_user"}, User{Avatar: "update_or_create_avatar"}) 2525 s.Nil(err) 2526 s.True(user.ID > 0) 2527 2528 var user1 User 2529 err = query.Where("name", "update_or_create_user").Find(&user1) 2530 s.Nil(err) 2531 s.True(user1.ID > 0) 2532 2533 var user2 User 2534 err = query.Where("name", "update_or_create_user").UpdateOrCreate(&user2, User{Name: "update_or_create_user"}, User{Avatar: "update_or_create_avatar1"}) 2535 s.Nil(err) 2536 s.True(user2.ID > 0) 2537 s.Equal("update_or_create_avatar1", user2.Avatar) 2538 2539 var user3 User 2540 err = query.Where("avatar", "update_or_create_avatar1").Find(&user3) 2541 s.Nil(err) 2542 s.True(user3.ID > 0) 2543 2544 var count int64 2545 err = query.Model(User{}).Where("name", "update_or_create_user").Count(&count) 2546 s.Nil(err) 2547 s.Equal(int64(1), count) 2548 }) 2549 } 2550 } 2551 2552 func (s *QueryTestSuite) TestWhere() { 2553 for driver, query := range s.queries { 2554 s.Run(driver.String(), func() { 2555 user := User{Name: "where_user", Avatar: "where_avatar"} 2556 s.Nil(query.Create(&user)) 2557 s.True(user.ID > 0) 2558 2559 user1 := User{Name: "where_user1", Avatar: "where_avatar1"} 2560 s.Nil(query.Create(&user1)) 2561 s.True(user1.ID > 0) 2562 2563 var user2 []User 2564 s.Nil(query.Where("name = ?", "where_user").OrWhere("avatar = ?", "where_avatar1").Find(&user2)) 2565 s.Equal(2, len(user2)) 2566 2567 var user3 User 2568 s.Nil(query.Where("name = 'where_user'").Find(&user3)) 2569 s.True(user3.ID > 0) 2570 2571 var user4 User 2572 s.Nil(query.Where("name", "where_user").Find(&user4)) 2573 s.True(user4.ID > 0) 2574 }) 2575 } 2576 } 2577 2578 func (s *QueryTestSuite) TestWithoutEvents() { 2579 for _, query := range s.queries { 2580 tests := []struct { 2581 name string 2582 setup func() 2583 }{ 2584 { 2585 name: "success", 2586 setup: func() { 2587 user := User{Name: "event_save_without_name", Avatar: "without_events_avatar"} 2588 s.Nil(query.WithoutEvents().Save(&user)) 2589 s.True(user.ID > 0) 2590 s.Equal("without_events_avatar", user.Avatar) 2591 2592 var user1 User 2593 s.Nil(query.Find(&user1, user.ID)) 2594 s.Equal("event_save_without_name", user1.Name) 2595 s.Equal("without_events_avatar", user1.Avatar) 2596 }, 2597 }, 2598 } 2599 for _, test := range tests { 2600 s.Run(test.name, func() { 2601 test.setup() 2602 }) 2603 } 2604 } 2605 } 2606 2607 func (s *QueryTestSuite) TestWith() { 2608 for driver, query := range s.queries { 2609 s.Run(driver.String(), func() { 2610 user := User{Name: "with_user", Address: &Address{ 2611 Name: "with_address", 2612 }, Books: []*Book{{ 2613 Name: "with_book0", 2614 }, { 2615 Name: "with_book1", 2616 }}} 2617 s.Nil(query.Select(orm.Associations).Create(&user)) 2618 s.True(user.ID > 0) 2619 s.True(user.Address.ID > 0) 2620 s.True(user.Books[0].ID > 0) 2621 s.True(user.Books[1].ID > 0) 2622 2623 tests := []struct { 2624 description string 2625 setup func(description string) 2626 }{ 2627 { 2628 description: "simple", 2629 setup: func(description string) { 2630 var user1 User 2631 s.Nil(query.With("Address").With("Books").Find(&user1, user.ID)) 2632 s.True(user1.ID > 0) 2633 s.True(user1.Address.ID > 0) 2634 s.True(user1.Books[0].ID > 0) 2635 s.True(user1.Books[1].ID > 0) 2636 }, 2637 }, 2638 { 2639 description: "with simple conditions", 2640 setup: func(description string) { 2641 var user1 User 2642 s.Nil(query.With("Books", "name = ?", "with_book0").Find(&user1, user.ID)) 2643 s.True(user1.ID > 0) 2644 s.Nil(user1.Address) 2645 s.Equal(1, len(user1.Books)) 2646 s.Equal("with_book0", user1.Books[0].Name) 2647 }, 2648 }, 2649 { 2650 description: "with func conditions", 2651 setup: func(description string) { 2652 var user1 User 2653 s.Nil(query.With("Books", func(query ormcontract.Query) ormcontract.Query { 2654 return query.Where("name = ?", "with_book0") 2655 }).Find(&user1, user.ID)) 2656 s.True(user1.ID > 0) 2657 s.Nil(user1.Address) 2658 s.Equal(1, len(user1.Books)) 2659 s.Equal("with_book0", user1.Books[0].Name) 2660 }, 2661 }, 2662 } 2663 for _, test := range tests { 2664 test.setup(test.description) 2665 } 2666 }) 2667 } 2668 } 2669 2670 func (s *QueryTestSuite) TestWithNesting() { 2671 for driver, query := range s.queries { 2672 s.Run(driver.String(), func() { 2673 user := User{Name: "with_nesting_user", Books: []*Book{{ 2674 Name: "with_nesting_book0", 2675 Author: &Author{Name: "with_nesting_author0"}, 2676 }, { 2677 Name: "with_nesting_book1", 2678 Author: &Author{Name: "with_nesting_author1"}, 2679 }}} 2680 s.Nil(query.Select(orm.Associations).Create(&user)) 2681 s.True(user.ID > 0) 2682 s.True(user.Books[0].ID > 0) 2683 s.True(user.Books[0].Author.ID > 0) 2684 s.True(user.Books[1].ID > 0) 2685 s.True(user.Books[1].Author.ID > 0) 2686 2687 var user1 User 2688 s.Nil(query.With("Books.Author").Find(&user1, user.ID)) 2689 s.True(user1.ID > 0) 2690 s.Equal("with_nesting_user", user1.Name) 2691 s.True(user1.Books[0].ID > 0) 2692 s.Equal("with_nesting_book0", user1.Books[0].Name) 2693 s.True(user1.Books[0].Author.ID > 0) 2694 s.Equal("with_nesting_author0", user1.Books[0].Author.Name) 2695 s.True(user1.Books[1].ID > 0) 2696 s.Equal("with_nesting_book1", user1.Books[1].Name) 2697 s.True(user1.Books[1].Author.ID > 0) 2698 s.Equal("with_nesting_author1", user1.Books[1].Author.Name) 2699 }) 2700 } 2701 } 2702 2703 func (s *QueryTestSuite) mockDummyConnection(driver ormcontract.Driver) { 2704 switch driver { 2705 case ormcontract.DriverMysql: 2706 mockDummyConnection(s.mysqlDocker.MockConfig, s.mysqlDocker1.Port) 2707 case ormcontract.DriverPostgresql: 2708 mockDummyConnection(s.postgresqlDocker.MockConfig, s.mysqlDocker1.Port) 2709 case ormcontract.DriverSqlite: 2710 mockDummyConnection(s.sqliteDocker.MockConfig, s.mysqlDocker1.Port) 2711 case ormcontract.DriverSqlserver: 2712 mockDummyConnection(s.sqlserverDocker.MockConfig, s.mysqlDocker1.Port) 2713 } 2714 } 2715 2716 func TestCustomConnection(t *testing.T) { 2717 if testing.Short() { 2718 t.Skip("Skipping tests of using docker") 2719 } 2720 2721 mysqlDocker := NewMysqlDocker() 2722 mysqlPool, mysqlResource, query, err := mysqlDocker.New() 2723 if err != nil { 2724 log.Fatalf("Init mysql error: %s", err) 2725 } 2726 postgresqlDocker := NewPostgresqlDocker() 2727 postgresqlPool, postgresqlResource, _, err := postgresqlDocker.New() 2728 if err != nil { 2729 log.Fatalf("Init mysql error: %s", err) 2730 } 2731 2732 review := Review{Body: "create_review"} 2733 assert.Nil(t, query.Create(&review)) 2734 assert.True(t, review.ID > 0) 2735 2736 var review1 Review 2737 assert.Nil(t, query.Where("body", "create_review").First(&review1)) 2738 assert.True(t, review1.ID > 0) 2739 2740 mockPostgresqlConnection(mysqlDocker.MockConfig, postgresqlDocker.Port) 2741 2742 product := Product{Name: "create_product"} 2743 assert.Nil(t, query.Create(&product)) 2744 assert.True(t, product.ID > 0) 2745 2746 var product1 Product 2747 assert.Nil(t, query.Where("name", "create_product").First(&product1)) 2748 assert.True(t, product1.ID > 0) 2749 2750 var product2 Product 2751 assert.Nil(t, query.Where("name", "create_product1").First(&product2)) 2752 assert.True(t, product2.ID == 0) 2753 2754 mockDummyConnection(mysqlDocker.MockConfig, mysqlDocker.Port) 2755 2756 person := Person{Name: "create_person"} 2757 assert.NotNil(t, query.Create(&person)) 2758 assert.True(t, person.ID == 0) 2759 2760 assert.Nil(t, mysqlPool.Purge(mysqlResource)) 2761 assert.Nil(t, postgresqlPool.Purge(postgresqlResource)) 2762 } 2763 2764 func TestFilterFindConditions(t *testing.T) { 2765 tests := []struct { 2766 name string 2767 conditions []any 2768 expectErr error 2769 }{ 2770 { 2771 name: "condition is empty", 2772 }, 2773 { 2774 name: "condition is empty string", 2775 conditions: []any{""}, 2776 expectErr: ErrorMissingWhereClause, 2777 }, 2778 { 2779 name: "condition is empty slice", 2780 conditions: []any{[]string{}}, 2781 expectErr: ErrorMissingWhereClause, 2782 }, 2783 { 2784 name: "condition has value", 2785 conditions: []any{"name = ?", "test"}, 2786 }, 2787 } 2788 2789 for _, test := range tests { 2790 t.Run(test.name, func(t *testing.T) { 2791 err := filterFindConditions(test.conditions...) 2792 if test.expectErr != nil { 2793 assert.Equal(t, err, test.expectErr) 2794 } else { 2795 assert.Nil(t, err) 2796 } 2797 }) 2798 } 2799 } 2800 2801 func TestGetModelConnection(t *testing.T) { 2802 tests := []struct { 2803 name string 2804 model any 2805 expectErr string 2806 expectConnection string 2807 }{ 2808 { 2809 name: "invalid model", 2810 model: func() any { 2811 var product string 2812 return product 2813 }(), 2814 expectErr: "invalid model", 2815 }, 2816 { 2817 name: "not ConnectionModel", 2818 model: func() any { 2819 var phone Phone 2820 return phone 2821 }(), 2822 }, 2823 { 2824 name: "the connection of model is empty", 2825 model: func() any { 2826 var review Review 2827 return review 2828 }(), 2829 }, 2830 { 2831 name: "the connection of model is not empty", 2832 model: func() any { 2833 var product Product 2834 return product 2835 }(), 2836 expectConnection: "postgresql", 2837 }, 2838 { 2839 name: "the connection of model is not empty and model is slice", 2840 model: func() any { 2841 var products []Product 2842 return products 2843 }(), 2844 expectConnection: "postgresql", 2845 }, 2846 } 2847 2848 for _, test := range tests { 2849 t.Run(test.name, func(t *testing.T) { 2850 connection, err := getModelConnection(test.model) 2851 if test.expectErr != "" { 2852 assert.EqualError(t, err, test.expectErr) 2853 } else { 2854 assert.Nil(t, err) 2855 } 2856 assert.Equal(t, test.expectConnection, connection) 2857 }) 2858 } 2859 } 2860 2861 func TestObserver(t *testing.T) { 2862 orm.Observers = append(orm.Observers, orm.Observer{ 2863 Model: User{}, 2864 Observer: &UserObserver{}, 2865 }) 2866 2867 assert.Nil(t, observer(Product{})) 2868 assert.Equal(t, &UserObserver{}, observer(User{})) 2869 } 2870 2871 func TestObserverEvent(t *testing.T) { 2872 assert.EqualError(t, observerEvent(ormcontract.EventRetrieved, &UserObserver{})(nil), "retrieved") 2873 assert.EqualError(t, observerEvent(ormcontract.EventCreating, &UserObserver{})(nil), "creating") 2874 assert.EqualError(t, observerEvent(ormcontract.EventCreated, &UserObserver{})(nil), "created") 2875 assert.EqualError(t, observerEvent(ormcontract.EventUpdating, &UserObserver{})(nil), "updating") 2876 assert.EqualError(t, observerEvent(ormcontract.EventUpdated, &UserObserver{})(nil), "updated") 2877 assert.EqualError(t, observerEvent(ormcontract.EventSaving, &UserObserver{})(nil), "saving") 2878 assert.EqualError(t, observerEvent(ormcontract.EventSaved, &UserObserver{})(nil), "saved") 2879 assert.EqualError(t, observerEvent(ormcontract.EventDeleting, &UserObserver{})(nil), "deleting") 2880 assert.EqualError(t, observerEvent(ormcontract.EventDeleted, &UserObserver{})(nil), "deleted") 2881 assert.EqualError(t, observerEvent(ormcontract.EventForceDeleting, &UserObserver{})(nil), "forceDeleting") 2882 assert.EqualError(t, observerEvent(ormcontract.EventForceDeleted, &UserObserver{})(nil), "forceDeleted") 2883 assert.Nil(t, observerEvent("error", &UserObserver{})) 2884 } 2885 2886 func TestReadWriteSeparate(t *testing.T) { 2887 if testing.Short() { 2888 t.Skip("Skipping tests of using docker") 2889 } 2890 2891 readMysqlDocker := NewMysqlDocker() 2892 readMysqlPool, readMysqlResource, readMysqlQuery, err := readMysqlDocker.New() 2893 if err != nil { 2894 log.Fatalf("Get read mysql error: %s", err) 2895 } 2896 2897 writeMysqlDocker := NewMysqlDocker() 2898 writeMysqlPool, writeMysqlResource, writeMysqlQuery, err := writeMysqlDocker.New() 2899 if err != nil { 2900 log.Fatalf("Get write mysql error: %s", err) 2901 } 2902 2903 writeMysqlDocker.MockReadWrite(readMysqlDocker.Port, writeMysqlDocker.Port) 2904 mysqlQuery, err := writeMysqlDocker.Query(false) 2905 if err != nil { 2906 log.Fatalf("Get mysql gorm error: %s", err) 2907 } 2908 2909 readPostgresqlDocker := NewPostgresqlDocker() 2910 readPostgresqlPool, readPostgresqlResource, readPostgresqlQuery, err := readPostgresqlDocker.New() 2911 if err != nil { 2912 log.Fatalf("Get read postgresql error: %s", err) 2913 } 2914 2915 writePostgresqlDocker := NewPostgresqlDocker() 2916 writePostgresqlPool, writePostgresqlResource, writePostgresqlQuery, err := writePostgresqlDocker.New() 2917 if err != nil { 2918 log.Fatalf("Get write postgresql error: %s", err) 2919 } 2920 2921 writePostgresqlDocker.MockReadWrite(readPostgresqlDocker.Port, writePostgresqlDocker.Port) 2922 postgresqlQuery, err := writePostgresqlDocker.Query(false) 2923 if err != nil { 2924 log.Fatalf("Get postgresql gorm error: %s", err) 2925 } 2926 2927 readSqliteDocker := NewSqliteDocker(dbDatabase) 2928 _, _, readSqliteQuery, err := readSqliteDocker.New() 2929 if err != nil { 2930 log.Fatalf("Get read sqlite error: %s", err) 2931 } 2932 2933 writeSqliteDocker := NewSqliteDocker(dbDatabase1) 2934 _, _, writeSqliteQuery, err := writeSqliteDocker.New() 2935 if err != nil { 2936 log.Fatalf("Get write sqlite error: %s", err) 2937 } 2938 2939 writeSqliteDocker.MockReadWrite() 2940 sqliteDB, err := writeSqliteDocker.Query(false) 2941 if err != nil { 2942 log.Fatalf("Get sqlite gorm error: %s", err) 2943 } 2944 2945 readSqlserverDocker := NewSqlserverDocker() 2946 readSqlserverPool, readSqlserverResource, readSqlserverQuery, err := readSqlserverDocker.New() 2947 if err != nil { 2948 log.Fatalf("Get read sqlserver error: %s", err) 2949 } 2950 2951 writeSqlserverDocker := NewSqlserverDocker() 2952 writeSqlserverPool, writeSqlserverResource, writeSqlserverQuery, err := writeSqlserverDocker.New() 2953 if err != nil { 2954 log.Fatalf("Get write sqlserver error: %s", err) 2955 } 2956 writeSqlserverDocker.MockReadWrite(readSqlserverDocker.Port, writeSqlserverDocker.Port) 2957 sqlserverDB, err := writeSqlserverDocker.Query(false) 2958 if err != nil { 2959 log.Fatalf("Get sqlserver gorm error: %s", err) 2960 } 2961 2962 dbs := map[ormcontract.Driver]map[string]ormcontract.Query{ 2963 ormcontract.DriverMysql: { 2964 "mix": mysqlQuery, 2965 "read": readMysqlQuery, 2966 "write": writeMysqlQuery, 2967 }, 2968 ormcontract.DriverPostgresql: { 2969 "mix": postgresqlQuery, 2970 "read": readPostgresqlQuery, 2971 "write": writePostgresqlQuery, 2972 }, 2973 ormcontract.DriverSqlite: { 2974 "mix": sqliteDB, 2975 "read": readSqliteQuery, 2976 "write": writeSqliteQuery, 2977 }, 2978 ormcontract.DriverSqlserver: { 2979 "mix": sqlserverDB, 2980 "read": readSqlserverQuery, 2981 "write": writeSqlserverQuery, 2982 }, 2983 } 2984 2985 for drive, db := range dbs { 2986 t.Run(drive.String(), func(t *testing.T) { 2987 user := User{Name: "user"} 2988 assert.Nil(t, db["mix"].Create(&user)) 2989 assert.True(t, user.ID > 0) 2990 2991 var user2 User 2992 assert.Nil(t, db["mix"].Find(&user2, user.ID)) 2993 assert.True(t, user2.ID == 0) 2994 2995 var user3 User 2996 assert.Nil(t, db["read"].Find(&user3, user.ID)) 2997 assert.True(t, user3.ID == 0) 2998 2999 var user4 User 3000 assert.Nil(t, db["write"].Find(&user4, user.ID)) 3001 assert.True(t, user4.ID > 0) 3002 }) 3003 } 3004 3005 assert.Nil(t, file.Remove(dbDatabase)) 3006 assert.Nil(t, file.Remove(dbDatabase1)) 3007 3008 if err := readMysqlPool.Purge(readMysqlResource); err != nil { 3009 log.Fatalf("Could not purge resource: %s", err) 3010 } 3011 if err := writeMysqlPool.Purge(writeMysqlResource); err != nil { 3012 log.Fatalf("Could not purge resource: %s", err) 3013 } 3014 if err := readPostgresqlPool.Purge(readPostgresqlResource); err != nil { 3015 log.Fatalf("Could not purge resource: %s", err) 3016 } 3017 if err := writePostgresqlPool.Purge(writePostgresqlResource); err != nil { 3018 log.Fatalf("Could not purge resource: %s", err) 3019 } 3020 if err := readSqlserverPool.Purge(readSqlserverResource); err != nil { 3021 log.Fatalf("Could not purge resource: %s", err) 3022 } 3023 if err := writeSqlserverPool.Purge(writeSqlserverResource); err != nil { 3024 log.Fatalf("Could not purge resource: %s", err) 3025 } 3026 } 3027 3028 func TestTablePrefixAndSingular(t *testing.T) { 3029 if testing.Short() { 3030 t.Skip("Skipping tests of using docker") 3031 } 3032 3033 mysqlDocker := NewMysqlDocker() 3034 mysqlPool, mysqlResource, err := mysqlDocker.Init() 3035 if err != nil { 3036 log.Fatalf("Init mysql docker error: %s", err) 3037 } 3038 mysqlDocker.mockWithPrefixAndSingular() 3039 mysqlQuery, err := mysqlDocker.QueryWithPrefixAndSingular() 3040 if err != nil { 3041 log.Fatalf("Init mysql error: %s", err) 3042 } 3043 3044 postgresqlDocker := NewPostgresqlDocker() 3045 postgresqlPool, postgresqlResource, err := postgresqlDocker.Init() 3046 if err != nil { 3047 log.Fatalf("Init postgresql docker error: %s", err) 3048 } 3049 postgresqlDocker.mockWithPrefixAndSingular() 3050 postgresqlQuery, err := postgresqlDocker.QueryWithPrefixAndSingular() 3051 if err != nil { 3052 log.Fatalf("Init postgresql error: %s", err) 3053 } 3054 3055 sqliteDocker := NewSqliteDocker(dbDatabase) 3056 _, _, err = sqliteDocker.Init() 3057 if err != nil { 3058 log.Fatalf("Init sqlite docker error: %s", err) 3059 } 3060 sqliteDocker.mockWithPrefixAndSingular() 3061 sqliteDB, err := sqliteDocker.QueryWithPrefixAndSingular() 3062 if err != nil { 3063 log.Fatalf("Init sqlite error: %s", err) 3064 } 3065 3066 sqlserverDocker := NewSqlserverDocker() 3067 sqlserverPool, sqlserverResource, err := sqlserverDocker.Init() 3068 if err != nil { 3069 log.Fatalf("Init sqlserver docker error: %s", err) 3070 } 3071 sqlserverDocker.mockWithPrefixAndSingular() 3072 sqlserverDB, err := sqlserverDocker.QueryWithPrefixAndSingular() 3073 if err != nil { 3074 log.Fatalf("Init sqlserver error: %s", err) 3075 } 3076 3077 dbs := map[ormcontract.Driver]ormcontract.Query{ 3078 ormcontract.DriverMysql: mysqlQuery, 3079 ormcontract.DriverPostgresql: postgresqlQuery, 3080 ormcontract.DriverSqlite: sqliteDB, 3081 ormcontract.DriverSqlserver: sqlserverDB, 3082 } 3083 3084 for drive, db := range dbs { 3085 t.Run(drive.String(), func(t *testing.T) { 3086 user := User{Name: "user"} 3087 assert.Nil(t, db.Create(&user)) 3088 assert.True(t, user.ID > 0) 3089 3090 var user1 User 3091 assert.Nil(t, db.Find(&user1, user.ID)) 3092 assert.True(t, user1.ID > 0) 3093 }) 3094 } 3095 3096 assert.Nil(t, file.Remove(dbDatabase)) 3097 3098 if err := mysqlPool.Purge(mysqlResource); err != nil { 3099 log.Fatalf("Could not purge resource: %s", err) 3100 } 3101 if err := postgresqlPool.Purge(postgresqlResource); err != nil { 3102 log.Fatalf("Could not purge resource: %s", err) 3103 } 3104 if err := sqlserverPool.Purge(sqlserverResource); err != nil { 3105 log.Fatalf("Could not purge resource: %s", err) 3106 } 3107 } 3108 3109 func paginator(page string, limit string) func(methods ormcontract.Query) ormcontract.Query { 3110 return func(query ormcontract.Query) ormcontract.Query { 3111 page, _ := strconv.Atoi(page) 3112 limit, _ := strconv.Atoi(limit) 3113 offset := (page - 1) * limit 3114 3115 return query.Offset(offset).Limit(limit) 3116 } 3117 } 3118 3119 func mockDummyConnection(mockConfig *configmocks.Config, port int) { 3120 mockConfig.On("GetString", "database.connections.dummy.prefix").Return("") 3121 mockConfig.On("GetBool", "database.connections.dummy.singular").Return(false) 3122 mockConfig.On("Get", "database.connections.dummy.read").Return(nil) 3123 mockConfig.On("Get", "database.connections.dummy.write").Return(nil) 3124 mockConfig.On("GetString", "database.connections.dummy.host").Return("127.0.0.1") 3125 mockConfig.On("GetString", "database.connections.dummy.username").Return(DbUser) 3126 mockConfig.On("GetString", "database.connections.dummy.password").Return(DbPassword) 3127 mockConfig.On("GetInt", "database.connections.dummy.port").Return(port) 3128 mockConfig.On("GetString", "database.connections.dummy.driver").Return(ormcontract.DriverMysql.String()) 3129 mockConfig.On("GetString", "database.connections.dummy.charset").Return("utf8mb4") 3130 mockConfig.On("GetString", "database.connections.dummy.loc").Return("Local") 3131 mockConfig.On("GetString", "database.connections.dummy.database").Return(dbDatabase) 3132 } 3133 3134 func mockPostgresqlConnection(mockConfig *configmocks.Config, port int) { 3135 mockConfig.On("GetString", "database.connections.postgresql.prefix").Return("") 3136 mockConfig.On("GetBool", "database.connections.postgresql.singular").Return(false) 3137 mockConfig.On("Get", "database.connections.postgresql.read").Return(nil) 3138 mockConfig.On("Get", "database.connections.postgresql.write").Return(nil) 3139 mockConfig.On("GetString", "database.connections.postgresql.host").Return("127.0.0.1") 3140 mockConfig.On("GetString", "database.connections.postgresql.username").Return(DbUser) 3141 mockConfig.On("GetString", "database.connections.postgresql.password").Return(DbPassword) 3142 mockConfig.On("GetInt", "database.connections.postgresql.port").Return(port) 3143 mockConfig.On("GetString", "database.connections.postgresql.driver").Return(ormcontract.DriverPostgresql.String()) 3144 mockConfig.On("GetString", "database.connections.postgresql.sslmode").Return("disable") 3145 mockConfig.On("GetString", "database.connections.postgresql.timezone").Return("UTC") 3146 mockConfig.On("GetString", "database.connections.postgresql.database").Return("postgres") 3147 } 3148 3149 type UserObserver struct{} 3150 3151 func (u *UserObserver) Retrieved(event ormcontract.Event) error { 3152 return errors.New("retrieved") 3153 } 3154 3155 func (u *UserObserver) Creating(event ormcontract.Event) error { 3156 return errors.New("creating") 3157 } 3158 3159 func (u *UserObserver) Created(event ormcontract.Event) error { 3160 return errors.New("created") 3161 } 3162 3163 func (u *UserObserver) Updating(event ormcontract.Event) error { 3164 return errors.New("updating") 3165 } 3166 3167 func (u *UserObserver) Updated(event ormcontract.Event) error { 3168 return errors.New("updated") 3169 } 3170 3171 func (u *UserObserver) Saving(event ormcontract.Event) error { 3172 return errors.New("saving") 3173 } 3174 3175 func (u *UserObserver) Saved(event ormcontract.Event) error { 3176 return errors.New("saved") 3177 } 3178 3179 func (u *UserObserver) Deleting(event ormcontract.Event) error { 3180 return errors.New("deleting") 3181 } 3182 3183 func (u *UserObserver) Deleted(event ormcontract.Event) error { 3184 return errors.New("deleted") 3185 } 3186 3187 func (u *UserObserver) ForceDeleting(event ormcontract.Event) error { 3188 return errors.New("forceDeleting") 3189 } 3190 3191 func (u *UserObserver) ForceDeleted(event ormcontract.Event) error { 3192 return errors.New("forceDeleted") 3193 }