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%')