Acasa = ecran de import (tab Import scos, ?tab=import->Acasa). Bara status compacta pe 2 randuri cu bife accesibile (glife + text) + data formatata. 'Coada'->'Trimiteri': coloane RO, stare umana, detaliu la click in panou dedicat. Mapari pe 3 sectiuni (de rezolvat / op salvate / formate coloane), Cont doar cheie+creds. Filtrare Trimiteri, corectie inline needs_data cu re-enqueue + detectie coliziune idempotency, badge contoare pe tab-uri. Helper pur partajat payload_view.py (web + GET /v1/prezentari). Backend trimitere (worker/idempotenta/mapping/schema) neatins. 483 teste. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
"""Teste US-003 (PRD 3.5): helper pur payload -> campuri afisabile.
|
|
|
|
Helper partajat web + API (DRY, eng review). Defensiv: nu arunca pe payload
|
|
malformat; tolerant la diferentele de chei intre canale (numar vs
|
|
numarInmatriculare) si la coercion Excel (odometru "123.0", VIN non-string).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from app.payload_view import prezentare_din_payload, EMPTY
|
|
|
|
|
|
def test_detalii_din_payload():
|
|
"""Payload complet -> toate campurile afisabile corecte."""
|
|
payload = json.dumps({
|
|
"vin": "WVWZZZ1JZXW000001",
|
|
"nr_inmatriculare": "B123XYZ",
|
|
"odometru_final": "123456",
|
|
"data_prestatie": "2026-06-18",
|
|
"prestatii": [{"cod_prestatie": "R-FRANE", "denumire": "Reparatie frane"}],
|
|
})
|
|
d = prezentare_din_payload(payload)
|
|
assert d["vehicul_nr"] == "B123XYZ"
|
|
assert d["vin"] == "WVWZZZ1JZXW000001"
|
|
assert "000001" in d["vin_scurt"] # trunchiat dar identificabil
|
|
assert d["operatie"] == "Reparatie frane"
|
|
assert d["cod"] == "R-FRANE"
|
|
assert d["data_prestatie"] == "2026-06-18"
|
|
assert d["odometru"] == "123456"
|
|
|
|
|
|
def test_payload_partial():
|
|
"""Campuri lipsa -> EMPTY, fara exceptie."""
|
|
d = prezentare_din_payload(json.dumps({"vin": "WVWZZZ1JZXW000002"}))
|
|
assert d["vin"] == "WVWZZZ1JZXW000002"
|
|
assert d["vehicul_nr"] == EMPTY
|
|
assert d["operatie"] == EMPTY
|
|
assert d["cod"] == EMPTY
|
|
assert d["data_prestatie"] == EMPTY
|
|
assert d["odometru"] == EMPTY
|
|
|
|
|
|
def test_payload_gol():
|
|
"""Payload gol / None -> toate EMPTY, fara exceptie."""
|
|
for p in (None, "", "{}", {}):
|
|
d = prezentare_din_payload(p)
|
|
assert d["vehicul_nr"] == EMPTY
|
|
assert d["vin"] == EMPTY
|
|
|
|
|
|
def test_payload_invalid():
|
|
"""JSON invalid / tip neasteptat -> fallback grijuliu (nu arunca)."""
|
|
for bad in ("nu-e-json", "[1,2,3]", "null", "12345"):
|
|
d = prezentare_din_payload(bad)
|
|
assert d["vin"] == EMPTY # degradeaza curat
|
|
|
|
|
|
def test_payload_coercion_excel():
|
|
"""Odometru '123.0'/numeric si VIN non-string afisate curat; chei API alternative."""
|
|
# Excel coercion: odometru float-string si numeric
|
|
d1 = prezentare_din_payload({"odometru_final": "123456.0"})
|
|
assert d1["odometru"] == "123456"
|
|
d2 = prezentare_din_payload({"odometru_final": 123456})
|
|
assert d2["odometru"] == "123456"
|
|
# VIN non-string (coercion Excel)
|
|
d3 = prezentare_din_payload({"vin": 12345678901234567})
|
|
assert d3["vin"] == "12345678901234567"
|
|
# Chei alternative canal API (numar / numarInmatriculare / odometru)
|
|
d4 = prezentare_din_payload({"numar": "CJ99ABC", "odometru": "777.0"})
|
|
assert d4["vehicul_nr"] == "CJ99ABC"
|
|
assert d4["odometru"] == "777"
|
|
d5 = prezentare_din_payload({"numarInmatriculare": "TM01AAA"})
|
|
assert d5["vehicul_nr"] == "TM01AAA"
|
|
|
|
|
|
def test_operatie_fallback_la_cod():
|
|
"""Fara denumire -> operatie afiseaza codul; cod intern cand lipseste cel RAR."""
|
|
d = prezentare_din_payload({"prestatii": [{"cod_op_service": "OP-77"}]})
|
|
assert d["cod"] == "OP-77"
|
|
assert d["operatie"] == "OP-77"
|