Doar 13.8% din numerele de inmatriculare istorice treceau validarea stricta
^[A-Z0-9]{1,10}$ (spike SQL), majoritatea din cauza formatelor reale cu
spatii/cratime ("B 99 XYZ", "B-99-XYZ") pe care normalizarea actuala
(strip+upper) nu le curata.
Adauga normalize_nr_inmatriculare() in app.idempotency (deja punctul comun
API+import pentru canonicalize_row) si o foloseste consecvent in:
- models.PrezentareIn (validare shape / normalizare API)
- validation.validate_prezentare (validare continut)
- idempotency.canonicalize_row (cheia de dedup)
Fara aceasta consecventa, validarea si idempotency ar diverge pe acelasi
numar de inmatriculare in formate echivalente.
61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
"""build_key incorporeaza rar_env."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from app.idempotency import build_key, canonicalize_row, normalize_nr_inmatriculare
|
|
|
|
|
|
def _canon():
|
|
raw = {
|
|
"vin": "WVWZZZ1JZXW000001", "nr_inmatriculare": "B 123 ABC",
|
|
"data_prestatie": "2026-01-10", "odometru_final": "123456.0",
|
|
"prestatii": [{"cod_prestatie": "OE-1"}],
|
|
}
|
|
canon = canonicalize_row(raw)
|
|
canon["prestatii"] = raw["prestatii"]
|
|
return canon
|
|
|
|
|
|
def test_key_difera_intre_test_si_prod():
|
|
canon = _canon()
|
|
assert build_key(1, canon, "test") != build_key(1, canon, "prod")
|
|
|
|
|
|
def test_key_stabil_pe_env():
|
|
canon = _canon()
|
|
assert build_key(1, canon, "prod") == build_key(1, canon, "prod")
|
|
# None si 1 colapseaza la aceeasi cheie (account_or_default), pe acelasi env
|
|
assert build_key(None, canon, "test") == build_key(1, canon, "test")
|
|
|
|
|
|
def test_normalize_nr_inmatriculare_elimina_spatii_cratime_puncte():
|
|
assert normalize_nr_inmatriculare("B 99 XYZ") == "B99XYZ"
|
|
assert normalize_nr_inmatriculare("B-99-XYZ") == "B99XYZ"
|
|
assert normalize_nr_inmatriculare("B.99.XYZ") == "B99XYZ"
|
|
assert normalize_nr_inmatriculare(" b99xyz ") == "B99XYZ"
|
|
|
|
|
|
def test_canonicalize_row_normalizeaza_nr_inmatriculare():
|
|
raw = {"nr_inmatriculare": "B 99 XYZ"}
|
|
assert canonicalize_row(raw)["nr_inmatriculare"] == "B99XYZ"
|
|
|
|
|
|
def test_build_key_acelasi_pentru_formate_echivalente_nrinm():
|
|
""""B 99 XYZ" si "B99XYZ" trebuie sa produca aceeasi cheie de dedup."""
|
|
raw_cu_spatii = {
|
|
"vin": "WVWZZZ1JZXW000001", "nr_inmatriculare": "B 99 XYZ",
|
|
"data_prestatie": "2026-01-10", "odometru_final": "123456",
|
|
"prestatii": [{"cod_prestatie": "OE-1"}],
|
|
}
|
|
raw_fara_spatii = {
|
|
"vin": "WVWZZZ1JZXW000001", "nr_inmatriculare": "B99XYZ",
|
|
"data_prestatie": "2026-01-10", "odometru_final": "123456",
|
|
"prestatii": [{"cod_prestatie": "OE-1"}],
|
|
}
|
|
canon1 = canonicalize_row(raw_cu_spatii)
|
|
canon1["prestatii"] = raw_cu_spatii["prestatii"]
|
|
canon2 = canonicalize_row(raw_fara_spatii)
|
|
canon2["prestatii"] = raw_fara_spatii["prestatii"]
|
|
assert build_key(1, canon1, "test") == build_key(1, canon2, "test")
|
|
|