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  }