github.com/goravel/framework@v1.13.9/testing/docker/mysql.go (about) 1 package docker 2 3 import ( 4 "fmt" 5 6 "github.com/ory/dockertest/v3" 7 "github.com/spf13/cast" 8 9 contractsconfig "github.com/goravel/framework/contracts/config" 10 "github.com/goravel/framework/contracts/database/orm" 11 "github.com/goravel/framework/contracts/testing" 12 ) 13 14 type Mysql struct { 15 config contractsconfig.Config 16 connection string 17 } 18 19 func NewMysql(config contractsconfig.Config, connection string) *Mysql { 20 return &Mysql{ 21 config: config, 22 connection: connection, 23 } 24 } 25 26 func (receiver *Mysql) Config(resource *dockertest.Resource) testing.Config { 27 return testing.Config{ 28 Host: "127.0.0.1", 29 Port: cast.ToInt(resource.GetPort("3306/tcp")), 30 Database: receiver.config.GetString(fmt.Sprintf("database.connections.%s.database", receiver.connection)), 31 Username: receiver.config.GetString(fmt.Sprintf("database.connections.%s.username", receiver.connection)), 32 Password: receiver.config.GetString(fmt.Sprintf("database.connections.%s.password", receiver.connection)), 33 } 34 } 35 36 func (receiver *Mysql) Clear(pool *dockertest.Pool, resource *dockertest.Resource) error { 37 return pool.Purge(resource) 38 } 39 40 func (receiver *Mysql) Name() orm.Driver { 41 return orm.DriverMysql 42 } 43 44 func (receiver *Mysql) Image() *dockertest.RunOptions { 45 database := receiver.config.GetString(fmt.Sprintf("database.connections.%s.database", receiver.connection)) 46 username := receiver.config.GetString(fmt.Sprintf("database.connections.%s.username", receiver.connection)) 47 password := receiver.config.GetString(fmt.Sprintf("database.connections.%s.password", receiver.connection)) 48 env := []string{ 49 "MYSQL_ROOT_PASSWORD=" + password, 50 "MYSQL_DATABASE=" + database, 51 } 52 if username != "root" { 53 env = append(env, "MYSQL_USER="+username) 54 env = append(env, "MYSQL_PASSWORD="+password) 55 } 56 57 return &dockertest.RunOptions{ 58 Repository: "mysql", 59 Tag: "latest", 60 Env: env, 61 } 62 }