Cassius1Morbant's picture
Upload 17 files
90355ac verified
# test_tva.py — COMPREHENSIVE VAT 2025 TEST SUITE
# Run with: python test_tva.py
# Requires: calc_TVA.py and VAT_2025.json in same folder
import json
import sys
from pathlib import Path
# --------------------------------------------------------------
# 1. ADD CURRENT DIR TO PATH
# --------------------------------------------------------------
TEST_DIR = Path(__file__).parent
sys.path.insert(0, str(TEST_DIR))
# --------------------------------------------------------------
# 2. IMPORT calc_TVA AND INJECT JSON PATH
# --------------------------------------------------------------
from calc_TVA import calculate_tva
import calc_TVA
JSON_PATH = TEST_DIR / "VAT_2025.json"
if not JSON_PATH.exists():
print(f"ERROR: {JSON_PATH} not found!")
sys.exit(1)
calc_TVA.__dict__["_JSON_PATH"] = str(JSON_PATH)
# --------------------------------------------------------------
# 3. TEST CASES
# --------------------------------------------------------------
TESTS = [
# (amount, category, expected_tva, expected_rate_or_msg)
(15000, "restauration", 1500.0, "10%"),
(15000, "restaurant", 1500.0, "10%"),
(15000, "repas", 1500.0, "10%"),
(1200, "livre", 66.0, "5.5%"),
(1200, "livres", 66.0, "5.5%"),
(1200, "produits alimentaires", 66.0, "5.5%"),
(1200, "cantine scolaire", 66.0, "5.5%"),
(1200, "cinéma", 66.0, "5.5%"),
(1200, "travaux énergétiques", 66.0, "5.5%"),
(1200, "logements sociaux", 66.0, "5.5%"),
(500, "médicaments remboursables", 10.5, "2.1%"),
(500, "presse", 10.5, "2.1%"),
(500, "animaux de boucherie", 10.5, "2.1%"),
(10000, "voiture", 2000.0, "20%"), # default
(10000, "téléphone", 2000.0, "20%"),
(10000, "meuble", 2000.0, "20%"),
(10000, "default", 2000.0, "20%"),
(10000, "corse", None, "variable"),
(10000, "dom", None, "variable"),
(10000, "guadeloupe", None, "variable"),
(10000, "outre-mer", None, "variable"),
(0, "restauration", 0.0, "10%"),
(99.99, "livre", 5.5, "5.5%"),
]
# --------------------------------------------------------------
# 4. RUN TESTS
# --------------------------------------------------------------
def run_tests():
passed = 0
failed = 0
print(f"{'='*60}")
print(f" TVA 2025 TEST SUITE – {len(TESTS)} CASES")
print(f"{'='*60}")
for i, (amount, category, exp_tva, exp_hint) in enumerate(TESTS, 1):
try:
result = calculate_tva(amount, category)
tva = result.get("result")
expl = result.get("explanation", "")
src = result.get("source", "")
# ——— CASE 1: Variable rate ———
if exp_hint == "variable":
if tva is None and "variable" in expl.lower():
status = "PASSED"
passed += 1
else:
status = "FAILED"
failed += 1
# ——— CASE 2: Fixed rate ———
else:
expected_rate = float(exp_hint.strip("%")) / 100
expected_tva_calc = round(amount * expected_rate, 2)
if abs((tva or 0) - expected_tva_calc) <= 0.01:
status = "PASSED"
passed += 1
else:
status = "FAILED"
failed += 1
# ——— PRINT RESULT ———
print(f"[{status}] Test {i:02d}")
print(f" → {amount:,.2f} € | '{category}'")
if tva is not None:
print(f" → TVA = {tva:,.2f} € | {expl}")
else:
print(f" → {expl}")
print(f" → Source: {src}")
print()
except Exception as e:
print(f"[ERROR] Test {i:02d} crashed: {e}\n")
failed += 1
# ——— SUMMARY ———
print(f"{'='*60}")
print(f" SUMMARY: {passed} PASSED, {failed} FAILED")
if failed == 0:
print(f" ALL TESTS PASSED! calc_TVA.py is 100% correct.")
else:
print(f" FIX THE FAILED CASES ABOVE.")
print(f"{'='*60}")
# --------------------------------------------------------------
# 5. EXECUTE
# --------------------------------------------------------------
if __name__ == "__main__":
run_tests()