from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def read(path: str) -> str: return (ROOT / path).read_text(encoding="utf-8") def test_no_interest_is_distinct_from_lost_opportunity(): opp = read("app/opportunity_service.py") admin = read("app/admin_dashboard.py") assert '"NO_INTEREST": "Sem interesse"' in opp assert '"MARK_NO_INTEREST": "NO_INTEREST"' in opp assert '"NO_INTEREST": 118' in opp assert '("closed", "Fechadas", ["WON", "LOST", "NO_INTEREST"])' in opp assert '"NO_INTEREST": "Sem interesse"' in admin assert 'não é o mesmo que oportunidade perdida' in admin def test_operations_queue_filters_manually_cleaned_outbox_noise(): ops = read("app/operations_service.py") assert "limpo manualmente" in ops assert "resolvido manualmente" in ops assert "_is_manually_resolved_error" in ops assert "COALESCE(last_error,'') NOT ILIKE '%limpo manualmente%'" in ops assert "Classificação da mensagem falhou" in ops def test_operations_labels_are_not_inbox_labels(): operations_page = read("app/admin_ui/pages/operations.py") assert "Mensagens para revisão" in operations_page assert "Mensagens sem cliente" in operations_page assert "Emails por tratar" not in operations_page assert "Sem cliente', counts.get('communications_without_customer'" not in operations_page def test_ignore_manually_cleaned_outbox_script_exists(): script = read("scripts/ignore_manually_cleaned_outbox.py") assert "limpo manualmente" in script assert "status = 'ignored'" in script assert "--dry-run" in script