#!/usr/bin/env bash set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${repo_root}" readonly source_files=( backend/app/frontend/miner_detail_view.py backend/app/frontend/router.py backend/app/frontend/static/app.css backend/app/frontend/static/fleet.js backend/app/frontend/static/miner-detail.js backend/app/frontend/static/repair-center.js backend/app/frontend/views.py backend/app/inventory/repository.py backend/app/inventory/service.py backend/app/locations/models.py backend/app/locations/repository.py backend/app/locations/service.py backend/app/main.py backend/app/miner_detail/__init__.py backend/app/miner_detail/dependencies.py backend/app/miner_detail/models.py backend/app/miner_detail/router.py backend/app/miner_detail/service.py backend/app/repairs/center_repository.py backend/app/repairs/center_service.py backend/tests/test_miner_detail.py ) for file in "${source_files[@]}"; do if [[ ! -r "${file}" ]]; then echo "Miner Detail test input is not readable: ${file}" >&2 exit 1 fi if [[ "$(stat -c '%a' "${file}")" != "644" ]]; then echo "Miner Detail source/test mode must be 0644: ${file}" >&2 exit 1 fi done if [[ ! -x scripts/test-miner-detail.sh ]] \ || [[ "$(stat -c '%a' scripts/test-miner-detail.sh)" != "755" ]]; then echo "scripts/test-miner-detail.sh must be executable with mode 0755." >&2 exit 1 fi echo "Miner Detail file-mode preflight passed." project_name="${MINEROPS_MINER_DETAIL_TEST_PROJECT:-minerops-miner-detail-$$}" compose=( docker compose --project-name "${project_name}" --env-file .env.dev -f compose.dev.yaml ) cleanup() { status=$? if (( status != 0 )); then echo echo "Miner Detail tests failed. Recent PostgreSQL logs:" "${compose[@]}" logs --no-color --tail 120 postgres || true fi "${compose[@]}" down --volumes --remove-orphans >/dev/null 2>&1 || true exit "${status}" } trap cleanup EXIT if [[ ! -f .env.dev ]]; then echo "Missing .env.dev. Run ./scripts/dev-env-init.sh first." >&2 exit 1 fi echo "Starting disposable Miner Detail database..." "${compose[@]}" up --detach postgres for attempt in $(seq 1 60); do if "${compose[@]}" exec -T postgres sh -ec \ 'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"' >/dev/null 2>&1; then break fi if (( attempt == 60 )); then echo "PostgreSQL did not become ready." >&2 exit 1 fi sleep 1 done echo "Building Miner Detail test image..." "${compose[@]}" build backend "${compose[@]}" run --rm --no-deps backend alembic upgrade head echo "Running Miner Detail and affected-domain focused tests..." "${compose[@]}" run --rm --no-deps \ -v "${repo_root}/backend/tests:/app/tests:ro" \ backend python -m unittest -v \ tests.test_miner_detail \ tests.test_frontend_shell \ tests.test_inventory_domain \ tests.test_inventory_router \ tests.test_mine_map \ tests.test_repair_center echo "Miner Detail focused tests passed."