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:
160
tests/test_web_mapari.py
Normal file
160
tests/test_web_mapari.py
Normal file
@@ -0,0 +1,160 @@
|
||||
"""Teste US-002 (PRD 5.11) — scoate bifa auto_send din UI.
|
||||
|
||||
Verifica ca bifa "In coada automat" (macro autosend_toggle) nu mai apare in:
|
||||
- tab-ul Mapari (/_fragments/mapari)
|
||||
- panoul de mapare din preview (pas 3 import)
|
||||
- panoul de detaliu trimitere (_trimitere_detaliu.html)
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import csv
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
|
||||
import pytest
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def client(monkeypatch):
|
||||
tmp = tempfile.mkdtemp()
|
||||
monkeypatch.setenv("AUTOPASS_DB_PATH", os.path.join(tmp, "us002.db"))
|
||||
monkeypatch.setenv("AUTOPASS_WEB_AUTH_REQUIRED", "false")
|
||||
from app.config import get_settings
|
||||
get_settings.cache_clear()
|
||||
from app.main import app
|
||||
with TestClient(app) as c:
|
||||
yield c
|
||||
get_settings.cache_clear()
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def conn(client):
|
||||
from app.db import get_connection
|
||||
c = get_connection()
|
||||
yield c
|
||||
c.close()
|
||||
|
||||
|
||||
def _csv_bytes(rows: list[dict]) -> bytes:
|
||||
buf = io.StringIO()
|
||||
writer = csv.DictWriter(buf, fieldnames=list(rows[0].keys()), delimiter=";")
|
||||
writer.writeheader()
|
||||
writer.writerows(rows)
|
||||
return buf.getvalue().encode("utf-8")
|
||||
|
||||
|
||||
def _seed_nomenclator(conn, cod="OE-1"):
|
||||
conn.execute(
|
||||
"INSERT OR IGNORE INTO nomenclator_rar (cod_prestatie, nume_prestatie) VALUES (?, ?)",
|
||||
(cod, f"Operatie {cod}"),
|
||||
)
|
||||
conn.execute(
|
||||
"INSERT OR IGNORE INTO operations_mapping (account_id, cod_op_service, cod_prestatie, auto_send) "
|
||||
"VALUES (1, 'OP-EXISTENT', ?, 1)",
|
||||
(cod,),
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
|
||||
def test_mapari_fara_toggle_autosend(client, conn):
|
||||
"""GET /_fragments/mapari nu contine checkbox auto_send sau coloana 'In coada'.
|
||||
|
||||
Dupa US-002: macro autosend_toggle golit; coloana In coada scoasa din toate tabelele.
|
||||
"""
|
||||
_seed_nomenclator(conn)
|
||||
r = client.get("/_fragments/mapari")
|
||||
assert r.status_code == 200
|
||||
body = r.text
|
||||
assert 'name="auto_send"' not in body, (
|
||||
"tab-ul Mapari nu trebuie sa contina input auto_send dupa US-002"
|
||||
)
|
||||
assert "autosend-toggle" not in body, (
|
||||
"tab-ul Mapari nu trebuie sa contina clasa autosend-toggle dupa US-002"
|
||||
)
|
||||
assert "In coada" not in body, (
|
||||
"tab-ul Mapari nu trebuie sa contina coloana 'In coada' dupa US-002"
|
||||
)
|
||||
|
||||
|
||||
def test_preview_panou_mapare_fara_autosend(client):
|
||||
"""Panoul de mapare din preview (pas 3) nu contine checkbox auto_send.
|
||||
|
||||
Dupa US-002: macro autosend_toggle golit din _preview_import.html.
|
||||
"""
|
||||
# Upload CSV cu operatie nemapata -> map coloane -> ajunge la preview
|
||||
rows = [
|
||||
{"VIN": "WVWZZZ1KZAW000123", "Nr inmatriculare": "B001TST",
|
||||
"Data prestatie": "15.06.2026", "Odometru final": "123456",
|
||||
"Operatie": "OP-NEMAPATA-US002"},
|
||||
]
|
||||
data = _csv_bytes(rows)
|
||||
r = client.post("/_import/upload", files={"file": ("test.csv", data, "text/csv")})
|
||||
assert r.status_code == 200
|
||||
m = re.search(r"/_import/(\d+)/mapare-coloane", r.text)
|
||||
assert m, f"Nu am gasit import_id in raspuns: {r.text[:300]}"
|
||||
import_id = int(m.group(1))
|
||||
|
||||
# Salveaza maparea coloanelor -> genereaza preview
|
||||
r = client.post(f"/_import/{import_id}/mapare-coloane", data={
|
||||
"colname": ["VIN", "Nr inmatriculare", "Data prestatie", "Odometru final", "Operatie"],
|
||||
"canon": ["vin", "nr_inmatriculare", "data_prestatie", "odometru_final", "operatie"],
|
||||
"format_data": "DD.MM.YYYY",
|
||||
})
|
||||
assert r.status_code == 200
|
||||
|
||||
# Obtine preview-ul HTML (ar trebui sa aiba panoul de mapare cu OP-NEMAPATA-US002)
|
||||
r2 = client.get(f"/_import/{import_id}/preview")
|
||||
assert r2.status_code == 200
|
||||
body = r2.text
|
||||
# Panoul de mapare apare (operatia nemapata e prezenta)
|
||||
assert "OP-NEMAPATA-US002" in body, "preview-ul trebuie sa contina operatia nemapata"
|
||||
# Fara bifa auto_send
|
||||
assert 'name="auto_send"' not in body, (
|
||||
"preview-ul nu trebuie sa contina input auto_send dupa US-002"
|
||||
)
|
||||
assert "autosend-toggle" not in body, (
|
||||
"preview-ul nu trebuie sa contina clasa autosend-toggle dupa US-002"
|
||||
)
|
||||
assert "In coada automat" not in body, (
|
||||
"preview-ul nu trebuie sa contina 'In coada automat' dupa US-002"
|
||||
)
|
||||
|
||||
|
||||
def test_detaliu_mapare_inline_fara_autosend(client, conn):
|
||||
"""GET /_fragments/trimitere/{id} cu needs_mapping nu contine checkbox auto_send.
|
||||
|
||||
Dupa US-002: macro autosend_toggle golit din _trimitere_detaliu.html.
|
||||
"""
|
||||
conn.execute(
|
||||
"INSERT OR IGNORE INTO nomenclator_rar (cod_prestatie, nume_prestatie) VALUES ('OE-1', 'Test')"
|
||||
)
|
||||
payload = {
|
||||
"vin": "WVWZZZ1KZAW000123", "nr_inmatriculare": "B1",
|
||||
"data_prestatie": "2026-06-15", "odometru_final": "123456",
|
||||
"prestatii": [{"cod_op_service": "ITP-US002", "denumire": "Inspectie",
|
||||
"cod_prestatie": None}],
|
||||
}
|
||||
sid = conn.execute(
|
||||
"INSERT INTO submissions (idempotency_key, account_id, status, payload_json, rar_error) "
|
||||
"VALUES (?, ?, ?, ?, ?)",
|
||||
("k-us002-det", 1, "needs_mapping", json.dumps(payload),
|
||||
json.dumps({"unmapped": [{"cod_op_service": "ITP-US002"}]})),
|
||||
).lastrowid
|
||||
conn.commit()
|
||||
|
||||
r = client.get(f"/_fragments/trimitere/{sid}")
|
||||
assert r.status_code == 200
|
||||
body = r.text
|
||||
# Operatia nemapata e afisata
|
||||
assert "ITP-US002" in body, "detaliul trebuie sa contina operatia nemapata"
|
||||
assert 'name="auto_send"' not in body, (
|
||||
"detaliul nu trebuie sa contina input auto_send dupa US-002"
|
||||
)
|
||||
assert "autosend-toggle" not in body, (
|
||||
"detaliul nu trebuie sa contina clasa autosend-toggle dupa US-002"
|
||||
)
|
||||
Reference in New Issue
Block a user