1. Duplication éliminée avant que la Phase 2 (hasard/opérations mathématiques) n'en ajoute 6 de plus aux DEUX fichiers : la chaîne d'opérations quasi identique entre screens/data_actions/ apply_data_action.py (champ d'objet) et apply_variable_action.py (variable globale) est factorisée dans un nouveau compute_operation.py::compute_new_value(operation, current, raw_value, is_decimal), réutilisé par les deux. Nouveau tests/test_compute_operation.py verrouille le comportement des 7 opérations existantes (dont les cas limites : valeur invalide, type décimal vs entier, opération inconnue) avant d'en ajouter d'autres. 2. .gitea/workflows/deploy.yml déployait en prod à chaque push sur main sans jamais exécuter la suite de tests — rien ne bloquait techniquement un commit cassé. Nouveau job "test" (pytest + node:test sur la logique pure de static/js/play/, via des conteneurs officiels plutôt que des actions du marketplace, cohérent avec le choix déjà fait dans ce fichier) tourne sur CHAQUE push (main ET dev, utile pour ce dépôt qui travaille sur dev) ; "build-and-push"/"deploy" gagnent un "needs: test" et restent réservés à main (filtre sur gitea.ref) — un push sur dev ne redéploie jamais la prod, seulement les tests. Vérifié : 223 tests passent (8 nouveaux), YAML validé. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""Tests unitaires de compute_new_value (screens/data_actions/compute_operation.py)
|
|
— logique partagée par apply_data_action.py (champ d'objet) et
|
|
apply_variable_action.py (variable globale), factorisée pour ne plus être
|
|
dupliquée dans les deux fichiers avant que la Phase 2 (hasard/opérations
|
|
mathématiques) n'y ajoute 6 nouvelles opérations. Verrouille le
|
|
comportement des 7 opérations existantes."""
|
|
import pytest
|
|
|
|
from screens.data_actions.compute_operation import compute_new_value
|
|
|
|
|
|
def test_definir_texte():
|
|
assert compute_new_value("definir_texte", "ancien", "nouveau", False) == "nouveau"
|
|
assert compute_new_value("definir_texte", "ancien", "", False) == ""
|
|
assert compute_new_value("definir_texte", "ancien", None, False) == ""
|
|
|
|
|
|
def test_definir_nombre_entier_et_decimal():
|
|
assert compute_new_value("definir_nombre", 0, "5", False) == 5
|
|
assert isinstance(compute_new_value("definir_nombre", 0, "5", False), int)
|
|
assert compute_new_value("definir_nombre", 0, "5.7", True) == 5.7
|
|
assert compute_new_value("definir_nombre", 0, "pas un nombre", False) == 0
|
|
|
|
|
|
def test_definir_bool():
|
|
assert compute_new_value("definir_bool_vrai", 0, None, False) == 1
|
|
assert compute_new_value("definir_bool_faux", 1, None, False) == 0
|
|
|
|
|
|
def test_basculer_bool():
|
|
assert compute_new_value("basculer_bool", 0, None, False) == 1
|
|
assert compute_new_value("basculer_bool", 1, None, False) == 0
|
|
assert compute_new_value("basculer_bool", None, None, False) == 1
|
|
|
|
|
|
def test_incrementer_decrementer_entier():
|
|
assert compute_new_value("incrementer", 10, "5", False) == 15
|
|
assert compute_new_value("decrementer", 10, "5", False) == 5
|
|
assert compute_new_value("incrementer", None, "5", False) == 5
|
|
|
|
|
|
def test_incrementer_decimal_garde_les_decimales():
|
|
result = compute_new_value("incrementer", 10.0, "0.5", True)
|
|
assert result == 10.5
|
|
assert isinstance(result, float)
|
|
|
|
|
|
def test_incrementer_valeur_invalide_ne_change_rien():
|
|
assert compute_new_value("incrementer", 10, "pas un nombre", False) == 10
|
|
|
|
|
|
def test_operation_inconnue_leve_value_error():
|
|
with pytest.raises(ValueError):
|
|
compute_new_value("multiplier", 10, "2", False)
|