127 lines
3.5 KiB
Go
127 lines
3.5 KiB
Go
package examples_test
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"testing"
|
|
|
|
_ "github.com/lib/pq"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/testcontainers/testcontainers-go"
|
|
"github.com/testcontainers/testcontainers-go/modules/postgres"
|
|
)
|
|
|
|
// TestBasicPostgres demonstrates the most basic usage of the PostgreSQL module
|
|
func TestBasicPostgres(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// Start PostgreSQL container with default settings
|
|
pgContainer, err := postgres.Run(ctx, "postgres:16-alpine", postgres.BasicWaitStrategies())
|
|
testcontainers.CleanupContainer(t, pgContainer)
|
|
require.NoError(t, err)
|
|
|
|
// Get connection string
|
|
connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")
|
|
require.NoError(t, err)
|
|
|
|
// Connect to database
|
|
db, err := sql.Open("postgres", connStr)
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
// Verify connection
|
|
err = db.Ping()
|
|
require.NoError(t, err)
|
|
|
|
// Run a simple query
|
|
var result int
|
|
err = db.QueryRow("SELECT 1 + 1").Scan(&result)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, result)
|
|
|
|
t.Log("Successfully connected to PostgreSQL and ran a query")
|
|
}
|
|
|
|
// TestPostgresWithCustomConfig demonstrates using custom database, user, and password
|
|
func TestPostgresWithCustomConfig(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// Start PostgreSQL with custom configuration
|
|
pgContainer, err := postgres.Run(
|
|
ctx,
|
|
"postgres:16-alpine",
|
|
postgres.WithDatabase("testdb"),
|
|
postgres.WithUsername("testuser"),
|
|
postgres.WithPassword("testpass"),
|
|
postgres.BasicWaitStrategies(),
|
|
)
|
|
testcontainers.CleanupContainer(t, pgContainer)
|
|
require.NoError(t, err)
|
|
|
|
// Get connection string
|
|
connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")
|
|
require.NoError(t, err)
|
|
|
|
// Verify the connection string contains our custom values
|
|
require.Contains(t, connStr, "testuser")
|
|
require.Contains(t, connStr, "testpass")
|
|
require.Contains(t, connStr, "testdb")
|
|
|
|
// Connect and verify
|
|
db, err := sql.Open("postgres", connStr)
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
err = db.Ping()
|
|
require.NoError(t, err)
|
|
|
|
t.Log("Successfully connected to PostgreSQL with custom configuration")
|
|
}
|
|
|
|
// TestPostgresWithSchema demonstrates using init scripts to set up a schema
|
|
func TestPostgresWithSchema(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// Note: In a real test, you would create a schema.sql file in testdata/
|
|
// For this example, we'll use WithDatabase and create the table manually
|
|
pgContainer, err := postgres.Run(
|
|
ctx,
|
|
"postgres:16-alpine",
|
|
postgres.WithDatabase("appdb"),
|
|
postgres.BasicWaitStrategies(),
|
|
)
|
|
testcontainers.CleanupContainer(t, pgContainer)
|
|
require.NoError(t, err)
|
|
|
|
connStr, err := pgContainer.ConnectionString(ctx, "sslmode=disable")
|
|
require.NoError(t, err)
|
|
|
|
db, err := sql.Open("postgres", connStr)
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
// Create a simple schema
|
|
_, err = db.Exec(`
|
|
CREATE TABLE users (
|
|
id SERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
email TEXT UNIQUE NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`)
|
|
require.NoError(t, err)
|
|
|
|
// Insert a test record
|
|
_, err = db.Exec(`INSERT INTO users (name, email) VALUES ($1, $2)`, "Alice", "alice@example.com")
|
|
require.NoError(t, err)
|
|
|
|
// Query the record
|
|
var name, email string
|
|
err = db.QueryRow(`SELECT name, email FROM users WHERE email = $1`, "alice@example.com").Scan(&name, &email)
|
|
require.NoError(t, err)
|
|
require.Equal(t, "Alice", name)
|
|
require.Equal(t, "alice@example.com", email)
|
|
|
|
t.Log("Successfully created schema and inserted data")
|
|
}
|