bmc_hub/tests/test_email_identity_api.py

80 lines
3.5 KiB
Python
Raw Normal View History

import asyncio
import pytest
from app.emails.backend import router
@pytest.mark.parametrize('payload,remember', [
({'customer_id': 42}, True),
({'customer_id': 42, 'remember_domain': False}, False),
])
def test_single_mail_link_preserves_legacy_domain_default(monkeypatch, payload, remember):
writes, mappings = [], []
monkeypatch.setattr(router, 'execute_update', lambda sql, params: writes.append((sql, params)))
monkeypatch.setattr(router, 'execute_query_single', lambda *args: {'sender_email': 'anne@example.dk'})
monkeypatch.setattr(router, '_upsert_domain_mapping', lambda *args: mappings.append(args))
result = asyncio.run(router.link_email(7, payload))
assert result['success']
assert len(writes) == 1
assert bool(mappings) is remember
def test_identity_endpoint_reads_without_updates(monkeypatch):
monkeypatch.setattr(router, 'execute_query_single', lambda *args: {'sender_email': 'anne@example.dk'})
monkeypatch.setattr(router, 'execute_query', lambda *args: [])
def forbidden(*args):
raise AssertionError('Preview must never write')
monkeypatch.setattr(router, 'execute_update', forbidden)
result = asyncio.run(router.get_sender_identity(7))
assert result['address'] == 'anne@example.dk'
assert result['candidates'] == []
def test_unknown_sender_can_be_archived_without_company(monkeypatch):
writes = []
monkeypatch.setattr(router, 'execute_query_single', lambda *args: {
'id': 7, 'subject': 'Ukendt', 'sender_email': 'ukendt@example.dk',
'body_text': '', 'body_html': '', 'classification': 'general',
'confidence_score': 0.5, 'customer_id': None, 'supplier_id': None,
'linked_case_id': None,
})
monkeypatch.setattr(router, 'execute_update', lambda sql, params: writes.append((sql, params)))
result = asyncio.run(router.run_email_quick_action(
7, router.EmailQuickActionRequest(action='archive_entity_mail')
))
assert result == {'success': True, 'action': 'archive_entity_mail', 'message': 'Mailen er arkiveret'}
assert len(writes) == 1
assert "status = 'archived'" in writes[0][0]
def test_queue_counts_are_global_and_mutually_exclusive(monkeypatch):
monkeypatch.setattr(router, 'execute_query_single', lambda sql, *args: {
'active': 7, 'unread': 9, 'awaiting_user_action': 11, 'processed': 3, 'all': 24,
})
result = asyncio.run(router.get_email_queue_counts())
assert result == {'active': 7, 'unread': 9, 'awaiting_user_action': 11, 'processed': 3, 'all': 24}
def test_email_search_includes_message_body(monkeypatch):
calls = []
monkeypatch.setattr(router, 'execute_query', lambda sql, params: calls.append((sql, params)) or [])
result = asyncio.run(router.list_emails(
status=None, classification=None, folder=None, unread=None,
q='router reboot', limit=50, offset=0,
))
assert result == []
sql, params = calls[0]
assert "COALESCE(em.body_text, '') ILIKE %s" in sql
assert params[:4] == ('%router reboot%',) * 4
def test_email_count_uses_the_same_body_search_filter(monkeypatch):
calls = []
monkeypatch.setattr(router, 'execute_query_single', lambda sql, params: calls.append((sql, params)) or {'count': 14})
result = asyncio.run(router.count_emails(
status=None, classification=None, folder=None, unread=True, q='router reboot',
))
assert result == {'count': 14}
sql, params = calls[0]
assert "COALESCE(em.body_text, '') ILIKE %s" in sql
assert params == (False, '%router reboot%', '%router reboot%', '%router reboot%', '%router reboot%')