github.com/goravel/framework@v1.13.9/database/console/migrate_fresh_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 TestMigrateFreshCommand(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  			mockContext := &consolemocks.Context{}
    88  			mockArtisan := &consolemocks.Artisan{}
    89  			migrateCommand := NewMigrateCommand(mockConfig)
    90  			assert.Nil(t, migrateCommand.Handle(mockContext))
    91  			mockContext.On("OptionBool", "seed").Return(false).Once()
    92  			migrateFreshCommand := NewMigrateFreshCommand(mockConfig, mockArtisan)
    93  			assert.Nil(t, migrateFreshCommand.Handle(mockContext))
    94  
    95  			var agent Agent
    96  			err := query.Where("name", "goravel").First(&agent)
    97  			assert.Nil(t, err)
    98  			assert.True(t, agent.ID > 0)
    99  
   100  			// Test MigrateFreshCommand with --seed flag and seeders specified
   101  			mockContext = &consolemocks.Context{}
   102  			mockArtisan = &consolemocks.Artisan{}
   103  			mockContext.On("OptionBool", "seed").Return(true).Once()
   104  			mockContext.On("OptionSlice", "seeder").Return([]string{"MockSeeder"}).Once()
   105  			mockArtisan.On("Call", "db:seed --seeder MockSeeder").Return(nil).Once()
   106  			migrateFreshCommand = NewMigrateFreshCommand(mockConfig, mockArtisan)
   107  			assert.Nil(t, migrateFreshCommand.Handle(mockContext))
   108  
   109  			var agent1 Agent
   110  			err = query.Where("name", "goravel").First(&agent1)
   111  			assert.Nil(t, err)
   112  			assert.True(t, agent1.ID > 0)
   113  
   114  			// Test MigrateFreshCommand with --seed flag and no seeders specified
   115  			mockContext = &consolemocks.Context{}
   116  			mockArtisan = &consolemocks.Artisan{}
   117  			mockContext.On("OptionBool", "seed").Return(true).Once()
   118  			mockContext.On("OptionSlice", "seeder").Return([]string{}).Once()
   119  			mockArtisan.On("Call", "db:seed").Return(nil).Once()
   120  			migrateFreshCommand = NewMigrateFreshCommand(mockConfig, mockArtisan)
   121  			assert.Nil(t, migrateFreshCommand.Handle(mockContext))
   122  
   123  			var agent2 Agent
   124  			err = query.Where("name", "goravel").First(&agent2)
   125  			assert.Nil(t, err)
   126  			assert.True(t, agent2.ID > 0)
   127  
   128  			if pool != nil && test.name != "sqlite" {
   129  				assert.Nil(t, pool.Purge(resource))
   130  			}
   131  
   132  			removeMigrations()
   133  		})
   134  	}
   135  }