from app.services.email_sender_identity import find_sender_candidates def test_shared_contact_and_domain_preserve_all_companies(): calls = [] def query(sql, params): calls.append(params) if len(calls) == 1: return [dict(id=1, name='Hus A', kind='customer', source='contact_email', contact_name='Anne'), dict(id=2, name='Hus B', kind='customer', source='contact_email', contact_name='Anne')] return [dict(id=1, name='Hus A', kind='customer', source='exact_domain'), dict(id=3, name='Leverandør', kind='vendor', source='exact_domain')] result = find_sender_candidates('Anne ', query) assert result['address'] == 'anne@example.dk' assert result['ambiguous'] is True assert [(r['kind'], r['id']) for r in result['candidates']] == [('customer', 1), ('customer', 2), ('vendor', 3)] assert result['candidates'][0]['contact_name'] == 'Anne' assert calls[0] == ('anne@example.dk',) * 4 def test_public_domain_can_match_exact_contact_but_never_domain(): calls = [] def query(sql, params): calls.append(sql) return [dict(id=2, name='Kunden', kind='customer', source='contact_email')] result = find_sender_candidates('person@gmail.com', query, {'gmail.com'}) assert len(calls) == 1 assert not result['ambiguous'] def test_missing_address_does_not_query_database(): def forbidden(*args): raise AssertionError('No DB query expected') assert find_sender_candidates('', forbidden)['candidates'] == [] def test_supplier_contact_matches_person_before_supplier_domain(): def query(sql, params): if 'JOIN vendor_contacts' in sql: assert 'vc.contact_id = ct.id' in sql assert 'v.id = vc.vendor_id' in sql assert params == ('person@example.dk',) * 4 return [dict(id=8, name='Leverandør A', kind='vendor', source='contact_email', contact_id=12, contact_name='Kontaktperson')] return [dict(id=8, name='Leverandør A', kind='vendor', source='exact_domain')] result = find_sender_candidates('Person ', query) assert not result['ambiguous'] assert len(result['candidates']) == 1 assert result['candidates'][0]['source'] == 'contact_email' assert result['candidates'][0]['contact_id'] == 12