github.com/goravel/framework@v1.13.9/testing/docker/database_test.go (about) 1 package docker 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/mock" 10 "github.com/stretchr/testify/suite" 11 12 configmocks "github.com/goravel/framework/contracts/config/mocks" 13 consolemocks "github.com/goravel/framework/contracts/console/mocks" 14 contractsorm "github.com/goravel/framework/contracts/database/orm" 15 foundationmocks "github.com/goravel/framework/contracts/foundation/mocks" 16 "github.com/goravel/framework/database" 17 gormmocks "github.com/goravel/framework/database/gorm/mocks" 18 ) 19 20 func TestNewDatabase(t *testing.T) { 21 var ( 22 mockApp *foundationmocks.Application 23 mockConfig *configmocks.Config 24 mockGormInitialize *gormmocks.Initialize 25 ) 26 27 beforeEach := func() { 28 mockConfig = configmocks.NewConfig(t) 29 mockApp = foundationmocks.NewApplication(t) 30 mockApp.On("MakeConfig").Return(mockConfig).Once() 31 mockGormInitialize = gormmocks.NewInitialize(t) 32 } 33 34 tests := []struct { 35 name string 36 connection string 37 setup func() 38 wantDatabase func() *Database 39 wantErr error 40 }{ 41 { 42 name: "success when connection is empty", 43 setup: func() { 44 mockConfig.On("GetString", "database.default").Return("mysql").Once() 45 mockConfig.On("GetString", "database.connections.mysql.driver").Return("mysql").Once() 46 }, 47 wantDatabase: func() *Database { 48 return &Database{ 49 app: mockApp, 50 config: mockConfig, 51 connection: "mysql", 52 driver: NewMysql(mockConfig, "mysql"), 53 gormInitialize: mockGormInitialize, 54 } 55 }, 56 }, 57 { 58 name: "success when connection is mysql", 59 connection: "mysql", 60 setup: func() { 61 mockConfig.On("GetString", "database.connections.mysql.driver").Return(contractsorm.DriverMysql.String()).Once() 62 }, 63 wantDatabase: func() *Database { 64 return &Database{ 65 app: mockApp, 66 config: mockConfig, 67 connection: "mysql", 68 driver: NewMysql(mockConfig, "mysql"), 69 gormInitialize: mockGormInitialize, 70 } 71 }, 72 }, 73 { 74 name: "success when connection is postgresql", 75 connection: "postgresql", 76 setup: func() { 77 mockConfig.On("GetString", "database.connections.postgresql.driver").Return(contractsorm.DriverPostgresql.String()).Once() 78 }, 79 wantDatabase: func() *Database { 80 return &Database{ 81 app: mockApp, 82 config: mockConfig, 83 connection: "postgresql", 84 driver: NewPostgresql(mockConfig, "postgresql"), 85 gormInitialize: mockGormInitialize, 86 } 87 }, 88 }, 89 { 90 name: "success when connection is sqlserver", 91 connection: "sqlserver", 92 setup: func() { 93 mockConfig.On("GetString", "database.connections.sqlserver.driver").Return(contractsorm.DriverSqlserver.String()).Once() 94 }, 95 wantDatabase: func() *Database { 96 return &Database{ 97 app: mockApp, 98 config: mockConfig, 99 connection: "sqlserver", 100 driver: NewSqlserver(mockConfig, "sqlserver"), 101 gormInitialize: mockGormInitialize, 102 } 103 }, 104 }, 105 { 106 name: "success when connection is sqlite", 107 connection: "sqlite", 108 setup: func() { 109 mockConfig.On("GetString", "database.connections.sqlite.driver").Return(contractsorm.DriverSqlite.String()).Once() 110 }, 111 wantDatabase: func() *Database { 112 return &Database{ 113 app: mockApp, 114 config: mockConfig, 115 connection: "sqlite", 116 driver: NewSqlite(mockConfig, "sqlite"), 117 gormInitialize: mockGormInitialize, 118 } 119 }, 120 }, 121 { 122 name: "error when connection is not exist", 123 connection: "mysql", 124 setup: func() { 125 mockConfig.On("GetString", "database.connections.mysql.driver").Return("").Once() 126 }, 127 wantErr: fmt.Errorf("not found database connection: %s", "mysql"), 128 }, 129 } 130 131 for _, tt := range tests { 132 t.Run(tt.name, func(t *testing.T) { 133 beforeEach() 134 tt.setup() 135 gotDatabase, err := NewDatabase(mockApp, tt.connection, mockGormInitialize) 136 if tt.wantDatabase != nil { 137 assert.Equal(t, tt.wantDatabase(), gotDatabase) 138 } 139 assert.Equal(t, tt.wantErr, err) 140 }) 141 } 142 } 143 144 type DatabaseTestSuite struct { 145 suite.Suite 146 mockApp *foundationmocks.Application 147 mockArtisan *consolemocks.Artisan 148 mockConfig *configmocks.Config 149 mockGormInitialize *gormmocks.Initialize 150 database *Database 151 } 152 153 func TestDatabaseTestSuite(t *testing.T) { 154 suite.Run(t, new(DatabaseTestSuite)) 155 } 156 157 func (s *DatabaseTestSuite) SetupTest() { 158 s.mockApp = foundationmocks.NewApplication(s.T()) 159 s.mockArtisan = consolemocks.NewArtisan(s.T()) 160 s.mockConfig = configmocks.NewConfig(s.T()) 161 s.mockGormInitialize = gormmocks.NewInitialize(s.T()) 162 s.database = &Database{ 163 app: s.mockApp, 164 config: s.mockConfig, 165 connection: "mysql", 166 driver: NewMysql(s.mockConfig, "mysql"), 167 gormInitialize: s.mockGormInitialize, 168 } 169 } 170 171 func (s *DatabaseTestSuite) TestBuild() { 172 if testing.Short() { 173 s.T().Skip("Skipping tests of using docker") 174 } 175 176 s.mockConfig.On("GetString", "database.connections.mysql.database").Return("goravel").Twice() 177 s.mockConfig.On("GetString", "database.connections.mysql.username").Return("root").Twice() 178 s.mockConfig.On("GetString", "database.connections.mysql.password").Return("123123").Twice() 179 s.mockConfig.On("Add", "database.connections.mysql.host", "127.0.0.1").Once() 180 s.mockConfig.On("Add", "database.connections.mysql.port", mock.Anything).Once() 181 s.mockConfig.On("Add", "database.connections.mysql.database", "goravel").Once() 182 s.mockConfig.On("Add", "database.connections.mysql.username", "root").Once() 183 s.mockConfig.On("Add", "database.connections.mysql.password", "123123").Once() 184 s.mockGormInitialize.On("InitializeQuery", context.Background(), s.mockConfig, s.database.driver.Name().String()).Return(nil, nil).Once() 185 s.mockApp.On("MakeArtisan").Return(s.mockArtisan).Once() 186 s.mockArtisan.On("Call", "migrate").Once() 187 s.mockApp.On("Singleton", database.BindingOrm, mock.Anything).Once() 188 189 s.Nil(s.database.Build()) 190 } 191 192 func (s *DatabaseTestSuite) TestSeed() { 193 mockArtisan := consolemocks.NewArtisan(s.T()) 194 mockArtisan.On("Call", "db:seed").Once() 195 s.mockApp.On("MakeArtisan").Return(mockArtisan).Once() 196 197 s.database.Seed() 198 199 mockArtisan = consolemocks.NewArtisan(s.T()) 200 mockArtisan.On("Call", "db:seed --seeder mock").Once() 201 s.mockApp.On("MakeArtisan").Return(mockArtisan).Once() 202 203 s.database.Seed(&MockSeeder{}) 204 } 205 206 type MockSeeder struct{} 207 208 func (m *MockSeeder) Signature() string { 209 return "mock" 210 } 211 212 func (m *MockSeeder) Run() error { 213 return nil 214 }