github.com/goravel/framework@v1.13.9/database/console/migrate_refresh_command_test.go (about)

     1  package console
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/ory/dockertest/v3"
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	configmock "github.com/goravel/framework/contracts/config/mocks"
    10  	consolemocks "github.com/goravel/framework/contracts/console/mocks"
    11  	ormcontract "github.com/goravel/framework/contracts/database/orm"
    12  	"github.com/goravel/framework/database/gorm"
    13  )
    14  
    15  func TestMigrateRefreshCommand(t *testing.T) {
    16  	if testing.Short() {
    17  		t.Skip("Skipping tests of using docker")
    18  	}
    19  
    20  	var (
    21  		mockConfig *configmock.Config
    22  		pool       *dockertest.Pool
    23  		resource   *dockertest.Resource
    24  		query      ormcontract.Query
    25  	)
    26  
    27  	beforeEach := func() {
    28  		pool = nil
    29  		mockConfig = &configmock.Config{}
    30  	}
    31  
    32  	tests := []struct {
    33  		name  string
    34  		setup func()
    35  	}{
    36  		{
    37  			name: "mysql",
    38  			setup: func() {
    39  				var err error
    40  				docker := gorm.NewMysqlDocker()
    41  				pool, resource, query, err = docker.New()
    42  				assert.Nil(t, err)
    43  				mockConfig = docker.MockConfig
    44  				createMysqlMigrations()
    45  			},
    46  		},
    47  		{
    48  			name: "postgresql",
    49  			setup: func() {
    50  				var err error
    51  				docker := gorm.NewPostgresqlDocker()
    52  				pool, resource, query, err = docker.New()
    53  				assert.Nil(t, err)
    54  				mockConfig = docker.MockConfig
    55  				createPostgresqlMigrations()
    56  			},
    57  		},
    58  		{
    59  			name: "sqlserver",
    60  			setup: func() {
    61  				var err error
    62  				docker := gorm.NewSqlserverDocker()
    63  				pool, resource, query, err = docker.New()
    64  				assert.Nil(t, err)
    65  				mockConfig = docker.MockConfig
    66  				createSqlserverMigrations()
    67  			},
    68  		},
    69  		{
    70  			name: "sqlite",
    71  			setup: func() {
    72  				var err error
    73  				docker := gorm.NewSqliteDocker("goravel")
    74  				pool, resource, query, err = docker.New()
    75  				assert.Nil(t, err)
    76  				mockConfig = docker.MockConfig
    77  				createSqliteMigrations()
    78  			},
    79  		},
    80  	}
    81  
    82  	for _, test := range tests {
    83  		t.Run(test.name, func(t *testing.T) {
    84  			beforeEach()
    85  			test.setup()
    86  
    87  			mockArtisan := &consolemocks.Artisan{}
    88  			mockContext := &consolemocks.Context{}
    89  			mockContext.On("Option", "step").Return("").Once()
    90  
    91  			migrateCommand := NewMigrateCommand(mockConfig)
    92  			assert.Nil(t, migrateCommand.Handle(mockContext))
    93  
    94  			// Test MigrateRefreshCommand without --seed flag
    95  			mockContext.On("OptionBool", "seed").Return(false).Once()
    96  			migrateRefreshCommand := NewMigrateRefreshCommand(mockConfig, mockArtisan)
    97  			assert.Nil(t, migrateRefreshCommand.Handle(mockContext))
    98  
    99  			var agent Agent
   100  			err := query.Where("name", "goravel").First(&agent)
   101  			assert.Nil(t, err)
   102  			assert.True(t, agent.ID > 0)
   103  
   104  			mockArtisan = &consolemocks.Artisan{}
   105  			mockContext = &consolemocks.Context{}
   106  			mockContext.On("Option", "step").Return("5").Once()
   107  
   108  			migrateCommand = NewMigrateCommand(mockConfig)
   109  			assert.Nil(t, migrateCommand.Handle(mockContext))
   110  
   111  			// Test MigrateRefreshCommand with --seed flag and --seeder specified
   112  			mockContext.On("OptionBool", "seed").Return(true).Once()
   113  			mockContext.On("OptionSlice", "seeder").Return([]string{"UserSeeder"}).Once()
   114  			mockArtisan.On("Call", "db:seed --seeder UserSeeder").Return(nil).Once()
   115  			migrateRefreshCommand = NewMigrateRefreshCommand(mockConfig, mockArtisan)
   116  			assert.Nil(t, migrateRefreshCommand.Handle(mockContext))
   117  
   118  			mockArtisan = &consolemocks.Artisan{}
   119  			mockContext = &consolemocks.Context{}
   120  
   121  			// Test MigrateRefreshCommand with --seed flag and no --seeder specified
   122  			mockContext.On("Option", "step").Return("").Once()
   123  			mockContext.On("OptionBool", "seed").Return(true).Once()
   124  			mockContext.On("OptionSlice", "seeder").Return([]string{}).Once()
   125  			mockArtisan.On("Call", "db:seed").Return(nil).Once()
   126  			migrateRefreshCommand = NewMigrateRefreshCommand(mockConfig, mockArtisan)
   127  			assert.Nil(t, migrateRefreshCommand.Handle(mockContext))
   128  
   129  			var agent1 Agent
   130  			err = query.Where("name", "goravel").First(&agent1)
   131  			assert.Nil(t, err)
   132  			assert.True(t, agent1.ID > 0)
   133  
   134  			if pool != nil && test.name != "sqlite" {
   135  				assert.Nil(t, pool.Purge(resource))
   136  			}
   137  
   138  			mockContext.AssertExpectations(t)
   139  			removeMigrations()
   140  		})
   141  	}
   142  }