bats/pg_upgrade.bats (45 lines of code) (raw):
#!/usr/bin/env bats
##-------
## TESTS
##-------
@test "Migrate PostgreSQL 14 to 16" {
migrate_from_pg_major "14"
}
##-------------
## ENVIRONMENT
##-------------
setup() {
IMAGE_ID=$(docker build -q dockerfiles/postgres)
DATA_ID=$(docker volume create)
}
teardown() {
[[ -n "$ID" ]] && docker logs "$ID"
[[ -n "$ID" ]] && docker rm -f "$ID"
[[ -n "$IMAGE_ID" ]] && docker image rm -f "$IMAGE_ID"
[[ -n "$DATA_ID" ]] && docker volume rm -f "$DATA_ID"
}
##---------
## HELPERS
##---------
migrate_from_pg_major() {
let pg_major=$1
create_db_container "postgres:${pg_major}-alpine"
psql -c "CREATE DATABASE my_database"
psql my_database -c "SELECT 1"
drop_db_container
# Start latest and expect data to be migrated
create_db_container "$IMAGE_ID"
psql my_database -c "SELECT 1"
drop_db_container
}
psql() {
docker exec -i "$ID" psql -U postgres -h 127.0.0.1 "$@"
}
create_db_container() {
ID=$(docker run -v "$DATA_ID:/var/lib/postgresql/data" -e POSTGRES_PASSWORD=password -d "$@")
wait_for 30 psql -c "SELECT 1"
}
drop_db_container() {
docker logs "$ID"
docker stop "$ID"
docker rm "$ID"
ID=""
}
wait_for() {
local TIMEOUT="$1"
shift
for i in $(seq $TIMEOUT); do
"$@" && return 0
sleep 1s
done
return 1
}