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  }