""" Tests pour le modèle de données Receipt. Ces tests vérifient que le format JSON commun fonctionne correctement avant même d'avoir des parsers réels. """ import json from datetime import date import pytest from tickettracker.models.receipt import Item, Receipt def test_receipt_to_dict(): """Un ticket se convertit correctement en dictionnaire.""" receipt = Receipt( store="picnic", date=date(2024, 1, 15), total=42.50, items=[ Item(name="Lait demi-écrémé", quantity=2, unit="pièce", unit_price=1.05, total_price=2.10), Item(name="Pain de campagne", quantity=1, unit="pièce", unit_price=2.40, total_price=2.40), ], ) d = receipt.to_dict() assert d["store"] == "picnic" assert d["date"] == "2024-01-15" # La date doit être une string ISO assert d["total"] == 42.50 assert d["currency"] == "EUR" assert len(d["items"]) == 2 assert d["items"][0]["name"] == "Lait demi-écrémé" def test_receipt_to_json_is_valid_json(): """Le JSON produit est bien parsable.""" receipt = Receipt( store="leclerc", date=date(2024, 2, 3), total=18.90, items=[Item(name="Tomates", quantity=0.5, unit="kg", unit_price=3.20, total_price=1.60)], ) json_str = receipt.to_json() parsed = json.loads(json_str) # Lève une exception si le JSON est invalide assert parsed["store"] == "leclerc" assert parsed["items"][0]["unit"] == "kg" def test_receipt_optional_fields(): """Les champs optionnels ont des valeurs par défaut correctes.""" receipt = Receipt(store="picnic", date=date(2024, 1, 1), total=10.0) assert receipt.currency == "EUR" assert receipt.items == [] assert receipt.order_id is None