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  }