61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
|
|
"""
|
||
|
|
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
|