Rien ne tenait la convention sur le sujet : le tag est respecté partout, c'est la longueur qui glisse. Le hook refuse le mécanique et rien de plus — tag absent, plus de 72 caractères, sujet ouvrant sur une citation ; dire sur quoi porte le code reste un jugement qu'aucun hook ne rendra. Il compte des caractères et non des octets, sans quoi un sujet français de 72 caractères tomberait sur ses accents. Le refus enseigne le repli vers des mots-clés plutôt que la troncature, et nomme `--no-verify` : un garde-fou qui refuse trop est désinstallé. Les tests pèsent donc autant les acceptations, « Merge branch » ou fixup de rebase. Le lanceur balaie le préfixe test_git_ : 32 tests jamais exécutés, le total va de 1021 à 1071. --- EN --- Nothing held the subject convention: the tag is respected everywhere, it is the length that slips. The hook refuses the mechanical and nothing more — no tag, over 72 characters, a subject opening on a quotation; whether it says what the code is about stays a judgement no hook will make. It counts characters, not bytes, or a 72-character French subject would fall on its accents. The refusal teaches the fallback to keywords rather than truncation, and names `--no-verify`: a guard rail that refuses too much gets uninstalled. So the tests weigh the acceptances as much, a "Merge branch" or a rebase fixup. The runner sweeps the test_git_ prefix: 32 tests never ran, and the total goes from 1021 to 1071. Assisted-by: Claude Opus 5 (cherry picked from commit c9abf4d1b723ae8ff3762d39bfe1d6982400d12d)
81 lines
2.9 KiB
Bash
Executable file
81 lines
2.9 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...]
|
|
#
|
|
# NOMMER UN NOUVEAU FICHIER : sans argument, ce script ne prend que les
|
|
# préfixes listés plus bas (test_qemu_, test_todo_, test_proxmox_…) — le reste
|
|
# de test/ demande une base de données. Un fichier hors préfixe tombe donc dans
|
|
# le même silence qu'un fichier absent : douze tests écrits, jamais lancés, et
|
|
# un total qui n'a pas bougé. Choisir le préfixe de sa famille, ou l'ajouter
|
|
# ici.
|
|
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 ce que le dépôt sait tester sans base de données.
|
|
mapfile -t FILES < <(ls test/test_qemu_*.py test/test_mobile_*.py \
|
|
test/test_todo_*.py test/test_install_*.py test/test_run_*.py \
|
|
test/test_proxmox_*.py test/test_git_*.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}
|