feat(5.19): auto-send toggle per cont + tinere manuala randuri (held)
Comutator accounts.auto_send_enabled per cont: Auto OFF (default) tine randurile
la ingestie (submissions.held=1), worker-ul (claim_one AND held=0) le sare pana la
eliberare umana (per rand/bulk/auto-release OFF->ON). Snapshot held prin chokepoint
unic held_for_account pe toate caile de ingestie (API, import, reresolve, reactivare).
- schema/migrare: coloana held + index partial idx_submissions_held; auto_send_enabled
- API: echo onest held+motiv (US-010), ruta /prezentari/{id}/trimite-acum
- web: toggle header, modal confirmare tipata, buton Trimite per rand + Trimite toate,
banner coada tinuta imbatranita (L.142), contor "In asteptare (manual)"
- worker: expire_held (US-008, inchide gaura retentie PII), metrics held gauges
- ops: tools/carantina_held + runbook rollback (R4)
Nota review (/code-review high): re-snapshot held lipseste pe caile repune/corectie
(requeue_submission, post_corectie, bulk-fix) — de aliniat separat cu create_prezentari.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,69 @@ os.environ.setdefault("AUTOPASS_EMBEDDINGS_ENABLED", "false")
|
||||
os.environ.setdefault("AUTOPASS_SEED_OPERATII_ENABLED", "false")
|
||||
|
||||
|
||||
# Referinta la init_db-ul REAL (nemodificat), capturata O SINGURA DATA la prima rulare a
|
||||
# fixturii de mai jos. Wrapper-ul o refoloseste ca sa nu se auto-imbrace recursiv.
|
||||
_REAL_INIT_DB = None
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def _auto_send_on_default_account(request, monkeypatch):
|
||||
"""PRD 5.19 US-009: contul default id=1 (seed schema.sql, INSERT OR IGNORE) porneste pe
|
||||
`auto_send_enabled=0` (Auto OFF) — corect in productie (nimic nu pleaca fara confirmare).
|
||||
|
||||
Dar suita exercita lantul `POST -> claim_one -> sent` pe contul id=1
|
||||
(test_import_e2e, test_creds_delivery, test_live_rar): cu Auto OFF, ingestia ar marca
|
||||
`held=1` (US-002) si worker-ul (`claim_one ... AND held=0`, US-003) nu ar mai lua randul
|
||||
-> testele ar stagna tacit. E un fix de STARE DB, nu env var (coloana e per-rand in
|
||||
`accounts`), deci il aplicam wraparind `init_db` (contul id=1 NU e creat de `create_account`
|
||||
-> un patch pe factory NU l-ar acoperi — Eng HIGH).
|
||||
|
||||
Wrapam `init_db` astfel incat orice DB de test creat sa aiba id=1 pe Auto ON (held=0 la
|
||||
ingestie), pastrand suita verde ca inainte de 5.19. Conturile create explicit de teste
|
||||
(`create_account`) raman pe default OFF -> testele care VOR Auto OFF il primesc corect.
|
||||
|
||||
Testele care verifica DEFAULT-ul brut (id=1 == 0 imediat dupa init_db) se exclud cu
|
||||
markerul `no_auto_send_seed`.
|
||||
"""
|
||||
global _REAL_INIT_DB
|
||||
import sys
|
||||
|
||||
import app.db as _db
|
||||
|
||||
if _REAL_INIT_DB is None:
|
||||
_REAL_INIT_DB = _db.init_db
|
||||
|
||||
if request.node.get_closest_marker("no_auto_send_seed"):
|
||||
yield
|
||||
return
|
||||
|
||||
def _init_db_auto_on():
|
||||
_REAL_INIT_DB()
|
||||
conn = _db.get_connection()
|
||||
try:
|
||||
conn.execute("UPDATE accounts SET auto_send_enabled=1 WHERE id=1")
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
# app.db.init_db: acopera fixturile care fac `from app.db import init_db` in corpul lor
|
||||
# (importul ruleaza DUPA acest patch -> primeste wrapper-ul) + apelurile `app.db.init_db()`.
|
||||
monkeypatch.setattr(_db, "init_db", _init_db_auto_on)
|
||||
# app.main.init_db: lifespan-ul TestClient cheama numele importat la nivel de modul
|
||||
# (`from .db import init_db`); daca app.main e deja importat, patch-uim si referinta lui.
|
||||
# Daca NU e inca importat, primul `from app.main import app` din test il va lega la
|
||||
# wrapper-ul de mai sus automat (citeste app.db.init_db la momentul importului).
|
||||
_main = sys.modules.get("app.main")
|
||||
if _main is not None:
|
||||
monkeypatch.setattr(_main, "init_db", _init_db_auto_on, raising=False)
|
||||
yield
|
||||
# Anti-leak: daca app.main a fost importat IN timpul testului (legand wrapper-ul la
|
||||
# import, nu prin monkeypatch), readu-l la init_db-ul real ca sa nu ramana wrapat global.
|
||||
_main = sys.modules.get("app.main")
|
||||
if _main is not None and getattr(_main, "init_db", None) is _init_db_auto_on:
|
||||
_main.init_db = _REAL_INIT_DB
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def _reset_embeddings_singleton():
|
||||
"""Reseteaza singleton-ul global de embeddings intre teste (izolare de ordine).
|
||||
@@ -69,3 +132,8 @@ def pytest_configure(config):
|
||||
config.addinivalue_line(
|
||||
"markers", "live: test live pe RAR test (necesita AUTOPASS_LIVE_RAR=1 + creds reale)"
|
||||
)
|
||||
config.addinivalue_line(
|
||||
"markers",
|
||||
"no_auto_send_seed: dezactiveaza fixtura autouse care pune id=1 pe Auto ON "
|
||||
"(teste care verifica default-ul brut auto_send_enabled=0 al contului id=1)",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user