175 lines
4.8 KiB
Python
175 lines
4.8 KiB
Python
import pytest
|
|
from unittest.mock import Mock, patch
|
|
from app.email_processor import EmailProcessor
|
|
|
|
def test_get_email_destinations_single_email():
|
|
"""Test getting destination for a single email."""
|
|
# Mock user and processor
|
|
mock_user = Mock()
|
|
processor = EmailProcessor(mock_user)
|
|
|
|
# Test data
|
|
emails = [
|
|
{
|
|
'uid': '1',
|
|
'headers': {
|
|
'subject': 'Meeting about Q4 goals',
|
|
'from': 'boss@company.com',
|
|
'to': 'user@company.com',
|
|
'date': '2025-01-15'
|
|
}
|
|
}
|
|
]
|
|
|
|
rules = [
|
|
{
|
|
'name': 'Work',
|
|
'rule_text': 'All work-related emails should go to Work folder',
|
|
'priority': 2
|
|
},
|
|
{
|
|
'name': 'Important',
|
|
'rule_text': 'Emails from boss@company.com should go to Important folder',
|
|
'priority': 1
|
|
}
|
|
]
|
|
|
|
# Mock the API response
|
|
with patch('requests.post') as mock_post:
|
|
mock_post.return_value.status_code = 200
|
|
mock_post.return_value.text = 'Important'
|
|
|
|
result = processor.get_email_destinations(emails, rules)
|
|
|
|
assert result == {'1': 'Important'}
|
|
mock_post.assert_called_once()
|
|
|
|
|
|
def test_get_email_destinations_multiple_emails():
|
|
"""Test getting destinations for multiple emails."""
|
|
mock_user = Mock()
|
|
processor = EmailProcessor(mock_user)
|
|
|
|
emails = [
|
|
{
|
|
'uid': '1',
|
|
'headers': {
|
|
'subject': 'Meeting about Q4 goals',
|
|
'from': 'boss@company.com',
|
|
'to': 'user@company.com',
|
|
'date': '2025-01-15'
|
|
}
|
|
},
|
|
{
|
|
'uid': '2',
|
|
'headers': {
|
|
'subject': 'Dinner plans',
|
|
'from': 'friend@company.com',
|
|
'to': 'user@company.com',
|
|
'date': '2025-01-14'
|
|
}
|
|
}
|
|
]
|
|
|
|
rules = [
|
|
{
|
|
'name': 'Work',
|
|
'rule_text': 'All work-related emails should go to Work folder',
|
|
'priority': 3
|
|
},
|
|
{
|
|
'name': 'Important',
|
|
'rule_text': 'Emails from boss@company.com should go to Important folder',
|
|
'priority': 2
|
|
},
|
|
{
|
|
'name': 'Personal',
|
|
'rule_text': 'All personal emails should go to Personal folder',
|
|
'priority': 1
|
|
}
|
|
]
|
|
|
|
with patch('requests.post') as mock_post:
|
|
# Return different responses for different calls
|
|
mock_post.side_effect = [
|
|
type('', (), {'status_code': 200, 'text': 'Important'})(),
|
|
type('', (), {'status_code': 200, 'text': 'Personal'})()
|
|
]
|
|
|
|
result = processor.get_email_destinations(emails, rules)
|
|
|
|
assert result == {
|
|
'1': 'Important',
|
|
'2': 'Personal'
|
|
}
|
|
assert mock_post.call_count == 2
|
|
|
|
|
|
def test_get_email_destinations_api_failure():
|
|
"""Test behavior when API call fails."""
|
|
mock_user = Mock()
|
|
processor = EmailProcessor(mock_user)
|
|
|
|
emails = [
|
|
{
|
|
'uid': '1',
|
|
'headers': {
|
|
'subject': 'Meeting about Q4 goals',
|
|
'from': 'boss@company.com',
|
|
'to': 'user@company.com',
|
|
'date': '2025-01-15'
|
|
}
|
|
}
|
|
]
|
|
|
|
rules = [
|
|
{
|
|
'name': 'Work',
|
|
'rule_text': 'All work-related emails should go to Work folder',
|
|
'priority': 1
|
|
}
|
|
]
|
|
|
|
with patch('requests.post') as mock_post:
|
|
mock_post.return_value.status_code = 500
|
|
|
|
result = processor.get_email_destinations(emails, rules)
|
|
|
|
# Should return empty dict on failure
|
|
assert result == {}
|
|
mock_post.assert_called_once()
|
|
|
|
|
|
def test_get_email_destinations_no_matching_rules():
|
|
"""Test when no rules match and email should stay in INBOX."""
|
|
mock_user = Mock()
|
|
processor = EmailProcessor(mock_user)
|
|
|
|
emails = [
|
|
{
|
|
'uid': '1',
|
|
'headers': {
|
|
'subject': 'Newsletter',
|
|
'from': 'newsletter@company.com',
|
|
'to': 'user@company.com',
|
|
'date': '2025-01-15'
|
|
}
|
|
}
|
|
]
|
|
|
|
rules = [
|
|
{
|
|
'name': 'Work',
|
|
'rule_text': 'All work-related emails should go to Work folder',
|
|
'priority': 1
|
|
}
|
|
]
|
|
|
|
with patch('requests.post') as mock_post:
|
|
mock_post.return_value.status_code = 200
|
|
mock_post.return_value.text = 'INBOX'
|
|
|
|
result = processor.get_email_destinations(emails, rules)
|
|
|
|
assert result == {'1': 'INBOX'}
|
|
mock_post.assert_called_once() |