Reguli text per cont (operation_text_rules), resolve_prestatii cu param aditiv text_rules + precedenta stricta, threadat pe toate cele 6 callsite-uri + valid_codes + seam classify_prezentare. UI Mapari: sectiune reguli + preview pre-salvare + overlap + telemetrie text_rule_hit. UX tabel: cod_rar sub operatie, pill eticheta scurta, fara scroll orizontal (scopat .tabel-trimiteri + carduri <768px), detaliu inline expandabil (a11y + pauza poll). code-review: reparat regula auto_send=0 care trimitea automat la RAR in loc sa tina randul pentru review. 814 passed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
148 lines
5.1 KiB
Python
148 lines
5.1 KiB
Python
"""US-001: Schema + persistenta reguli text de mapare (operation_text_rules).
|
|
|
|
Teste RED-first: verifica tabela, functiile de persistenta si unicitatea per cont.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import tempfile
|
|
|
|
import pytest
|
|
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# Fixtures #
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
@pytest.fixture()
|
|
def env(monkeypatch):
|
|
tmp = tempfile.mkdtemp()
|
|
monkeypatch.setenv("AUTOPASS_DB_PATH", os.path.join(tmp, "text_rules.db"))
|
|
from app.config import get_settings
|
|
get_settings.cache_clear()
|
|
from app.db import init_db
|
|
init_db()
|
|
yield monkeypatch
|
|
get_settings.cache_clear()
|
|
|
|
|
|
@pytest.fixture()
|
|
def conn(env):
|
|
from app.db import get_connection
|
|
c = get_connection()
|
|
yield c
|
|
c.close()
|
|
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# Teste #
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
def test_save_text_rule_persista(conn):
|
|
"""save_text_rule insereaza un rand; load_text_rules il returneaza."""
|
|
from app.mapping import save_text_rule, load_text_rules
|
|
|
|
save_text_rule(conn, account_id=1, pattern="verificare", cod_prestatie="OE-2", auto_send=False)
|
|
conn.commit()
|
|
|
|
rules = load_text_rules(conn, account_id=1)
|
|
assert len(rules) == 1
|
|
r = rules[0]
|
|
assert r["pattern"] == "verificare"
|
|
assert r["cod_prestatie"] == "OE-2"
|
|
assert r["auto_send"] == 0
|
|
assert r["priority"] == 0
|
|
|
|
|
|
def test_load_text_rules_per_cont(conn):
|
|
"""load_text_rules returneaza DOAR regulile contului dat, nu ale altor conturi."""
|
|
from app.mapping import save_text_rule, load_text_rules
|
|
|
|
# Creeaza un cont suplimentar (id=2)
|
|
conn.execute("INSERT INTO accounts (id, name) VALUES (2, 'cont2')")
|
|
conn.commit()
|
|
|
|
save_text_rule(conn, account_id=1, pattern="revizie", cod_prestatie="OE-1", auto_send=False)
|
|
save_text_rule(conn, account_id=2, pattern="vopsitorie", cod_prestatie="OE-3", auto_send=False)
|
|
conn.commit()
|
|
|
|
rules1 = load_text_rules(conn, account_id=1)
|
|
rules2 = load_text_rules(conn, account_id=2)
|
|
|
|
assert len(rules1) == 1
|
|
assert rules1[0]["pattern"] == "revizie"
|
|
assert len(rules2) == 1
|
|
assert rules2[0]["pattern"] == "vopsitorie"
|
|
|
|
|
|
def test_delete_text_rule(conn):
|
|
"""delete_text_rule sterge regula specificata; load_text_rules returneaza lista vida."""
|
|
from app.mapping import save_text_rule, load_text_rules, delete_text_rule
|
|
|
|
save_text_rule(conn, account_id=1, pattern="schimb ulei", cod_prestatie="OE-2", auto_send=True)
|
|
conn.commit()
|
|
|
|
assert len(load_text_rules(conn, account_id=1)) == 1
|
|
|
|
delete_text_rule(conn, account_id=1, pattern="schimb ulei")
|
|
conn.commit()
|
|
|
|
assert load_text_rules(conn, account_id=1) == []
|
|
|
|
|
|
def test_unic_per_cont_pattern(conn):
|
|
"""save_text_rule face upsert: al doilea apel cu acelasi (account_id, pattern)
|
|
actualizeaza cod_prestatie si auto_send, nu creeaza un rand nou."""
|
|
from app.mapping import save_text_rule, load_text_rules
|
|
|
|
save_text_rule(conn, account_id=1, pattern="inspectie", cod_prestatie="OE-1", auto_send=False)
|
|
conn.commit()
|
|
|
|
# Al doilea apel = upsert: schimba codul si auto_send
|
|
save_text_rule(conn, account_id=1, pattern="inspectie", cod_prestatie="OE-2", auto_send=True)
|
|
conn.commit()
|
|
|
|
rules = load_text_rules(conn, account_id=1)
|
|
assert len(rules) == 1 # nu s-a dublat
|
|
assert rules[0]["cod_prestatie"] == "OE-2"
|
|
assert rules[0]["auto_send"] == 1
|
|
|
|
|
|
def test_load_text_rules_ordine(conn):
|
|
"""load_text_rules returneaza regulile ordonate priority ASC, id ASC."""
|
|
from app.mapping import save_text_rule, load_text_rules
|
|
|
|
# Inseram direct cu priority diferit ca sa testam ordinea
|
|
conn.execute(
|
|
"INSERT INTO operation_text_rules (account_id, pattern, cod_prestatie, auto_send, priority) "
|
|
"VALUES (1, 'gamma', 'OE-3', 0, 10)"
|
|
)
|
|
conn.execute(
|
|
"INSERT INTO operation_text_rules (account_id, pattern, cod_prestatie, auto_send, priority) "
|
|
"VALUES (1, 'alfa', 'OE-1', 0, 0)"
|
|
)
|
|
conn.execute(
|
|
"INSERT INTO operation_text_rules (account_id, pattern, cod_prestatie, auto_send, priority) "
|
|
"VALUES (1, 'beta', 'OE-2', 0, 0)"
|
|
)
|
|
conn.commit()
|
|
|
|
rules = load_text_rules(conn, account_id=1)
|
|
# priority 0 inainte de priority 10; la egalitate de priority: id ASC (alfa < beta < gamma)
|
|
assert rules[0]["pattern"] == "alfa"
|
|
assert rules[1]["pattern"] == "beta"
|
|
assert rules[2]["pattern"] == "gamma"
|
|
|
|
|
|
def test_account_or_default_none_equals_1(conn):
|
|
"""load_text_rules cu account_id=None aplica account_or_default -> returneaza regulile contului 1."""
|
|
from app.mapping import save_text_rule, load_text_rules
|
|
|
|
save_text_rule(conn, account_id=None, pattern="reparatie", cod_prestatie="OE-1", auto_send=False)
|
|
conn.commit()
|
|
|
|
rules = load_text_rules(conn, account_id=None)
|
|
assert len(rules) == 1
|
|
assert rules[0]["pattern"] == "reparatie"
|