Files
rar-autopass/tests/test_payload.py
Claude Agent 56ebe1f7cb feat(editor): editor prestatii unificat in modal - un select, un rand de chips (PRD 5.23)
Inlocuieste cele 3 controale de asociere cod RAR cu un singur rand de chips
+ un singur select care adauga instant la change. Stare = un hidden chips_state
JSON versionat; post_form_chips redus la 2 actiuni (add/remove). Optgroup
Sugestii (fuzzy/k-NN) + optiune "Nu se declara la RAR" in select, cu tinta
implicita evidentiata si placeholder care o numeste. exclus persistat prin
payload_json (treapta noua de precedenta in resolve_prestatii, round-trip complet).

Siguranta: itemii exclusi sunt scosi din payload la momentul trimiterii
(worker split_prestatii_excluse inainte de build_rar_payload + filtru defensiv),
ca sa nu ajunga NICIODATA la RAR ca codPrestatie:null.

Suita: 1680 passed, 1 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 15:45:34 +00:00

135 lines
4.5 KiB
Python

"""Teste T4 — payload builder (app.payload.build_rar_payload).
Snapshot fata de exemplul oficial de request din docs/api-rar-contract.md +
invariantii din contract (status FINALIZATA, fara tipPrestatie, odometru string,
idPrezentare null, omitere obs/b64Image, normalizare).
"""
from __future__ import annotations
from app.models import PrezentareIn
from app.payload import build_rar_payload
def _internal(**over) -> dict:
data = {
"vin": "WVWZZZ1KZAW000123",
"nr_inmatriculare": "B999TST",
"data_prestatie": "2026-06-15",
"odometru_final": "123456",
"prestatii": [{"cod_prestatie": "OE-1"}],
}
data.update(over)
return PrezentareIn(**data).model_dump()
def test_snapshot_exemplul_oficial_din_contract():
"""Payload == exemplul oficial postPrezentare (request) din contract."""
internal = {
"vin": "XXXXXXXXXXXXXXXXX",
"nr_inmatriculare": "B999GEN",
"data_prestatie": "2024-12-01", # exemplul are 2024-07-25, dar acela e < min; folosim o data valida, restul identic
"odometru_final": "9999999",
"odometru_initial": None,
"prestatii": [{"cod_prestatie": "OE-1"}, {"cod_prestatie": "OE-2"}],
"sistem_reparat": "null",
"obs": "TEST",
"b64_image": "UklGRg==",
}
expected = {
"vin": "XXXXXXXXXXXXXXXXX",
"nrInmatriculare": "B999GEN",
"dataPrestatie": "2024-12-01",
"odometruFinal": "9999999",
"odometruInitial": None,
"prestatii": [
{"codPrestatie": "OE-1", "idPrezentare": None},
{"codPrestatie": "OE-2", "idPrezentare": None},
],
"sistemReparat": "null",
"status": "FINALIZATA",
"obs": "TEST",
"b64Image": "UklGRg==",
}
assert build_rar_payload(PrezentareIn(**internal).model_dump()) == expected
def test_status_mereu_finalizata():
assert build_rar_payload(_internal())["status"] == "FINALIZATA"
def test_nu_trimite_tipprestatie():
assert "tipPrestatie" not in build_rar_payload(_internal())
def test_odometru_final_este_string():
p = build_rar_payload(_internal(odometru_final="55000"))
assert p["odometruFinal"] == "55000"
assert isinstance(p["odometruFinal"], str)
def test_omite_obs_si_b64_cand_lipsesc():
p = build_rar_payload(_internal())
assert "obs" not in p
assert "b64Image" not in p
def test_odometru_initial_gol_devine_null():
assert build_rar_payload(_internal(odometru_initial=""))["odometruInitial"] is None
assert build_rar_payload(_internal())["odometruInitial"] is None
def test_odometru_initial_prezent_string():
p = build_rar_payload(_internal(prestatii=[{"cod_prestatie": "R-ODO"}], odometru_initial="100000"))
assert p["odometruInitial"] == "100000"
def test_prestatii_au_idprezentare_null():
p = build_rar_payload(_internal(prestatii=[{"cod_prestatie": "OE-1"}, {"cod_prestatie": "OE-3"}]))
assert p["prestatii"] == [
{"codPrestatie": "OE-1", "idPrezentare": None},
{"codPrestatie": "OE-3", "idPrezentare": None},
]
def test_normalizare_vin_nrinm_in_payload():
p = build_rar_payload(_internal(vin=" wvwzzz1kzaw000123 ", nr_inmatriculare=" b999tst "))
assert p["vin"] == "WVWZZZ1KZAW000123"
assert p["nrInmatriculare"] == "B999TST"
def test_sistem_reparat_default_null():
assert build_rar_payload(_internal())["sistemReparat"] == "null"
def test_item_exclus_nu_apare_in_payload():
"""Un item adnotat exclus=True nu produce niciodata {codPrestatie: null} la RAR."""
internal = {
"vin": "WVWZZZ1KZAW000123",
"nr_inmatriculare": "B999TST",
"data_prestatie": "2026-06-15",
"odometru_final": "123456",
"prestatii": [
{"cod_prestatie": "OE-1"},
{"cod_prestatie": None, "cod_op_service": "200", "denumire": "Spalare", "exclus": True},
],
}
p = build_rar_payload(internal)
assert p["prestatii"] == [{"codPrestatie": "OE-1", "idPrezentare": None}]
def test_item_fara_cod_prestatie_nu_apare_in_payload():
"""Defense-in-depth: orice item fara cod (chiar neadnotat exclus) e sarit, niciodata null."""
internal = {
"vin": "WVWZZZ1KZAW000123",
"nr_inmatriculare": "B999TST",
"data_prestatie": "2026-06-15",
"odometru_final": "123456",
"prestatii": [
{"cod_prestatie": "OE-1"},
{"cod_prestatie": None, "cod_op_service": "200"},
],
}
p = build_rar_payload(internal)
assert p["prestatii"] == [{"codPrestatie": "OE-1", "idPrezentare": None}]