github.com/goravel/framework@v1.13.9/database/console/migrate_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  	consolemock "github.com/goravel/framework/contracts/console/mocks"
    11  	ormcontract "github.com/goravel/framework/contracts/database/orm"
    12  	"github.com/goravel/framework/database/gorm"
    13  	"github.com/goravel/framework/database/orm"
    14  	"github.com/goravel/framework/support/file"
    15  )
    16  
    17  type Agent struct {
    18  	orm.Model
    19  	Name string
    20  }
    21  
    22  func TestMigrateCommand(t *testing.T) {
    23  	if testing.Short() {
    24  		t.Skip("Skipping tests of using docker")
    25  	}
    26  
    27  	var (
    28  		mockConfig *configmock.Config
    29  		pool       *dockertest.Pool
    30  		resource   *dockertest.Resource
    31  		query      ormcontract.Query
    32  	)
    33  
    34  	beforeEach := func() {
    35  		pool = nil
    36  		mockConfig = &configmock.Config{}
    37  	}
    38  
    39  	tests := []struct {
    40  		name  string
    41  		setup func()
    42  	}{
    43  		{
    44  			name: "mysql",
    45  			setup: func() {
    46  				var err error
    47  				docker := gorm.NewMysqlDocker()
    48  				pool, resource, query, err = docker.New()
    49  				assert.Nil(t, err)
    50  				mockConfig = docker.MockConfig
    51  				createMysqlMigrations()
    52  			},
    53  		},
    54  		{
    55  			name: "postgresql",
    56  			setup: func() {
    57  				var err error
    58  				docker := gorm.NewPostgresqlDocker()
    59  				pool, resource, query, err = docker.New()
    60  				assert.Nil(t, err)
    61  				mockConfig = docker.MockConfig
    62  				createPostgresqlMigrations()
    63  			},
    64  		},
    65  		{
    66  			name: "sqlserver",
    67  			setup: func() {
    68  				var err error
    69  				docker := gorm.NewSqlserverDocker()
    70  				pool, resource, query, err = docker.New()
    71  				assert.Nil(t, err)
    72  				mockConfig = docker.MockConfig
    73  				createSqlserverMigrations()
    74  			},
    75  		},
    76  		{
    77  			name: "sqlite",
    78  			setup: func() {
    79  				var err error
    80  				docker := gorm.NewSqliteDocker("goravel")
    81  				_, _, query, err = docker.New()
    82  				assert.Nil(t, err)
    83  				mockConfig = docker.MockConfig
    84  				createSqliteMigrations()
    85  			},
    86  		},
    87  	}
    88  
    89  	for _, test := range tests {
    90  		t.Run(test.name, func(t *testing.T) {
    91  			beforeEach()
    92  			test.setup()
    93  
    94  			migrateCommand := NewMigrateCommand(mockConfig)
    95  			mockContext := &consolemock.Context{}
    96  			assert.Nil(t, migrateCommand.Handle(mockContext))
    97  
    98  			var agent Agent
    99  			assert.Nil(t, query.Where("name", "goravel").First(&agent))
   100  			assert.True(t, agent.ID > 0)
   101  
   102  			if pool != nil {
   103  				assert.Nil(t, pool.Purge(resource))
   104  			}
   105  
   106  			removeMigrations()
   107  		})
   108  	}
   109  }
   110  
   111  func createMysqlMigrations() {
   112  	_ = file.Create("database/migrations/20230311160527_create_agents_table.up.sql",
   113  		`CREATE TABLE agents (
   114    id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   115    name varchar(255) NOT NULL,
   116    created_at datetime(3) NOT NULL,
   117    updated_at datetime(3) NOT NULL,
   118    PRIMARY KEY (id),
   119    KEY idx_agents_created_at (created_at),
   120    KEY idx_agents_updated_at (updated_at)
   121  ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
   122  INSERT INTO agents (name, created_at, updated_at) VALUES ('goravel', '2023-03-11 16:07:41', '2023-03-11 16:07:45');
   123  `)
   124  	_ = file.Create("database/migrations/20230311160527_create_agents_table.down.sql",
   125  		`DROP TABLE agents;
   126  `)
   127  }
   128  
   129  func createPostgresqlMigrations() {
   130  	_ = file.Create("database/migrations/20230311160527_create_agents_table.up.sql",
   131  		`CREATE TABLE agents (
   132    id SERIAL PRIMARY KEY NOT NULL,
   133    name varchar(255) NOT NULL,
   134    created_at timestamp NOT NULL,
   135    updated_at timestamp NOT NULL
   136  );
   137  INSERT INTO agents (name, created_at, updated_at) VALUES ('goravel', '2023-03-11 16:07:41', '2023-03-11 16:07:45');
   138  `)
   139  	_ = file.Create("database/migrations/20230311160527_create_agents_table.down.sql",
   140  		`DROP TABLE agents;
   141  `)
   142  }
   143  
   144  func createSqlserverMigrations() {
   145  	_ = file.Create("database/migrations/20230311160527_create_agents_table.up.sql",
   146  		`CREATE TABLE agents (
   147    id bigint NOT NULL IDENTITY(1,1),
   148    name varchar(255) NOT NULL,
   149    created_at datetime NOT NULL,
   150    updated_at datetime NOT NULL,
   151    PRIMARY KEY (id)
   152  );
   153  INSERT INTO agents (name, created_at, updated_at) VALUES ('goravel', '2023-03-11 16:07:41', '2023-03-11 16:07:45');
   154  `)
   155  	_ = file.Create("database/migrations/20230311160527_create_agents_table.down.sql",
   156  		`DROP TABLE agents;
   157  `)
   158  }
   159  
   160  func createSqliteMigrations() {
   161  	_ = file.Create("database/migrations/20230311160527_create_agents_table.up.sql",
   162  		`CREATE TABLE agents (
   163    id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
   164    name varchar(255) NOT NULL,
   165    created_at datetime NOT NULL,
   166    updated_at datetime NOT NULL
   167  );
   168  INSERT INTO agents (name, created_at, updated_at) VALUES ('goravel', '2023-03-11 16:07:41', '2023-03-11 16:07:45');
   169  `)
   170  	_ = file.Create("database/migrations/20230311160527_create_agents_table.down.sql",
   171  		`DROP TABLE agents;
   172  `)
   173  }
   174  
   175  func removeMigrations() {
   176  	_ = file.Remove("database")
   177  	_ = file.Remove("goravel")
   178  }