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()