feat: add run-compose-tests.sh — one-command compose harness testsuite
Brings up the docker-compose stack (postgres + mocks + prosody), waits for prosody to become healthy, and runs the full pytest suite with all env vars set so tests that need MOCK_URL, PG, BOSH/WS, telnet, etc. are not skipped. Auto-detects if port 5582 is already in use (e.g. kubectl port-forward) and remaps the telnet host port to 5583 via the TELNET_HOST_PORT env var in docker-compose.yml. Usage: ./run-compose-tests.sh # up + test + down ./run-compose-tests.sh --no-down # leave stack running ./run-compose-tests.sh --down # just tear down Part-of: <http://gitlab.vnc.biz/uxf/vnctalk-prosody/-/merge_requests/3>
This commit is contained in:
+1
-1
@@ -46,7 +46,7 @@ services:
|
||||
ports:
|
||||
- "5222:5222" # C2S
|
||||
- "5280:5280" # HTTP (BOSH/WS/REST/admin)
|
||||
- "5582:5582" # admin telnet
|
||||
- "${TELNET_HOST_PORT:-5582}:5582" # admin telnet
|
||||
environment:
|
||||
prosodyDomain: example.com
|
||||
prosodyDBhost: postgres
|
||||
|
||||
Executable
+107
@@ -0,0 +1,107 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# run-compose-tests.sh — bring up the compose test harness and run the full
|
||||
# pytest suite against it with all env vars set so no test is skipped for
|
||||
# missing infrastructure.
|
||||
#
|
||||
# Usage:
|
||||
# ./run-compose-tests.sh # up + test + down
|
||||
# ./run-compose-tests.sh --no-down # up + test (leave stack running)
|
||||
# ./run-compose-tests.sh --down # just tear down
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
TEARDOWN=true
|
||||
if [[ "${1:-}" == "--no-down" ]]; then TEARDOWN=false; fi
|
||||
if [[ "${1:-}" == "--down" ]]; then
|
||||
docker compose down
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 1. Python venv (for host-run pytest)
|
||||
# ---------------------------------------------------------------------------
|
||||
VENV="$REPO_ROOT/tests/venv"
|
||||
if [[ ! -d "$VENV" ]]; then
|
||||
echo ">>> creating python venv"
|
||||
python3 -m venv "$VENV"
|
||||
fi
|
||||
# shellcheck disable=SC1091
|
||||
source "$VENV/bin/activate"
|
||||
pip install -q -r tests/requirements.txt
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 2. Port conflict detection — 5582 is frequently taken by kubectl port-forward
|
||||
# ---------------------------------------------------------------------------
|
||||
export TELNET_HOST_PORT=5582
|
||||
if ss -tlnp 2>/dev/null | grep -q ':5582 ' ; then
|
||||
export TELNET_HOST_PORT=5583
|
||||
echo ">>> port 5582 is in use — remapping telnet to ${TELNET_HOST_PORT}"
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 3. Bring up the stack
|
||||
# ---------------------------------------------------------------------------
|
||||
echo ">>> building + starting compose stack"
|
||||
docker compose down 2>/dev/null || true
|
||||
docker compose up -d --build postgres mocks prosody
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 4. Wait for prosody to be healthy
|
||||
# ---------------------------------------------------------------------------
|
||||
echo ">>> waiting for prosody to become healthy"
|
||||
MAX_WAIT=60
|
||||
for i in $(seq 1 "$MAX_WAIT"); do
|
||||
status=$(docker compose ps --format json prosody 2>/dev/null \
|
||||
| python3 -c "import sys,json; print(json.load(sys.stdin).get('Health',''))" 2>/dev/null || echo "")
|
||||
if [[ "$status" == "healthy" ]]; then
|
||||
echo ">>> prosody is healthy (after ${i}s)"
|
||||
break
|
||||
fi
|
||||
if [[ "$i" -eq "$MAX_WAIT" ]]; then
|
||||
echo ">>> prosody did not become healthy in ${MAX_WAIT}s — showing logs:"
|
||||
docker compose logs --tail=30 prosody
|
||||
exit 1
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 5. Run the full testsuite with all env vars set
|
||||
# ---------------------------------------------------------------------------
|
||||
echo ">>> running testsuite"
|
||||
XMPP_HOST=localhost \
|
||||
XMPP_PORT=5222 \
|
||||
XMPP_DOMAIN=example.com \
|
||||
MUC_DOMAIN=conference.example.com \
|
||||
XMPP_JID=user1@example.com \
|
||||
XMPP_PASSWORD=pass1 \
|
||||
XMPP_JID2=user2@example.com \
|
||||
XMPP_PASSWORD2=pass2 \
|
||||
REST_URL=http://localhost:5280/rest \
|
||||
BOSH_URL=http://localhost:5280/http-bind \
|
||||
WS_URL=ws://localhost:5280/xmpp-websocket \
|
||||
ADMIN_TELNET_HOST=localhost \
|
||||
ADMIN_TELNET_PORT="$TELNET_HOST_PORT" \
|
||||
PG_HOST=localhost \
|
||||
PG_PORT=5434 \
|
||||
PG_DB=prosody \
|
||||
PG_USER=prosody \
|
||||
PG_PASSWORD=prosody \
|
||||
MOCK_URL=http://localhost:8092 \
|
||||
pytest tests/ -v -c tests/pytest.ini
|
||||
|
||||
TEST_RC=$?
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 6. Tear down (unless --no-down)
|
||||
# ---------------------------------------------------------------------------
|
||||
if $TEARDOWN; then
|
||||
echo ">>> tearing down compose stack"
|
||||
docker compose down
|
||||
fi
|
||||
|
||||
exit $TEST_RC
|
||||
Reference in New Issue
Block a user