import pytest import imaplib from app.imap_service import IMAPService from app.models import User, db from unittest.mock import Mock, patch, MagicMock from app import create_app class TestIMAPService: def test_init_with_user(self, app): with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993} imap_service = IMAPService(user) assert imap_service.user == user assert imap_service.config == {'server': 'test.com', 'port': 993} def test_init_without_config(self, app): with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user) assert imap_service.user == user assert imap_service.config == {} @patch('app.imap_service.imaplib.IMAP4_SSL') def test_test_connection_success(self, mock_imap, app): with app.app_context(): # Mock successful connection mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.select.return_value = ('OK', [b'']) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.test_connection() assert success is True assert message == "Connection successful" mock_imap.assert_called_once_with('test.com', 993) mock_connection.login.assert_called_once_with('user', 'pass') @patch('app.imap_service.imaplib.IMAP4_SSL') def test_test_connection_failure(self, mock_imap, app): with app.app_context(): # Mock failed connection mock_imap.side_effect = Exception("Connection failed") user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.test_connection() assert success is False assert "Connection error" in message @patch('app.imap_service.imaplib.IMAP4_SSL') def test_test_connection_imap_error(self, mock_imap, app): with app.app_context(): # Mock IMAP4.error mock_imap.side_effect = imaplib.IMAP4.error("IMAP error") user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.test_connection() assert success is False assert "IMAP connection error" in message def test_test_connection_no_config(self, app): with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user) success, message = imap_service.test_connection() assert success is False assert message == "No IMAP configuration found" @patch('app.imap_service.imaplib.IMAP4_SSL') def test_get_folders_success(self, mock_imap, app): with app.app_context(): # Mock successful connection and folder listing mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.list.return_value = ('OK', [b'(\\HasNoChildren) "INBOX"', b'(\\HasNoChildren) "Sent"', b'(\\HasNoChildren) "Drafts"']) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) folders = imap_service.get_folders() assert len(folders) == 3 assert folders[0]['name'] == 'INBOX' assert folders[1]['name'] == 'Sent' assert folders[2]['name'] == 'Drafts' @patch('app.imap_service.imaplib.IMAP4_SSL') def test_get_folders_empty(self, mock_imap, app): with app.app_context(): # Mock empty folder listing mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.list.return_value = ('OK', []) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) folders = imap_service.get_folders() assert len(folders) == 0 @patch('app.imap_service.imaplib.IMAP4_SSL') def test_get_folders_error(self, mock_imap, app): with app.app_context(): # Mock error in folder listing mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.list.return_value = ('NO', [b'Error']) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) folders = imap_service.get_folders() assert len(folders) == 0 @patch('app.imap_service.imaplib.IMAP4_SSL') def test_get_folders_no_config(self, app): with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user) folders = imap_service.get_folders() assert len(folders) == 0 @patch('app.imap_service.imaplib.IMAP4_SSL') def test_sync_folders_success(self, mock_imap, app): with app.app_context(): # Mock successful folder listing and database operations mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.list.return_value = ('OK', [b'(\\HasNoChildren) "INBOX"', b'(\\HasNoChildren) "CustomFolder"', b'(\\HasNoChildren) "AnotherFolder"']) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.sync_folders() assert success is True assert "Successfully synced 2 folders" in message @patch('app.imap_service.imaplib.IMAP4_SSL') def test_sync_folders_no_config(self, mock_imap, app): with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user) success, message = imap_service.sync_folders() assert success is False assert message == "No IMAP configuration found" @patch('app.imap_service.imaplib.IMAP4_SSL') def test_sync_folders_no_folders(self, mock_imap, app): with app.app_context(): # Mock empty folder listing mock_connection = Mock() mock_imap.return_value = mock_connection mock_connection.login.return_value = None mock_connection.list.return_value = ('OK', []) mock_connection.close.return_value = None mock_connection.logout.return_value = None user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.sync_folders() assert success is False assert message == "No folders found on IMAP server" @patch('app.imap_service.imaplib.IMAP4_SSL') def test_sync_folders_exception(self, mock_imap, app): with app.app_context(): # Mock exception during sync mock_imap.side_effect = Exception("Sync error") user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'} imap_service = IMAPService(user) success, message = imap_service.sync_folders() assert success is False assert "Sync error" in message