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>
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 //m.sbmmt.com/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!