[ADD] make: une cible pour les tests unitaires, dépendance mobile déclarée
Ces 382 tests ne tournaient que lancés à la main, donc jamais. « make test »
demande une base de données et plusieurs minutes ; ceux-ci lisent le code et
exécutent les fragments de shell générés, sudo, pgrep et pkill bouchonnés, en
une dizaine de secondes. Deux cibles : test_unit, et test_unit_file pour la
boucle d'écriture.
La dépendance à mobile/erplibre_home_mobile est DITE plutôt que supposée : le
lanceur l'annonce présente ou absente, et les tests du vrai transfert se
déclarent ignorés — avec la commande qui manque — au lieu de passer en silence.
Vérifié dans les trois états : dépôt absent, présent non compilé, compilé.
Au passage, compile_and_run.sh vérifie le transfert des dépôts, comme
l'installation d'une VM et par le même script.
--- EN ---
These 382 tests only ran when invoked by hand, so never. "make test" wants a
database and several minutes; these read the code and run the generated shell
fragments with sudo, pgrep and pkill stubbed, in about ten seconds. Two targets:
test_unit, and test_unit_file for the writing loop.
The dependency on mobile/erplibre_home_mobile is STATED rather than assumed: the
runner announces it present or absent, and the real-transfer tests declare
themselves skipped — naming the missing command — instead of passing quietly.
Checked in all three states: repo absent, present but unbuilt, built.
Along the way, compile_and_run.sh verifies the repo transfer, like a VM install
and through the same script.
Assisted-by: Claude Opus 5
2026-08-21 20:06:23 -04:00
|
|
|
#!/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...]
|
|
|
|
|
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 \
|
[ADD] run: choisir la base au démarrage, sans jamais bloquer
« ./run.sh » sans argument partait sans base et l'on choisissait dans le
gestionnaire web. Il choisit maintenant : une seule base, il démarre
dessus ; plusieurs, il affiche un menu numéroté.
Ce qui décide n'est pas le menu mais l'endroit où il ne doit PAS s'ouvrir.
systemd écrit « ExecStart=/bin/bash …/run.sh » sans argument, avec
Restart=always : une question posée là serait une boucle de redémarrage.
Le défaut implicite exige donc un terminal sur stdin ET sur stderr — pas
stdout, qui est toujours un tube dans la substitution qui nous lit.
Mesuré : sans terminal, la ligne d'arguments est identique à l'octet et
la sonde, qui coûte 0,8 s, n'est jamais appelée.
--- EN ---
« ./run.sh » with no argument started without a database and one picked
in the web manager. It now picks: a single database, it starts on it;
several, it shows a numbered menu.
What decides is not the menu but where it must NOT open. systemd writes
« ExecStart=/bin/bash …/run.sh » with no argument and Restart=always: a
question asked there would be a restart loop. The implicit default
therefore requires a terminal on stdin AND on stderr — not stdout, which
is always a pipe inside the substitution that reads us. Measured: with no
terminal the argument line is byte-for-byte identical and the 0.8 s probe
is never called.
Assisted-by: Claude Opus 5
2026-08-23 17:26:41 -04:00
|
|
|
test/test_todo_*.py test/test_install_*.py test/test_run_*.py \
|
|
|
|
|
2>/dev/null)
|
[ADD] make: une cible pour les tests unitaires, dépendance mobile déclarée
Ces 382 tests ne tournaient que lancés à la main, donc jamais. « make test »
demande une base de données et plusieurs minutes ; ceux-ci lisent le code et
exécutent les fragments de shell générés, sudo, pgrep et pkill bouchonnés, en
une dizaine de secondes. Deux cibles : test_unit, et test_unit_file pour la
boucle d'écriture.
La dépendance à mobile/erplibre_home_mobile est DITE plutôt que supposée : le
lanceur l'annonce présente ou absente, et les tests du vrai transfert se
déclarent ignorés — avec la commande qui manque — au lieu de passer en silence.
Vérifié dans les trois états : dépôt absent, présent non compilé, compilé.
Au passage, compile_and_run.sh vérifie le transfert des dépôts, comme
l'installation d'une VM et par le même script.
--- EN ---
These 382 tests only ran when invoked by hand, so never. "make test" wants a
database and several minutes; these read the code and run the generated shell
fragments with sudo, pgrep and pkill stubbed, in about ten seconds. Two targets:
test_unit, and test_unit_file for the writing loop.
The dependency on mobile/erplibre_home_mobile is STATED rather than assumed: the
runner announces it present or absent, and the real-transfer tests declare
themselves skipped — naming the missing command — instead of passing quietly.
Checked in all three states: repo absent, present but unbuilt, built.
Along the way, compile_and_run.sh verifies the repo transfer, like a VM install
and through the same script.
Assisted-by: Claude Opus 5
2026-08-21 20:06:23 -04:00
|
|
|
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}
|