Cybersecurity-Projects/PROJECTS/beginner/canary-token-generator/backend/internal/testutil/postgres.go

63 lines
1.4 KiB
Go

// ©AngelaMos | 2026
// postgres.go
package testutil
import (
"context"
"database/sql"
"testing"
"time"
_ "github.com/jackc/pgx/v5/stdlib"
"github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
tcpostgres "github.com/testcontainers/testcontainers-go/modules/postgres"
"github.com/testcontainers/testcontainers-go/wait"
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/core"
)
func NewTestDB(t *testing.T) *sql.DB {
t.Helper()
ctx := context.Background()
pgContainer, err := tcpostgres.Run(ctx, "postgres:18-alpine",
tcpostgres.WithDatabase("canary_test"),
tcpostgres.WithUsername("test"),
tcpostgres.WithPassword("test"),
testcontainers.WithWaitStrategy(
wait.ForLog("database system is ready to accept connections").
WithOccurrence(2).
WithStartupTimeout(60*time.Second),
),
)
require.NoError(t, err)
t.Cleanup(func() {
if termErr := pgContainer.Terminate(
context.Background(),
); termErr != nil {
t.Logf("postgres container terminate: %v", termErr)
}
})
connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")
require.NoError(t, err)
db, err := sql.Open("pgx", connStr)
require.NoError(t, err)
t.Cleanup(func() {
if closeErr := db.Close(); closeErr != nil {
t.Logf("db close: %v", closeErr)
}
})
require.NoError(t, db.Ping())
require.NoError(t, core.RunMigrations(db))
return db
}