Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[-] Be able to run
tox
locally (#243)
* [-] Add PGUSER env var to testenv in tox - Also, add convenience script to run a PostgreSQL docker container for tox tests * [-] Add help text to postgres scripts * [-] Extend sleep for DB container, clarify postgis help text
- Loading branch information
1 parent
cf5639a
commit 841f148
Showing
3 changed files
with
274 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,118 @@ | ||
# Set a different port than postgres' default (in case the user is already running postgres locally) | ||
export PGPORT=4111 | ||
export PGUSER=postgres | ||
export PGPASSWORD=postgres | ||
export TEST_DB=postgis | ||
#!/usr/bin/env bash | ||
# -*- coding: utf-8 -*- | ||
set -euo pipefail | ||
|
||
# Run the postgis container | ||
docker run --rm --name modelbakery -e POSTGRES_HOST_AUTH_METHOD=trust -p ${PGPORT}:5432 -d postgis/postgis:11-3.0 | ||
### | ||
### Run test suite against PostgreSQL DB with Postgis installed. | ||
### | ||
### This script will attempt to spin up a PostgreSQL Docker container against | ||
### which the tests will be run. It will spin it down once the tests are finished, | ||
### so if you are already running PostgreSQL locally, instead of using this | ||
### script, simply run: | ||
### | ||
### # TEST_DB=postgis PGUSER=postgres python -m pytest | ||
### | ||
### This script uses the `python` on the current `$PATH`, but can be overridden | ||
### by setting the `PYTHON_CLI` environment variable. | ||
### | ||
### Usage: | ||
### | ||
### ./postgis-tests.sh [-h|--help] | ||
### | ||
### Options: | ||
### | ||
### -h, --help print (this) help and exit | ||
### | ||
|
||
# Wait a few seconds so the DB container can start up | ||
echo "Waiting for DB container..." | ||
sleep 4s | ||
function help { | ||
# Print this file's contents, but only the lines that start | ||
# with `###` (documentation lines, above). | ||
sed -rn 's/^### ?//;T;p' "$0" | ||
} | ||
|
||
# Enable all of the extensions needed on the template1 database | ||
docker exec modelbakery /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS citext;\" -U postgres" | ||
docker exec modelbakery /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS hstore;\" -U postgres" | ||
docker exec modelbakery /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS postgis;\" -U postgres" | ||
function HAS { | ||
# Check if the system has a certain program ($1) installed. | ||
# Output is silenced, but the function returns the result of | ||
# the `command` statement. | ||
command -v $1 > /dev/null 2>&1 | ||
return $? | ||
} | ||
|
||
# Script variables | ||
PROJECT_ROOT="$(dirname $(readlink -f "$0"))" # Same level as this file | ||
|
||
# Dependency variables (e.g. PYTHON3_CLI=python3) | ||
PYTHON=${PYTHON_CLI:-python} | ||
|
||
DEPS="$PYTHON" | ||
|
||
# Arg defaults | ||
export PGPORT=${PGPORT:-5432} | ||
export PGUSER=${PGUSER:-postgres} | ||
export PGPASSWORD=${PGPASSWORD:-postgres} | ||
export TEST_DB=${TEST_DB:-postgis} | ||
|
||
# Argument parsing using "getopt" | ||
OPTIONS=h | ||
LONGOPTS=help | ||
|
||
PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@") | ||
PARSE_EXIT=$? | ||
|
||
if [[ $PARSE_EXIT -ne 0 ]]; then | ||
exit $PARSE_EXIT | ||
fi | ||
|
||
eval set -- "$PARSED" | ||
|
||
while true; do | ||
case "$1" in | ||
-h|--help) | ||
help | ||
shift | ||
exit 0 | ||
;; | ||
--) | ||
shift | ||
break | ||
;; | ||
*) | ||
echo "Error. Exiting." | ||
exit 3 | ||
;; | ||
esac | ||
done | ||
|
||
# Grab the remaining positional argument(s) (not needed here) | ||
# if [[ $# -ne 0 ]]; then | ||
# POSITIONAL_1=$1 | ||
# POSITIONAL_1=$2 | ||
# else | ||
# echo "Missing positional args?" | ||
# exit 1 | ||
# fi | ||
|
||
echo "Checking dependencies [$(echo ${DEPS} | sed 's/ /, /g')]..." | ||
for dep in $DEPS; do | ||
MISSING_DEP=false | ||
|
||
if ! HAS $dep; then | ||
echo "You do not have '${dep}' installed, or it is not available on your PATH!" | ||
echo "If '${dep}' is not what it is called on your system, set the ${dep^^}_CLI environment variable." | ||
MISSING_DEP=true | ||
fi | ||
|
||
if [[ $MISSING_DEP = true ]]; then | ||
echo "Missing dependencies." | ||
exit 1 | ||
fi | ||
done | ||
|
||
# Run the postgres container with all extensions installed | ||
$PROJECT_ROOT/postgres-docker --port $PGPORT | ||
|
||
# Run the tests | ||
python -m pytest | ||
$PYTHON -m pytest | ||
|
||
# Spin down the postgis container | ||
docker stop modelbakery | ||
$PROJECT_ROOT/postgres-docker --kill |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
#!/usr/bin/env bash | ||
# -*- coding: utf-8 -*- | ||
set -euo pipefail | ||
|
||
### | ||
### Start a PostgreSQL docker container with the proper extensions installed | ||
### for the full test suite. | ||
### | ||
### To kill an already running container, run the same command again with the | ||
### `--kill` flag. | ||
### | ||
### Usage: | ||
### | ||
### ./postgres-docker [-h|--help] [-p|--port PORT] [-k|--kill] | ||
### | ||
### Options: | ||
### | ||
### -h, --help print (this) help and exit | ||
### | ||
### -p, --port PORT specify the host port to which PostgreSQL will be bound | ||
### (defaults to 5432) | ||
### | ||
### -k, --kill given the container is already running, kill it | ||
### | ||
|
||
function help { | ||
# Print this file's contents, but only the lines that start | ||
# with `###` (documentation lines, above). | ||
sed -rn 's/^### ?//;T;p' "$0" | ||
} | ||
|
||
function HAS { | ||
# Check if the system has a certain program ($1) installed. | ||
# Output is silenced, but the function returns the result of | ||
# the `command` statement. | ||
command -v $1 > /dev/null 2>&1 | ||
return $? | ||
} | ||
|
||
# Script variables | ||
PROJECT_ROOT="$(dirname $(readlink -f "$0"))" # Same level as this file | ||
|
||
# Dependency variables (e.g. PYTHON3_CLI=python3) | ||
DOCKER=${DOCKER_CLI:-docker} | ||
|
||
DEPS="$DOCKER" | ||
|
||
# Arg defaults | ||
KILL=false | ||
CONTAINER_NAME=model-bakery-postgres | ||
PORT=${PGPORT:-5432} | ||
|
||
# Argument parsing using "getopt" | ||
OPTIONS=h,k,p | ||
LONGOPTS=help,kill,port | ||
|
||
PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@") | ||
PARSE_EXIT=$? | ||
|
||
if [[ $PARSE_EXIT -ne 0 ]]; then | ||
exit $PARSE_EXIT | ||
fi | ||
|
||
eval set -- "$PARSED" | ||
|
||
while true; do | ||
case "$1" in | ||
-p|--port) | ||
PGPORT=$2 | ||
shift | ||
;; | ||
-k|--kill) | ||
KILL=true | ||
shift | ||
;; | ||
-h|--help) | ||
help | ||
shift | ||
exit 0 | ||
;; | ||
--) | ||
shift | ||
break | ||
;; | ||
*) | ||
echo "Error. Exiting." | ||
exit 3 | ||
;; | ||
esac | ||
done | ||
|
||
# Grab the remaining positional argument(s) (not needed here) | ||
# if [[ $# -ne 0 ]]; then | ||
# POSITIONAL_1=$1 | ||
# POSITIONAL_1=$2 | ||
# else | ||
# echo "Missing positional args?" | ||
# exit 1 | ||
# fi | ||
|
||
echo "Checking dependencies [$(echo ${DEPS} | sed 's/ /, /g')]..." | ||
for dep in $DEPS; do | ||
MISSING_DEP=false | ||
|
||
if ! HAS $dep; then | ||
echo "You do not have '${dep}' installed, or it is not available on your PATH!" | ||
echo "If '${dep}' is not what it is called on your system, set the ${dep^^}_CLI environment variable." | ||
MISSING_DEP=true | ||
fi | ||
|
||
if [[ $MISSING_DEP = true ]]; then | ||
echo "Missing dependencies." | ||
exit 1 | ||
fi | ||
done | ||
|
||
# Check if already running | ||
if $DOCKER container inspect $CONTAINER_NAME > /dev/null 2>&1; then | ||
RUNNING_ALREADY=true | ||
else | ||
RUNNING_ALREADY=false | ||
fi | ||
|
||
# If stop desired, stop container | ||
if [[ $KILL = true ]]; then | ||
if [[ $RUNNING_ALREADY = true ]]; then | ||
echo "Stopping '${CONTAINER_NAME}'..." | ||
$DOCKER stop $CONTAINER_NAME | ||
exit 0 | ||
else | ||
echo "Container '${CONTAINER_NAME}' is not currently running." | ||
exit 1 | ||
fi | ||
fi | ||
|
||
# If running already, do nothing but check port | ||
if [[ $RUNNING_ALREADY = true ]]; then | ||
RUNNING_PORT=$($DOCKER container inspect $CONTAINER_NAME | grep -m 1 -Po "(?<=HostPort\": \")\d+") | ||
|
||
if [[ $RUNNING_PORT -ne $PORT ]]; then | ||
echo "Container '${CONTAINER_NAME}' is already running, but on the wrong port!" | ||
echo "Conainer is using port ${RUNNING_PORT} and the specified port is ${PORT}." | ||
exit 1 | ||
else | ||
echo "Container '${CONTAINER_NAME}' is already running." | ||
exit 0 | ||
fi | ||
fi | ||
|
||
# Start postgres container | ||
echo "Starting '${CONTAINER_NAME}'..." | ||
|
||
$DOCKER run --rm --name ${CONTAINER_NAME} -e POSTGRES_HOST_AUTH_METHOD=trust -p ${PORT}:5432 -d postgis/postgis:11-3.0 | ||
|
||
# Wait a few seconds so the DB container can start up | ||
echo "Waiting for DB container..." | ||
sleep 5s | ||
|
||
# Enable all of the extensions needed on the template1 database | ||
$DOCKER exec $CONTAINER_NAME /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS citext;\" -U postgres" | ||
$DOCKER exec $CONTAINER_NAME /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS hstore;\" -U postgres" | ||
$DOCKER exec $CONTAINER_NAME /bin/bash -c "psql template1 -c \"CREATE EXTENSION IF NOT EXISTS postgis;\" -U postgres" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters