Files
pawsql/internal/postgres/provisioner_integration_test.go
Shaun Campbell 3a631f18f6
All checks were successful
Build and Push Image / docker-build-and-push (push) Successful in 6m12s
Test and Release PawSQL / test (push) Successful in 49s
Test and Release PawSQL / release (push) Successful in 9s
feat: read managed database passwords from secrets
2026-09-16 15:04:37 -04:00

72 lines
1.9 KiB
Go

//go:build integration
package postgres
import (
"context"
"net"
"os"
"path/filepath"
"testing"
"time"
config "cloud.campbellwireless.net/git/barkstack/barkfile-parser/v2"
)
func TestProvisionerCreatesPersistentPostgres18(t *testing.T) {
const (
database = "pawsql_integration_test"
volume = "pawsql-integration-test-data"
secretRef = "integration_postgres_password"
)
secretDirectory := t.TempDir()
if err := os.WriteFile(filepath.Join(secretDirectory, config.DockerSecretName(secretRef)), []byte("integration-test-password"), 0o600); err != nil {
t.Fatal(err)
}
provisioner := NewProvisioner(nil)
provisioner.SecretDirectory = secretDirectory
defer func() {
_, _ = provisioner.run(context.Background(), nil, "container", "rm", "--force", containerName(database))
_, _ = provisioner.run(context.Background(), nil, "volume", "rm", "--force", volume)
}()
cfg := config.Config{Databases: []config.DatabaseConfig{{
Name: database,
Postgres: &config.PostgresConfig{
Image: "postgres:18",
Volume: volume,
PasswordSecret: secretRef,
},
}}}
resolved, err := provisioner.Ensure(context.Background(), cfg)
if err != nil {
t.Fatal(err)
}
address := resolved.Databases[0].Upstream
waitForAddress(t, address)
if err := provisioner.StopDatabase(context.Background(), database); err != nil {
t.Fatal(err)
}
resolved, err = provisioner.Ensure(context.Background(), cfg)
if err != nil {
t.Fatal(err)
}
waitForAddress(t, resolved.Databases[0].Upstream)
}
func waitForAddress(t *testing.T, address string) {
t.Helper()
deadline := time.Now().Add(90 * time.Second)
for {
connection, err := net.DialTimeout("tcp", address, time.Second)
if err == nil {
_ = connection.Close()
return
}
if time.Now().After(deadline) {
t.Fatalf("PostgreSQL at %s did not accept connections: %v", address, err)
}
time.Sleep(250 * time.Millisecond)
}
}