Le lanceur prend TOUT `test/test_*.py` par glob, et l'en-tête disait pourquoi : une liste de préfixes oublie ce qu'on ajoute. Il ne disait pas où mettre ce qui doit rester dehors, si bien qu'une famille de tests nouvelle semblait avoir quelque chose à déclarer ici. La frontière est un RÉPERTOIRE : ce qui ne doit pas être lancé vit ailleurs que dans `test/`. Rien à déclarer, donc rien à oublier de déclarer. --- EN --- The launcher takes ALL of `test/test_*.py` by glob, and the header said why: a list of prefixes forgets whatever gets added. It did not say where to put what must stay out, so a new family of tests looked as though it had something to declare here. The boundary is a DIRECTORY: what must not run lives somewhere other than `test/`. Nothing to declare, hence nothing to forget to declare. Assisted-by: Claude Opus 5
89 lines
3.1 KiB
Bash
Executable file
89 lines
3.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
#
|
|
# Tests unitaires python du dépôt : ni base de données, ni Odoo, ni VM.
|
|
#
|
|
# Ils lisent le code et exécutent les fragments de shell que todo.py génère,
|
|
# avec « sudo », « pgrep » et « pkill » bouchonnés — c'est ce qui les rend
|
|
# lançables partout et en quelques secondes, là où « make test » demande une
|
|
# base et plusieurs minutes.
|
|
#
|
|
# DÉPENDANCE DÉCLARÉE : les tests du transfert mobile lisent
|
|
# mobile/erplibre_home_mobile. Absent, ils se disent ignorés plutôt que de
|
|
# passer en silence — un test vert sans son dépôt ne prouve rien. Ce script
|
|
# l'annonce donc avant de commencer.
|
|
#
|
|
# ./script/test/run_unit_test.sh [fichiers...]
|
|
#
|
|
# TOUT test/test_*.py, et non une liste de préfixes. La liste disait prendre
|
|
# test_qemu_, test_todo_, test_proxmox_… « le reste demandant une base de
|
|
# données ». Mesuré : les 3670 tests du répertoire passent avec PostgreSQL
|
|
# injoignable, et la liste laissait 2400 d'entre eux hors de la suite —
|
|
# écrits, verts, jamais lancés. Un glob n'oublie personne ; une liste, si.
|
|
#
|
|
# La frontière est donc un RÉPERTOIRE, pas un nom : ce qui doit rester hors
|
|
# de la suite vit ailleurs que dans test/. Une famille de tests nouvelle n'a
|
|
# rien à déclarer ici.
|
|
#
|
|
# Un fichier n'est vu que s'il finit par le bloc habituel :
|
|
#
|
|
# if __name__ == "__main__":
|
|
# unittest.main()
|
|
#
|
|
# EN DERNIER, sinon tout ce qui suit est défini après l'appel et ne tourne
|
|
# jamais. C'est arrivé quatre fois ici, pour 87 tests.
|
|
set -uo pipefail
|
|
|
|
Red='\033[0;31m'
|
|
Green='\033[0;32m'
|
|
Yellow='\033[0;33m'
|
|
Color_Off='\033[0m'
|
|
|
|
cd "$(dirname "$0")/../.." || exit 1
|
|
|
|
PY=./.venv.erplibre/bin/python
|
|
if [[ ! -x "${PY}" ]]; then
|
|
echo -e "${Red}✗ ${PY} absent : lancer l'installation ERPLibre d'abord.${Color_Off}"
|
|
exit 1
|
|
fi
|
|
|
|
MOBILE=mobile/erplibre_home_mobile
|
|
if [[ -d "${MOBILE}" ]]; then
|
|
echo -e " dépendance ${MOBILE} : ${Green}présente${Color_Off}"
|
|
else
|
|
echo -e " dépendance ${MOBILE} : ${Yellow}absente${Color_Off}"
|
|
echo " (les tests du transfert mobile s'en passeront et le diront)"
|
|
fi
|
|
|
|
FILES=("$@")
|
|
if [[ ${#FILES[@]} -eq 0 ]]; then
|
|
# Aucun argument : tout le répertoire. Mesuré sans PostgreSQL.
|
|
mapfile -t FILES < <(ls test/test_*.py 2>/dev/null)
|
|
fi
|
|
|
|
fail=0
|
|
total=0
|
|
for f in "${FILES[@]}"; do
|
|
out=$(PYTHONPATH=. "${PY}" "${f}" 2>&1)
|
|
ran=$(echo "${out}" | grep -oE 'Ran [0-9]+' | grep -oE '[0-9]+' | tail -1)
|
|
skipped=$(echo "${out}" | grep -oE 'skipped=[0-9]+' | tail -1)
|
|
if echo "${out}" | grep -qE '^OK'; then
|
|
state="${Green}OK${Color_Off}"
|
|
else
|
|
state="${Red}ÉCHEC${Color_Off}"
|
|
fail=1
|
|
fi
|
|
total=$((total + ${ran:-0}))
|
|
printf " %-42s %5s tests %-14s %b\n" \
|
|
"$(basename "${f}")" "${ran:-?}" "${skipped:-}" "${state}"
|
|
[[ "${state}" == *"ÉCHEC"* ]] && echo "${out}" | tail -12
|
|
done
|
|
|
|
echo " ─────"
|
|
if [[ ${fail} -eq 0 ]]; then
|
|
echo -e " ${Green}${total} tests, tout vert${Color_Off}"
|
|
else
|
|
echo -e " ${Red}des échecs ci-dessus${Color_Off}"
|
|
fi
|
|
exit ${fail}
|