The goal of this project is to make it easy to run tests with InterSystems IRIS Database via Testcontainers.
Read to original Testcontainers documentation: https://golang.testcontainers.org/quickstart/
package tests_test
import (
"context"
"database/sql"
"flag"
"log"
"os"
"testing"
"github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
// Import IRIS SQL driver
_ "github.com/caretdev/go-irisnative"
iriscontainer "github.com/caretdev/testcontainers-iris-go"
)
var connectionString string = "iris://_SYSTEM:SYS@localhost:1972/USER"
var container *iriscontainer.IRISContainer = nil
func TestMain(m *testing.M) {
var (
useContainer bool
containerImage string
)
flag.BoolVar(&useContainer, "container", true, "Use container image.")
flag.StringVar(&containerImage, "container-image", "", "Container image.")
flag.Parse()
var err error
ctx := context.Background()
if useContainer || containerImage != "" {
options := []testcontainers.ContainerCustomizer{
iriscontainer.WithNamespace("TEST"),
iriscontainer.WithUsername("testuser"),
iriscontainer.WithPassword("testpassword"),
}
if containerImage != "" {
container, err = iriscontainer.Run(ctx, containerImage, options...)
} else {
// or use default docker image
container, err = iriscontainer.RunContainer(ctx, options...)
}
if err != nil {
log.Println("Failed to start container:", err)
os.Exit(1)
}
defer container.Terminate(ctx)
connectionString = container.MustConnectionString(ctx)
log.Println("Container started successfully", connectionString)
}
var exitCode int = 0
exitCode = m.Run()
if container != nil {
container.Terminate(ctx)
}
os.Exit(exitCode)
}
func openDbWrapper[T require.TestingT](t T, dsn string) *sql.DB {
db, err := sql.Open(`intersystems`, dsn)
require.NoError(t, err)
require.NoError(t, db.Ping())
return db
}
func closeDbWrapper[T require.TestingT](t T, db *sql.DB) {
if db == nil {
return
}
require.NoError(t, db.Close())
}
func TestOpen(t *testing.T) {
db := openDbWrapper(t, connectionString)
defer closeDbWrapper(t, db)
var (
namespace string
username string
)
res := db.QueryRow(`SELECT $namespace, $username`)
require.NoError(t, res.Scan(&namespace, &username))
require.Equal(t, "TEST", namespace)
require.Equal(t, "testuser", username)
}