refactor: factorise la création d'engine et normalise solde_montant

- connection: création de l'engine centralisée dans _build_engine (source
  unique de config) ; init_db réutilise reset_connection + get_engine au lieu
  de dupliquer create_engine
- service: _normalize_amount garantit qu'un montant non numérique issu de
  l'extraction (string, dict…) n'entre jamais en base dans une colonne Float ;
  appliqué à solde_montant
- tests: couverture de _normalize_amount et du solde sous forme de string

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 10:15:09 +02:00
parent 635a094591
commit 4606d6785b
3 changed files with 60 additions and 29 deletions

View File

@@ -95,6 +95,29 @@ def test_save_document_assigns_tags(db_session, sample_data):
assert depense.tag_id == tag.id
@pytest.mark.parametrize(
"raw,expected",
[
(100.0, 100.0),
(100, 100.0),
("1 234,56", 1234.56), # string française -> parsée
(None, None),
({}, None), # type inattendu -> None, jamais stocké tel quel
(True, None), # bool exclu
],
)
def test_normalize_amount(raw, expected):
assert DatabaseService._normalize_amount(raw) == expected
def test_save_document_solde_string_is_normalized(db_session, sample_data):
sample_data["metadata"]["solde"]["montant"] = "1 234,56"
service = DatabaseService(db_session)
doc = service.save_document(data=sample_data)
assert isinstance(doc.solde_montant, float)
assert doc.solde_montant == pytest.approx(1234.56)
def test_check_duplicate(db_session, sample_data):
service = DatabaseService(db_session)
assert service.check_duplicate("REF001", date(2024, 1, 15)) is None