#!/bin/bash
# Corre las pruebas unitarias de mbinv EXACTAMENTE como las corre el CI.
#
# Uso:
#   tools/pruebas-unitarias.sh                    # todas las de Tests/Clases/
#   tools/pruebas-unitarias.sh DicPermisosTest    # sólo las que coincidan
#
# ⚠️ Por qué existe este guion, y por qué en PHP 5.6 dentro de Docker.
#
# Hasta el 21-ago-2026 no había en el repo NADA que dijera cómo se corren las pruebas: ni
# un .md, ni un guion, ni un workflow. La única pista era un comentario dentro de una
# prueba que mencionaba `bin/phpunit11.phar`... un archivo que no está en el repo, porque
# `/bin/` está en .gitignore. O sea que el intérprete que corría las unitarias existía en
# UNA sola máquina. En un worktree limpio esas pruebas daban 4 errores que parecían
# defectos del código y eran el phar ausente.
#
# Se corre en PHP 5.6.40 porque es lo que corre en el cliente: una prueba verde en PHP 8
# no dice nada sobre producción. PHPUnit 5.7.27 —el que declara composer.json— es el
# último que soporta 5.6, y por eso las pruebas de este directorio usan
# `assertInternalType` y `assertContains` aunque estén obsoletas.
#
# Y son SÓLO las de `Tests/Clases/`: las 105 de `Tests/Controller/` son funcionales y
# algunas abren conexión a la base de pruebas. Correr la batería completa tal como la
# declara `phpunit.xml` se cuelga ahí — medido: 3 s de CPU en 25 minutos de reloj.
set -e

RAIZ="$(cd "$(dirname "$0")/.." && pwd)"
cd "$RAIZ"

FILTRO=()
if [ -n "$1" ]; then
    FILTRO=(--filter "$1")
fi

if ! docker info >/dev/null 2>&1; then
    echo "Docker no responde. En la Mac de Manuel se levanta con: colima start" >&2
    exit 1
fi

# El vendor de un worktree suele ser un enlace al checkout principal, y Docker no sigue
# enlaces que salgan del volumen montado: hay que montar el destino real, en su ruta real,
# porque el classmap de composer guarda rutas absolutas.
#
# ⚠️ Y entonces hace falta OTRO bootstrap. Ese classmap resuelve `MB\...` a los archivos del
# checkout PRINCIPAL, así que las pruebas ejercitarían el código de `main` y no el de la
# rama —falsos verdes y falsos rojos sin avisar—. `tests/bootstrap-worktree.php` antepone un
# autocargador que apunta al `src/` de ESTE directorio y le gana al classmap. Con un
# checkout limpio, que es el caso del CI, no hay enlace y `vendor/autoload.php` alcanza.
MONTAJES=(-v "$RAIZ":/repo)
BOOTSTRAP=vendor/autoload.php
if [ -L vendor ]; then
    DESTINO="$(cd "$(dirname "$(readlink vendor)")" && pwd)/$(basename "$(readlink vendor)")"
    MONTAJES+=(-v "$DESTINO":"$DESTINO")
    BOOTSTRAP=tests/bootstrap-worktree.php
    echo "vendor es un enlace a $DESTINO — se monta aparte, y va con $BOOTSTRAP"
fi

if [ ! -e vendor/phpunit/phpunit/phpunit ]; then
    echo "Falta vendor/. Instalalo con:" >&2
    echo "  docker run --rm -v \"\$PWD\":/app -w /app composer:2.2 \\" >&2
    echo "    composer install --no-scripts --no-interaction --prefer-dist --ignore-platform-reqs" >&2
    exit 1
fi

exec docker run --rm "${MONTAJES[@]}" -w /repo php:5.6-cli \
    php vendor/phpunit/phpunit/phpunit \
        --no-configuration \
        --bootstrap "$BOOTSTRAP" \
        "${FILTRO[@]}" \
        src/MB/ProductoBundle/Tests/Clases/
