refactor: comentarii strict functionale, fara referinte PRD/stories
Curatare globala a comentariilor si docstring-urilor (app, tools, teste, scripturi): eliminate referintele la PRD-uri, US-xxx, task-uri istorice si review-uri; pastrata doar informatia functionala, formulata scurt. Regula adaugata in CLAUDE.md (sectiunea Stil). Fara modificari de cod sau comportament. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,14 @@
|
||||
"""Teste US-006 (PRD 5.15): prestatii multi-cod (lista) la editare/corectie.
|
||||
"""Prestatii multi-cod (lista) la editare/corectie.
|
||||
|
||||
AC-uri verificate:
|
||||
Verifica:
|
||||
- Handler-ele accepta LISTA de cod_prestatie (form.getlist) -> prestatii cu mai multe coduri.
|
||||
- cod_op_service/denumire RAMAN pe item (invariant D7, E1 IRON RULE).
|
||||
- cod_op_service/denumire RAMAN pe item.
|
||||
- Cod invalid -> respins cu mesaj; cod necunoscut NU ajunge la RAR (ORA-12899).
|
||||
- Lista goala -> ramane needs_mapping.
|
||||
- Dedup per-item: (op_service, cod) unic, NU cod unic (doua ops diferite cu acelasi cod ok).
|
||||
- Recalcul idempotenta dupa editare.
|
||||
- odometruInitial obligatoriu cand cod_prestatie contine R-ODO/I-ODO.
|
||||
- REGRESIE E1 (IRON RULE): op_service supravietuieste /repune cu cod.
|
||||
|
||||
TDD: toate testele sunt scrise INAINTE de implementare (RED -> GREEN).
|
||||
- op_service supravietuieste /repune cu cod.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -145,10 +143,7 @@ def _payload_cu_ops(vin: str, ops: list[tuple[str, str]]) -> dict:
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
def test_mai_multe_coduri_acceptate(client):
|
||||
"""US-006 AC1: LISTA de cod_prestatie -> prestatii cu N itemi, fiecare cu cod setat.
|
||||
|
||||
RED: form.get("cod_prestatie") intoarce doar primul cod; form.getlist necesar.
|
||||
"""
|
||||
"""LISTA de cod_prestatie -> prestatii cu N itemi, fiecare cu cod setat."""
|
||||
acct = _create_account_user("multi.cod@test.com")
|
||||
_login(client, "multi.cod@test.com")
|
||||
_seed_cod("OE-1", "Schimb ulei")
|
||||
@@ -179,11 +174,7 @@ def test_mai_multe_coduri_acceptate(client):
|
||||
|
||||
|
||||
def test_cod_op_service_pastrat_dupa_corecteaza(client):
|
||||
"""E1/D7: cod_op_service si denumire RAMAN pe item dupa /corecteaza cu cod direct.
|
||||
|
||||
RED: implementarea veche injecta in prestatii[0] fara sa afecteze op_service
|
||||
(intr-adevar in /corecteaza nu se facea pop), dar testul confirma explicit invariantul.
|
||||
"""
|
||||
"""cod_op_service si denumire RAMAN pe item dupa /corecteaza cu cod direct."""
|
||||
acct = _create_account_user("op.pastrat@test.com")
|
||||
_login(client, "op.pastrat@test.com")
|
||||
_seed_cod("OE-1")
|
||||
@@ -209,10 +200,7 @@ def test_cod_op_service_pastrat_dupa_corecteaza(client):
|
||||
|
||||
|
||||
def test_cod_invalid_respins(client):
|
||||
"""US-006 AC3: cod necunoscut in nomenclator -> respins cu mesaj, status neschimbat.
|
||||
|
||||
RED: validarea fata de nomenclator nu e aplicata per-cod la multi-select.
|
||||
"""
|
||||
"""Cod necunoscut in nomenclator -> respins cu mesaj, status neschimbat."""
|
||||
acct = _create_account_user("cod.invalid@test.com")
|
||||
_login(client, "cod.invalid@test.com")
|
||||
# NU seed-uim "XX-99" -> cod necunoscut
|
||||
@@ -240,11 +228,7 @@ def test_cod_invalid_respins(client):
|
||||
|
||||
|
||||
def test_lista_goala_needs_mapping(client):
|
||||
"""US-006 AC4: nicio cod_prestatie trimis -> submission ramane needs_mapping.
|
||||
|
||||
RED: cu multi-select, lista goala nu injecteaza nimic; resolve_prestatii
|
||||
gaseste inca operatii nemapate -> trebuie sa ramana needs_mapping.
|
||||
"""
|
||||
"""Nicio cod_prestatie trimis -> submission ramane needs_mapping."""
|
||||
acct = _create_account_user("goala.nemap@test.com")
|
||||
_login(client, "goala.nemap@test.com")
|
||||
# NU seed-uim nicio mapare -> operatia ramane nemapata
|
||||
@@ -267,11 +251,7 @@ def test_lista_goala_needs_mapping(client):
|
||||
|
||||
|
||||
def test_idempotency_recalculat(client):
|
||||
"""US-006 AC6: dupa setarea de coduri noi, cheia de idempotenta e recalculata.
|
||||
|
||||
RED: single-cod injecta in prestatii[0] si recalcula cheia; cu multi-cod
|
||||
acelasi mecanism se aplica tuturor itemilor.
|
||||
"""
|
||||
"""Dupa setarea de coduri noi, cheia de idempotenta e recalculata."""
|
||||
acct = _create_account_user("ido.recalc@test.com")
|
||||
_login(client, "ido.recalc@test.com")
|
||||
_seed_cod("OE-1")
|
||||
@@ -296,12 +276,8 @@ def test_idempotency_recalculat(client):
|
||||
|
||||
|
||||
def test_odometru_initial_conditionat_R_ODO(client):
|
||||
"""US-006 AC7: cod_prestatie=R-ODO fara odometruInitial -> validate_prezentare
|
||||
intoarce eroare -> submission ramane needs_data (NU queued).
|
||||
|
||||
RED: validarea R-ODO e deja in validate_prezentare; testul confirma ca
|
||||
multi-cod nu bypass-eaza aceasta regula.
|
||||
"""
|
||||
"""cod_prestatie=R-ODO fara odometruInitial -> validate_prezentare
|
||||
intoarce eroare -> submission ramane needs_data (NU queued)."""
|
||||
acct = _create_account_user("odo.rodo@test.com")
|
||||
_login(client, "odo.rodo@test.com")
|
||||
_seed_cod("R-ODO", "Revizie odometru")
|
||||
@@ -334,12 +310,10 @@ def test_odometru_initial_conditionat_R_ODO(client):
|
||||
|
||||
|
||||
def test_dedup_per_item_nu_dupa_cod(client):
|
||||
"""US-006 AC5 (E4): doua operatii DIFERITE cu ACELASI cod RAR ambele supravietuiesc.
|
||||
"""Doua operatii DIFERITE cu ACELASI cod RAR ambele supravietuiesc.
|
||||
|
||||
Dedup = (op_service, cod) identice, NU cod singur. Doua ops distincte pot
|
||||
mapa legitim la acelasi cod RAR fara sa fie sterse de dedup.
|
||||
|
||||
RED: dedupare naiva dupa cod ar sterge a doua operatie (op-B cu acelasi OE-1).
|
||||
"""
|
||||
acct = _create_account_user("dedup.ops@test.com")
|
||||
_login(client, "dedup.ops@test.com")
|
||||
@@ -371,17 +345,14 @@ def test_dedup_per_item_nu_dupa_cod(client):
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Test de regresie E1 (IRON RULE): op_service supravietuieste /repune cu cod #
|
||||
# op_service supravietuieste /repune cu cod #
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
def test_op_service_supravietuieste_repune_cu_cod(client):
|
||||
"""E1 IRON RULE: dupa /repune cu cod_prestatie, cod_op_service/denumire RAMAN pe item.
|
||||
"""Dupa /repune cu cod_prestatie, cod_op_service/denumire RAMAN pe item.
|
||||
|
||||
RED: routes.py:1371 face `p0.pop("cod_op_service", None)` — sterge operatia
|
||||
cand se seteaza un cod direct prin /repune. US-006 ELIMINA acel pop.
|
||||
|
||||
Aceasta regresie e CRITICA: sterge contextul op->cod necesar pentru US-009
|
||||
(salvare mapare din chip) si rupe invariantul D7.
|
||||
Fara acest invariant se pierde contextul op->cod necesar pentru salvarea
|
||||
maparii din chip.
|
||||
"""
|
||||
acct = _create_account_user("e1.repune@test.com")
|
||||
_login(client, "e1.repune@test.com")
|
||||
@@ -429,15 +400,12 @@ def test_op_service_supravietuieste_repune_cu_cod(client):
|
||||
|
||||
|
||||
def test_repune_nu_trunchiaza_prestatii_multiple(client):
|
||||
"""Bug fix (code-review 5.15): /repune NU pierde prestatii[1:].
|
||||
"""/repune nu pierde prestatii[1:].
|
||||
|
||||
Formularul /repune trimite UN SINGUR select cod_prestatie. Implementarea veche
|
||||
itera `enumerate(codes)` -> pastra doar len(codes) itemi, deci un rand error cu
|
||||
2+ prestatii pierdea toate prestatiile dupa prima -> declaratie INCOMPLETA la RAR
|
||||
(FINALIZATA ireversibil). Fix: iteram peste `existing`, aplicam codes pozitional,
|
||||
pastram toate prestatiile.
|
||||
|
||||
RED inainte de fix: len(prestatii) == 1 (a doua prestatie pierduta).
|
||||
Formularul /repune trimite UN SINGUR select cod_prestatie; codul se aplica
|
||||
pozitional peste toate prestatiile existente, care raman toate (altfel un
|
||||
rand error cu 2+ prestatii ar pierde restul -> declaratie INCOMPLETA la RAR,
|
||||
FINALIZATA ireversibil).
|
||||
"""
|
||||
acct = _create_account_user("repune.multi@test.com")
|
||||
_login(client, "repune.multi@test.com")
|
||||
@@ -479,14 +447,10 @@ def test_repune_nu_trunchiaza_prestatii_multiple(client):
|
||||
|
||||
|
||||
def test_corectie_eroare_validare_pastreaza_picker(client):
|
||||
"""Bug fix (code-review 5.15): re-render-ul de eroare validare pastreaza optiunile pickerului.
|
||||
"""Re-render-ul de eroare validare pastreaza optiunile pickerului.
|
||||
|
||||
post_corectie_trimitere re-randa _trimitere_detaliu pe ramura erori-validare FARA
|
||||
`conn`/`account_id` -> `nomenclator_rar=[]` -> picker-ul chips randa ZERO optiuni ->
|
||||
userul nu mai poate alege cod RAR fara sa inchida+redeschida modalul. Fix: pasam
|
||||
`conn`+`account_id` la _detaliu_ctx pe TOATE ramurile de re-render.
|
||||
|
||||
RED inainte de fix: codul de picker "PK-1" lipseste din re-render.
|
||||
_detaliu_ctx primeste `conn`+`account_id` pe toate ramurile de re-render;
|
||||
altfel `nomenclator_rar=[]` si picker-ul chips randeaza zero optiuni.
|
||||
"""
|
||||
acct = _create_account_user("corectie.picker@test.com")
|
||||
_login(client, "corectie.picker@test.com")
|
||||
@@ -517,11 +481,7 @@ def test_corectie_eroare_validare_pastreaza_picker(client):
|
||||
|
||||
|
||||
def test_repune_select_afiseaza_denumirea(client):
|
||||
"""Bug fix (code-review 5.15): selectul /repune afiseaza denumirea operatiei.
|
||||
|
||||
Template-ul folosea cheia gresita `item.nome_prestatie` (typo) -> optiunile
|
||||
apareau ca "AAA — " fara denumire. Cheia corecta e `nume_prestatie`.
|
||||
"""
|
||||
"""Selectul /repune afiseaza denumirea operatiei, nu doar codul gol."""
|
||||
acct = _create_account_user("repune.denumire@test.com")
|
||||
_login(client, "repune.denumire@test.com")
|
||||
_seed_cod("AAA", "Schimb ulei motor")
|
||||
@@ -547,16 +507,11 @@ def test_repune_select_afiseaza_denumirea(client):
|
||||
|
||||
|
||||
# ============================================================================= #
|
||||
# Teste noi 5.16: US-004 (denumiri picker), US-005 (add_extra), #
|
||||
# US-006 (save picker fara buton), T-E3 (by-index), T-D1/T-E5, T-C1/T-E4 #
|
||||
# Picker: denumiri, cod extra, salvare fara buton, aliniere by-index #
|
||||
# ============================================================================= #
|
||||
|
||||
def test_picker_flat_arata_cod_si_denumire(client):
|
||||
"""US-004 (5.16): picker plat afiseaza 'cod — denumire', nu doar codul.
|
||||
|
||||
RED: _chips_prestatii.html:147 afiseaza doar {{ n.cod_prestatie }};
|
||||
modul operatii (:101) afiseaza deja 'cod — nume'. Fix: uniformizare.
|
||||
"""
|
||||
"""Picker plat afiseaza 'cod — denumire', nu doar codul."""
|
||||
acct = _create_account_user("picker.flat.denu@test.com")
|
||||
_login(client, "picker.flat.denu@test.com")
|
||||
_seed_cod("FRN1", "Sistem de franare")
|
||||
@@ -580,10 +535,7 @@ def test_picker_flat_arata_cod_si_denumire(client):
|
||||
|
||||
|
||||
def test_adauga_cod_extra_in_mod_operatii(client):
|
||||
"""US-005 (5.16): in mod operatii, actiunea add_extra adauga un cod RAR liber.
|
||||
|
||||
RED: post_form_chips nu are actiunea 'add_extra' -> chips_action ignorata.
|
||||
"""
|
||||
"""In mod operatii, actiunea add_extra adauga un cod RAR liber."""
|
||||
acct = _create_account_user("add.extra.ops@test.com")
|
||||
_login(client, "add.extra.ops@test.com")
|
||||
_seed_cod("OE-1", "Schimb ulei motor")
|
||||
@@ -612,7 +564,7 @@ def test_adauga_cod_extra_in_mod_operatii(client):
|
||||
|
||||
|
||||
def test_extra_cod_persistat_la_salvare(client):
|
||||
"""US-005 (5.16): codul extra adaugat via form-chips e salvat la /corecteaza.
|
||||
"""Codul extra adaugat via form-chips e salvat la /corecteaza.
|
||||
|
||||
Simulam starea form dupa add_extra: hidden inputs pentru op mapata (OE-1)
|
||||
+ hidden inputs pentru chip extra flat (FRN1, fara op_service).
|
||||
@@ -649,10 +601,7 @@ def test_extra_cod_persistat_la_salvare(client):
|
||||
|
||||
|
||||
def test_extra_cod_validat_nomenclator(client):
|
||||
"""US-005 (5.16): add_extra respinge cod necunoscut in nomenclator (invariant ORA-12899).
|
||||
|
||||
RED: actiunea add_extra nu exista; dupa fix, cod invalid nu se adauga.
|
||||
"""
|
||||
"""add_extra respinge cod necunoscut in nomenclator (invariant ORA-12899)."""
|
||||
acct = _create_account_user("extra.valid@test.com")
|
||||
_login(client, "extra.valid@test.com")
|
||||
_seed_cod("OE-1", "Schimb ulei")
|
||||
@@ -681,12 +630,7 @@ def test_extra_cod_validat_nomenclator(client):
|
||||
|
||||
|
||||
def test_cod_ales_in_picker_se_salveaza_fara_buton_add(client):
|
||||
"""US-006 (5.16): codul ales in picker flat se aplica la /corecteaza fara a apasa '+'.
|
||||
|
||||
RED: post_corectie_trimitere citeste form.getlist('cod_prestatie') (hidden inputs)
|
||||
dar ignora 'chips_add_cod_flat' (picker neselectat ca chip) → submission ramane
|
||||
needs_mapping desi codul e ales.
|
||||
"""
|
||||
"""Codul ales in picker flat se aplica la /corecteaza fara a apasa '+'."""
|
||||
acct = _create_account_user("picker.save.nobutton@test.com")
|
||||
_login(client, "picker.save.nobutton@test.com")
|
||||
_seed_cod("OE-1", "Schimb ulei motor")
|
||||
@@ -723,7 +667,7 @@ def test_cod_ales_in_picker_se_salveaza_fara_buton_add(client):
|
||||
|
||||
|
||||
def test_salvare_fara_chip_explicit_nu_e_no_op(client):
|
||||
"""US-006 (5.16): o trimitere needs_mapping cu cod ales in picker nu ramane no-op.
|
||||
"""O trimitere needs_mapping cu cod ales in picker nu ramane no-op.
|
||||
|
||||
Complementar cu test_cod_ales_in_picker_se_salveaza_fara_buton_add: verifica
|
||||
explicit ca statusul se schimba (nu ramane needs_mapping).
|
||||
@@ -759,7 +703,7 @@ def test_salvare_fara_chip_explicit_nu_e_no_op(client):
|
||||
|
||||
|
||||
def test_picker_by_index_op2_nu_op1(client):
|
||||
"""T-E3 (5.16): codul ales pe picker-ul op#2 aterizeaza pe op#2, NU pe op#1.
|
||||
"""Codul ales pe picker-ul op#2 aterizeaza pe op#2, NU pe op#1.
|
||||
|
||||
Verifica alinierea by-index in modul operatii: chips_add_op_index=1 + chips_add_cod_1
|
||||
actualizeaza chips[1] (op#2), nu chips[0] (op#1).
|
||||
@@ -799,11 +743,10 @@ def test_picker_by_index_op2_nu_op1(client):
|
||||
|
||||
|
||||
def test_empty_state_picker_nomenclator_gol(client):
|
||||
"""T-D1/T-E5 (5.16): empty-state vizibil cand nomenclatorul e gol.
|
||||
"""Empty-state vizibil cand nomenclatorul e gol.
|
||||
|
||||
RED: {% if nomenclator_rar %} fara {% else %} -> silentios; un rand needs_mapping
|
||||
fara nomenclator nu are nicio cale de a adauga cod (nereparabil silentios).
|
||||
GREEN: div.chips-nom-gol vizibil.
|
||||
Un rand needs_mapping fara nomenclator randeaza div.chips-nom-gol,
|
||||
altfel nu are nicio cale de a adauga cod.
|
||||
"""
|
||||
acct = _create_account_user("empty.nom@test.com")
|
||||
_login(client, "empty.nom@test.com")
|
||||
@@ -831,10 +774,9 @@ def test_empty_state_picker_nomenclator_gol(client):
|
||||
|
||||
|
||||
def test_add_extra_semnal_vizibil_cod_invalid(client):
|
||||
"""T-C1/T-E4 (5.16): add_extra cu cod invalid da semnal vizibil (nu esua silentios).
|
||||
"""add_extra cu cod invalid da semnal vizibil (nu esua silentios).
|
||||
|
||||
RED: actiunea add_extra nu exista → nu exista niciun semnal.
|
||||
GREEN: div.chips-extra-error vizibil cand codul e invalid sau selectul e gol.
|
||||
div.chips-extra-error vizibil cand codul e invalid sau selectul e gol.
|
||||
"""
|
||||
acct = _create_account_user("extra.err.signal@test.com")
|
||||
_login(client, "extra.err.signal@test.com")
|
||||
|
||||
Reference in New Issue
Block a user