Home  >  Article  >  Backend Development  >  Using tern migrations in go test container with postgres

Using tern migrations in go test container with postgres

WBOY
WBOYforward
2024-02-06 11:42:04699browse

在带有 postgres 的 go test 容器中使用 tern 迁移

Question content

I'm trying to write an integration test for my Postgres database. To do this, I use a test container in Go. I've used tern migrations in the actual database and placed the migrations in the migrations folder. The problem is that some of my migrations use properties in the .tern.conf file because the values ​​may vary depending on the environment. I created a similar configuration file local.tern.conf for local and tried setting global variables. But for some reason when I run the migration the values ​​are not selected. Here is an example-

func SetupTestDatabase() *TestDatabase {
    // Set the TERN_CONFIG environment variable to the path of your local.tern.conf file
    if err := os.Setenv("TERN_CONFIG", "../local.tern.conf"); err != nil {
        // Handle error if setting the environment variable fails
        zap.S().Fatal("failed to set TERN_CONFIG", err)
    }

    // setup db container
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*60)
    defer cancel()

    container, dbInstance, dbAddr, err := createContainer(ctx)
    if err != nil {
        zap.S().Fatal("failed to setup test", err)
    }

    conn, _ := dbInstance.Acquire(ctx)
    m, err := migrate.NewMigrator(ctx, conn.Conn(), "schema_version_table")
    if err != nil {
        zap.S().Fatal("failed to setup migrator", err)
    }

    if err := m.LoadMigrations("../migrations"); err != nil {
        zap.S().Fatal("failed to load migrations", err)
        return nil
    }

    if len(m.Migrations) == 0 {
        zap.S().Fatal("no migrations found")
        return nil
    }

    if err := m.Migrate(ctx); err != nil {
        zap.S().Fatal("failed to migrate", err)
        return nil
    }

    return &TestDatabase{
        container:  container,
        DbInstance: dbInstance,
        DbAddress:  dbAddr,
    }
}

This is part of my migration -

....
CREATE TABLE {{.version_table}} (
    version integer NOT NULL
);

alter table {{.version_table}}
    owner to {{.master_user}};
.....

This is local.tern.conf-

[database]
 host = <host>
 port = 5432
 database = <db name>
 version_table = schema_version_table

[data]
 master_user = <user>

Correct Answer


I guess the config file must target the random port provided by testcontainers-go, rather than Postgres' default 5432 port. You may need to dynamically generate this file using the container's Host and MappedPort methods, getting the host and random port from testcontainers-go. Please refer to https://golang.testcontainers.org/features/networking /#Get the container host

ip, _ := nginxC.Host(ctx)
port, _ := nginxC.MappedPort(ctx, "80")
_, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))

Can you try it?

Another option is to use "Testcontainers Desktop" which allows defining a port for a given service (postgres) to transparently proxy any requests to that port to a random port. Please refer to https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

The above is the detailed content of Using tern migrations in go test container with postgres. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete