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>
101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
"""Zona de upload comprimata la o bara slim.
|
|
|
|
Cand contul are deja trimiteri, upload-ul devine o bara pe un rand (eticheta + buton
|
|
+ zona de trage). First-run pastreaza hero-ul "Primul fisier?". Drag-drop + input file
|
|
+ select-foaie (multi-sheet) raman functionale.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import io
|
|
import json
|
|
import os
|
|
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, "slim.db"))
|
|
monkeypatch.setenv("AUTOPASS_WEB_AUTH_REQUIRED", "false")
|
|
from app.config import get_settings
|
|
get_settings.cache_clear()
|
|
from app.crypto import reset_cache
|
|
reset_cache()
|
|
from app.main import app
|
|
with TestClient(app) as c:
|
|
yield c
|
|
get_settings.cache_clear()
|
|
reset_cache()
|
|
|
|
|
|
def _seed_submission() -> None:
|
|
from app.db import get_connection
|
|
conn = get_connection()
|
|
try:
|
|
conn.execute(
|
|
"INSERT INTO submissions (idempotency_key, account_id, status, payload_json) "
|
|
"VALUES (?, 1, 'sent', ?)",
|
|
(f"k-{os.urandom(5).hex()}",
|
|
json.dumps({"vin": "WVWZZZ1KZAW000123", "prestatii": [{"cod_prestatie": "R-FRANE"}]})),
|
|
)
|
|
conn.commit()
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def _multi_sheet_xlsx() -> bytes:
|
|
openpyxl = pytest.importorskip("openpyxl")
|
|
wb = openpyxl.Workbook()
|
|
ws1 = wb.active
|
|
ws1.title = "Iunie"
|
|
ws1.append(["VIN", "Nr inmatriculare", "Data prestatie", "Odometru final", "Operatie"])
|
|
ws1.append(["WVWZZZ1KZAW000123", "B001TST", "2026-06-10", "123456", "OP-1"])
|
|
ws2 = wb.create_sheet("Mai")
|
|
ws2.append(["VIN", "Nr inmatriculare", "Data prestatie", "Odometru final", "Operatie"])
|
|
ws2.append(["WVWZZZ1KZAW000999", "B009TST", "2026-05-10", "55000", "OP-1"])
|
|
buf = io.BytesIO()
|
|
wb.save(buf)
|
|
return buf.getvalue()
|
|
|
|
|
|
def test_upload_slim_pe_un_rand(client):
|
|
"""Cand contul are trimiteri, bara de upload e compacta ('Importa:'), fara hero-ul mare."""
|
|
_seed_submission()
|
|
r = client.get("/?tab=acasa")
|
|
assert r.status_code == 200
|
|
html = r.text
|
|
assert "Importa:" in html, "bara slim ('Importa:') lipseste cand contul are trimiteri"
|
|
assert "Primul fisier" not in html, "hero-ul mare nu ar trebui sa apara pentru un cont cu trimiteri"
|
|
|
|
|
|
def test_first_run_pastreaza_hero(client):
|
|
"""First-run (zero trimiteri): hero-ul 'Primul fisier?' este pastrat."""
|
|
r = client.get("/?tab=acasa")
|
|
assert r.status_code == 200
|
|
assert "Primul fisier" in r.text
|
|
|
|
|
|
def test_upload_pastreaza_drag_drop_si_input(client):
|
|
"""Input file ascuns + handler drag-drop raman functionale (JS refolosit)."""
|
|
r = client.get("/_import/reset")
|
|
assert r.status_code == 200
|
|
html = r.text
|
|
assert 'id="file-input"' in html
|
|
assert 'id="drop-zone"' in html
|
|
assert "dragover" in html and "drop" in html
|
|
|
|
|
|
def test_upload_pastreaza_select_foaie(client):
|
|
"""Cazul multi-sheet inca apare: selectorul de foaie e prezent."""
|
|
data = _multi_sheet_xlsx()
|
|
r = client.post(
|
|
"/_import/upload",
|
|
files={"file": ("multi.xlsx", io.BytesIO(data), "application/octet-stream")},
|
|
)
|
|
assert r.status_code == 200, r.text
|
|
assert 'name="sheet_name"' in r.text
|