feat(5.9): US-008 - responsive Acasa (upload/status/filtre) + login/signup
- base.html: bloc @media (max-width:767px) US-008, scopat pe id-urile de pe Acasa - upload (#import-section): drop-zone pe coloana, buton alegere full-width >=44px - filtre (#filtre-trimiteri): o coloana, inputuri/buton full-width >=44px (!important pe latimile inline) - status (#status-bar): randuri aliniate, fara scroll orizontal - login.html/signup.html: clasa .auth-card centrata, max-width:100% pe mobil - tabelul de trimiteri 5.8 neatins (doar verificat intact) - teste noi: test_acasa_fara_scroll_orizontal_mobil, test_login_signup_full_width_mobil - suita: 840 passed, 1 deselected Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ orizontal) sunt deferate la VERIFY (gstack browser).
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
@@ -32,6 +33,29 @@ def _create_account_user(email: str, name: str = "Service", password: str = "par
|
||||
conn.close()
|
||||
|
||||
|
||||
def _insert_submission(acct: int, status: str = "needs_data") -> int:
|
||||
from app.db import get_connection
|
||||
|
||||
conn = get_connection()
|
||||
try:
|
||||
p = {
|
||||
"vin": "WVWZZZ1JZXW000888",
|
||||
"nr_inmatriculare": "B888ZZZ",
|
||||
"data_prestatie": "2026-06-18",
|
||||
"odometru_final": "55000",
|
||||
"prestatii": [{"cod_prestatie": "R-FRANE", "denumire": "Reparatie frane"}],
|
||||
}
|
||||
cur = conn.execute(
|
||||
"INSERT INTO submissions (idempotency_key, account_id, status, payload_json) "
|
||||
"VALUES (?, ?, ?, ?)",
|
||||
(f"k-{status}-{os.urandom(4).hex()}", acct, status, json.dumps(p)),
|
||||
)
|
||||
conn.commit()
|
||||
return int(cur.lastrowid)
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def _login(client, email: str, password: str = "parolasecreta10") -> None:
|
||||
resp = client.get("/login")
|
||||
m = re.search(r'name="csrf_token"\s+value="([^"]+)"', resp.text) or \
|
||||
@@ -214,3 +238,57 @@ def test_carduri_trimiteri_5_8_supravietuiesc(client):
|
||||
assert ".tabel-trimiteri td::before" in mobil
|
||||
# Cele doua mecanisme coexista, scopate distinct.
|
||||
assert ".tabel-card thead" in mobil
|
||||
|
||||
|
||||
# ============================================================
|
||||
# PRD 5.9 US-008: responsive Acasa (upload, status, filtre) + login/signup
|
||||
# ============================================================
|
||||
|
||||
|
||||
def test_acasa_fara_scroll_orizontal_mobil(client):
|
||||
"""US-008: pe Acasa sub 767px zona de upload, bara de status si bara de filtre
|
||||
stiveaza pe O coloana, cu inputuri/butoane full-width >=44px. Verificam ancorele
|
||||
de scope (id-uri) + regulile CSS mobil din base.html (toate sub `@media (max-width:767px)`),
|
||||
fara sa atingem cardurile de trimiteri 5.8 (verificate separat)."""
|
||||
acct = _create_account_user("a8@test.com")
|
||||
_insert_submission(acct) # sectiunea Trimiteri (filtre + wrap) apare doar cu randuri
|
||||
_login(client, "a8@test.com")
|
||||
html = client.get("/?tab=acasa").text
|
||||
|
||||
# Ancore de scope prezente in markup.
|
||||
assert 'id="import-section"' in html
|
||||
assert 'id="status-bar"' in html
|
||||
assert 'id="filtre-trimiteri"' in html
|
||||
assert "US-008" in html
|
||||
|
||||
mobil = html[html.find("@media (max-width:767px)"):]
|
||||
|
||||
# Bara de upload: zona de drop trece pe coloana, butonul de alegere full-width.
|
||||
assert "#import-section .drop-zone" in mobil
|
||||
assert "#import-section #upload-btn" in mobil
|
||||
|
||||
# Bara de filtre: o coloana, controale full-width, buton >=44px.
|
||||
assert "#filtre-trimiteri" in mobil
|
||||
filtre = mobil[mobil.find("#filtre-trimiteri"):]
|
||||
assert "width:100% !important" in filtre # suprascrie latimile inline (max-width:180px etc.)
|
||||
assert "min-height:44px" in mobil
|
||||
|
||||
# Bara de status stiveaza pe coloana (scope dedicat).
|
||||
assert "#status-bar" in mobil
|
||||
|
||||
|
||||
def test_login_signup_full_width_mobil(client):
|
||||
"""US-008: login.html si signup.html randeaza un card centrat (`.auth-card`, margin auto)
|
||||
care nu depaseste latimea pe mobil (max-width:100% sub 767px), cu inputuri full-width.
|
||||
Rutele `/login` si `/signup` sunt publice (fara autentificare)."""
|
||||
for ruta in ("/login", "/signup"):
|
||||
html = client.get(ruta).text
|
||||
# Card de autentificare marcat si centrat.
|
||||
assert "auth-card" in html, ruta
|
||||
assert "margin:40px auto" in html or "margin:24px auto" in html, ruta
|
||||
# Inputurile sunt full-width.
|
||||
assert "width:100%" in html, ruta
|
||||
# Regula mobil: cardul nu depaseste viewport-ul.
|
||||
mobil = html[html.find("@media (max-width:767px)"):]
|
||||
assert ".auth-card" in mobil, ruta
|
||||
assert "max-width:100%" in mobil, ruta
|
||||
|
||||
Reference in New Issue
Block a user