feat(ux): import compact + preview format Trimiteri + navigatie + scoatere auto_send (5.11)
8 stories TDD (echipa Sonnet, lead orchestreaza). US-001 scoate hold-ul auto_send din mapare (has_no_auto_send->False, simbol pastrat; cod rezolvat->queued). US-002 scoate bifa auto_send din UI. US-003 preview pas 3 in format .tabel-trimiteri (STARI_PREVIEW + nota_umana_preview, fara repr Python; view-model prez). US-004 filtre layout/stil ca referinta + buton Custom. US-005 navigatie Trimiteri/Mapari sub contoare pe toate paginile. US-006 import <details> nativ colapsabil. US-007 post-commit reveal (OOB _coada/_status + HX-Trigger). US-008 auto-refresh dupa actiuni (nudge eliminat). VERIFY context curat PASS (8/8). /code-review high: 3 buguri reparate (tab nav la self-refresh, pill Custom valori stale, nota_umana_preview precedenta needs_mapping). 934 passed, 1 skipped. Backend trimitere + schema NEATINSE. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,18 @@
|
||||
"""Teste T6: gate auto_send pe coduri nou-mapate (OV-1).
|
||||
"""Teste T6: comportament dupa US-001 (PRD 5.11) — auto_send nu mai tine randuri.
|
||||
|
||||
Verify:
|
||||
(a) cod nou-mapat cu auto_send=0 -> nu auto-send, review manual.
|
||||
(b) REGRESIE: mapare existenta cu auto_send=1 tot se requeue ca azi.
|
||||
US-001: has_no_auto_send neutralizat (return False); un cod rezolvat (mapare exacta
|
||||
sau regula text) -> queued direct, indiferent de auto_send=0/1 in mapping_meta.
|
||||
|
||||
Coloanele DB operations_mapping.auto_send si operation_text_rules.auto_send RAMAN
|
||||
(default 1, ne-citite pentru hold). Functia has_no_auto_send RAMANE DEFINITA (importata
|
||||
in routes.py + import_router.py) dar intoarce mereu False.
|
||||
|
||||
Inainte de US-001:
|
||||
(a) cod nou-mapat cu auto_send=0 -> nu auto-send, review manual (needs_mapping).
|
||||
(b) mapare existenta cu auto_send=1 -> queued.
|
||||
Dupa US-001:
|
||||
(a) cod nou-mapat cu auto_send=0 -> queued (ca si (b)).
|
||||
(b) mapare existenta cu auto_send=1 -> queued (neschimbat).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -70,6 +80,7 @@ def _add_mapping(conn, account_id=1, cod_op="ITP-CHECK", cod_prestatie="OE-1", a
|
||||
# --- load_mapping_meta ---
|
||||
|
||||
def test_load_mapping_meta_returns_auto_send(conn):
|
||||
"""load_mapping_meta expune coloana auto_send din DB (ramane, default 1)."""
|
||||
from app.mapping import load_mapping_meta
|
||||
_add_mapping(conn, cod_op="ITP-1", cod_prestatie="OE-1", auto_send=True)
|
||||
_add_mapping(conn, cod_op="ITP-2", cod_prestatie="OE-2", auto_send=False)
|
||||
@@ -79,18 +90,20 @@ def test_load_mapping_meta_returns_auto_send(conn):
|
||||
assert meta["ITP-2"]["auto_send"] is False
|
||||
|
||||
|
||||
# --- has_no_auto_send ---
|
||||
# --- has_no_auto_send (neutralizat, mereu False) ---
|
||||
|
||||
def test_has_no_auto_send_detecteaza_false(conn):
|
||||
def test_has_no_auto_send_mereu_false_cu_auto_send_fals(conn):
|
||||
"""has_no_auto_send intoarce False chiar si cand auto_send=False in mapping_meta (US-001)."""
|
||||
from app.mapping import has_no_auto_send
|
||||
mapping_meta = {
|
||||
"ITP-1": {"cod_prestatie": "OE-1", "auto_send": False},
|
||||
}
|
||||
resolved = [{"cod_op_service": "ITP-1", "cod_prestatie": "OE-1"}]
|
||||
assert has_no_auto_send(resolved, mapping_meta) is True
|
||||
assert has_no_auto_send(resolved, mapping_meta) is False
|
||||
|
||||
|
||||
def test_has_no_auto_send_trece_cu_true(conn):
|
||||
def test_has_no_auto_send_mereu_false_cu_auto_send_true(conn):
|
||||
"""has_no_auto_send intoarce False si cand auto_send=True (neschimbat, mereu False)."""
|
||||
from app.mapping import has_no_auto_send
|
||||
mapping_meta = {
|
||||
"ITP-1": {"cod_prestatie": "OE-1", "auto_send": True},
|
||||
@@ -100,46 +113,44 @@ def test_has_no_auto_send_trece_cu_true(conn):
|
||||
|
||||
|
||||
def test_has_no_auto_send_direct_cod_prestatie(conn):
|
||||
"""Item cu cod_prestatie direct (fara cod_op_service) nu e afectat de auto_send."""
|
||||
"""Item cu cod_prestatie direct (fara cod_op_service) -> False (neschimbat)."""
|
||||
from app.mapping import has_no_auto_send
|
||||
mapping_meta = {}
|
||||
resolved = [{"cod_prestatie": "OE-1"}]
|
||||
assert has_no_auto_send(resolved, mapping_meta) is False
|
||||
|
||||
|
||||
# --- reresolve_account cu auto_send=0 ---
|
||||
# --- reresolve_account cu auto_send=0 (US-001: acum requeue) ---
|
||||
|
||||
def test_reresolve_auto_send_zero_nu_requeue(conn):
|
||||
"""(a) cod nou-mapat cu auto_send=0 -> ramane needs_mapping (nu trece pe queued)."""
|
||||
def test_reresolve_auto_send_zero_acum_requeue(conn):
|
||||
"""(US-001) cod nou-mapat cu auto_send=0 -> queued (nu mai review_manual)."""
|
||||
from app.mapping import reresolve_account
|
||||
sid = _insert_needs_mapping(conn, cod_op="ITP-CHECK")
|
||||
_add_mapping(conn, cod_op="ITP-CHECK", cod_prestatie="OE-1", auto_send=False)
|
||||
|
||||
stats = reresolve_account(conn, 1)
|
||||
assert stats["review_manual"] == 1
|
||||
assert stats["requeued"] == 0
|
||||
assert stats["requeued"] == 1, f"asteptat requeued=1, got {stats}"
|
||||
assert stats.get("review_manual", 0) == 0
|
||||
|
||||
row = conn.execute("SELECT status, rar_error FROM submissions WHERE id=?", (sid,)).fetchone()
|
||||
assert row["status"] == "needs_mapping"
|
||||
err = json.loads(row["rar_error"])
|
||||
assert "auto_send" in err
|
||||
row = conn.execute("SELECT status FROM submissions WHERE id=?", (sid,)).fetchone()
|
||||
assert row["status"] == "queued"
|
||||
|
||||
|
||||
def test_reresolve_auto_send_unu_requeue(conn):
|
||||
"""(b) REGRESIE: mapare cu auto_send=1 tot se requeue ca azi."""
|
||||
"""REGRESIE: mapare cu auto_send=1 -> queued (neschimbat)."""
|
||||
from app.mapping import reresolve_account
|
||||
sid = _insert_needs_mapping(conn, cod_op="ITP-CHECK")
|
||||
_add_mapping(conn, cod_op="ITP-CHECK", cod_prestatie="OE-1", auto_send=True)
|
||||
|
||||
stats = reresolve_account(conn, 1)
|
||||
assert stats["requeued"] == 1
|
||||
assert stats["review_manual"] == 0
|
||||
assert stats.get("review_manual", 0) == 0
|
||||
|
||||
row = conn.execute("SELECT status FROM submissions WHERE id=?", (sid,)).fetchone()
|
||||
assert row["status"] == "queued"
|
||||
|
||||
|
||||
# --- POST /v1/prezentari cu auto_send=0 ---
|
||||
# --- POST /v1/prezentari cu auto_send=0 (US-001: acum queued) ---
|
||||
|
||||
def _body_with_op(cod_op="ITP-CHECK"):
|
||||
return {
|
||||
@@ -154,8 +165,8 @@ def _body_with_op(cod_op="ITP-CHECK"):
|
||||
}
|
||||
|
||||
|
||||
def test_post_auto_send_zero_nu_queued(client, env):
|
||||
"""(a) Via API: cod nou-mapat cu auto_send=0 -> nu 'queued', review manual."""
|
||||
def test_post_auto_send_zero_acum_queued(client, env):
|
||||
"""(US-001) Via API: cod nou-mapat cu auto_send=0 -> queued (nu mai needs_mapping)."""
|
||||
from app.db import get_connection
|
||||
conn2 = get_connection()
|
||||
try:
|
||||
@@ -166,12 +177,11 @@ def test_post_auto_send_zero_nu_queued(client, env):
|
||||
r = client.post("/v1/prezentari", json=_body_with_op("ITP-X"))
|
||||
assert r.status_code == 200
|
||||
status = r.json()["results"][0]["status"]
|
||||
assert status != "queued", f"auto_send=0 nu trebuie sa fie queued, e: {status}"
|
||||
assert status == "needs_mapping"
|
||||
assert status == "queued", f"auto_send=0 dupa US-001 -> queued, e: {status}"
|
||||
|
||||
|
||||
def test_post_auto_send_unu_queued(client, env):
|
||||
"""(b) REGRESIE: mapare existenta cu auto_send=1 -> queued ca azi."""
|
||||
"""REGRESIE: mapare existenta cu auto_send=1 -> queued ca inainte."""
|
||||
from app.db import get_connection
|
||||
conn2 = get_connection()
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user