#!/usr/bin/env bash set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${repo_root}" project_name="${MINEROPS_CONTROL_TEST_PROJECT:-minerops-control-test-$$}" compose=(docker compose --project-name "${project_name}" --env-file .env.dev -f compose.dev.yaml) cleanup() { status=$? if (( status != 0 )); then "${compose[@]}" logs --no-color --tail 120 postgres || true fi "${compose[@]}" down --volumes --remove-orphans >/dev/null 2>&1 || true exit "${status}" } trap cleanup EXIT [[ -f .env.dev ]] || { echo "Missing .env.dev" >&2; exit 1; } for source_file in backend/tests/test_agent_auth.py backend/tests/test_miner_control.py backend/tests/test_agent_commands.py backend/tests/test_miner_control_postgres.py backend/tests/test_legacy_control_retirement.py; do permissions="$(stat -c '%a' "${source_file}")" (( (10#${permissions} % 10) & 4 )) || { echo "${source_file} is not readable by the non-root test container" >&2 exit 1 } done for source_directory in agents agents/windows agents/windows/tests; do permissions="$(stat -c '%a' "${source_directory}")" (( (10#${permissions} % 10) & 1 )) || { echo "${source_directory} is not traversable by the non-root test container" >&2 exit 1 } done "${compose[@]}" up --detach postgres for attempt in $(seq 1 60); do "${compose[@]}" exec -T postgres sh -ec \ 'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"' >/dev/null 2>&1 && break (( attempt < 60 )) || { echo "PostgreSQL did not become ready" >&2; exit 1; } sleep 1 done "${compose[@]}" build backend "${compose[@]}" run --rm --no-deps backend alembic upgrade head "${compose[@]}" run --rm --no-deps \ -v "${repo_root}/backend/tests:/app/tests:ro" \ -v "${repo_root}/agents:/agents:ro" \ backend python -m unittest -v \ tests.test_agent_auth \ tests.test_miner_control \ tests.test_agent_commands \ tests.test_legacy_control_retirement \ tests.test_miner_control_postgres echo "Miner Control Foundation focused tests passed."