This commit is contained in:
2025-08-05 14:39:55 -07:00
parent 5d87be1d96
commit e6c8388ba6

View File

@@ -2,152 +2,98 @@ import pytest
import imaplib import imaplib
from app.imap_service import IMAPService from app.imap_service import IMAPService
from app.models import User, db from app.models import User, db
from unittest.mock import Mock, patch, MagicMock
from app import create_app from app import create_app
class TestIMAPService: class TestIMAPService:
def test_init_with_user(self, app): def test_init_with_user(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
user = User(email='test@example.com', first_name='Test', last_name='User') user.imap_config = {'server': 'test.com', 'port': 993}
user.imap_config = {'server': 'test.com', 'port': 993} imap_service = IMAPService(user)
imap_service = IMAPService(user) assert imap_service.user == user
assert imap_service.user == user assert imap_service.config == {'server': 'test.com', 'port': 993}
assert imap_service.config == {'server': 'test.com', 'port': 993}
def test_init_without_config(self, app): def test_init_without_config(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user)
imap_service = IMAPService(user) assert imap_service.user == user
assert imap_service.user == user assert imap_service.config == {}
assert imap_service.config == {}
def test_test_connection_success(self, mock_imap, app): def test_test_connection_success(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
# Mock successful connection user.imap_config = {'server': 'localhost', 'port': 5143, 'username': 'user1@example.com', 'password': 'password1', 'use_ssl': False}
mock_connection = Mock() imap_service = IMAPService(user)
mock_imap.return_value = mock_connection
mock_connection.login.return_value = None success, message = imap_service.test_connection()
mock_connection.select.return_value = ('OK', [b''])
mock_connection.close.return_value = None assert message == "Connection successful"
mock_connection.logout.return_value = None assert success is True
user = User(email='test@example.com', first_name='Test', last_name='User')
user.imap_config = {'server': 'localhost', 'port': 5143, 'username': 'user1@example.com', 'password': 'password1', 'use_ssl': False}
imap_service = IMAPService(user)
success, message = imap_service.test_connection()
assert message == "Connection successful"
assert success is True
def test_test_connection_failure(self, mock_imap, app): def test_test_connection_failure(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
# Mock failed connection user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
mock_imap.side_effect = Exception("Connection failed") imap_service = IMAPService(user)
user = User(email='test@example.com', first_name='Test', last_name='User') success, message = imap_service.test_connection()
user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
imap_service = IMAPService(user) assert success is False
assert "Connection error" in message
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): def test_test_connection_imap_error(self, mock_imap, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
# Mock IMAP4.error user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
mock_imap.side_effect = imaplib.IMAP4.error("IMAP error") imap_service = IMAPService(user)
user = User(email='test@example.com', first_name='Test', last_name='User') success, message = imap_service.test_connection()
user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
imap_service = IMAPService(user) assert success is False
assert "IMAP connection error" in message
success, message = imap_service.test_connection()
assert success is False
assert "IMAP connection error" in message
def test_test_connection_no_config(self, app): def test_test_connection_no_config(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user)
imap_service = IMAPService(user)
success, message = imap_service.test_connection()
success, message = imap_service.test_connection()
assert success is False
assert success is False assert message == "No IMAP configuration found"
assert message == "No IMAP configuration found"
@patch('app.imap_service.imaplib.IMAP4_SSL') def test_get_folders_success(self, app):
def test_get_folders_success(self, mock_imap, app): user = User(email='test@example.com', first_name='Test', last_name='User')
with app.app_context(): user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
# Mock successful connection and folder listing imap_service = IMAPService(user)
mock_connection = Mock()
mock_imap.return_value = mock_connection folders = imap_service.get_folders()
mock_connection.login.return_value = None
mock_connection.list.return_value = ('OK', [b'(\\HasNoChildren) "INBOX"', b'(\\HasNoChildren) "Sent"', b'(\\HasNoChildren) "Drafts"']) assert len(folders) == 3
mock_connection.close.return_value = None assert folders[0]['name'] == 'INBOX'
mock_connection.logout.return_value = None assert folders[1]['name'] == 'Sent'
assert folders[2]['name'] == 'Drafts'
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): def test_get_folders_empty(self, mock_imap, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
# Mock empty folder listing user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
mock_connection = Mock() imap_service = IMAPService(user)
mock_imap.return_value = mock_connection
mock_connection.login.return_value = None folders = imap_service.get_folders()
mock_connection.list.return_value = ('OK', [])
mock_connection.close.return_value = None assert len(folders) == 0
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, app):
def test_get_folders_error(self, mock_imap, app): user = User(email='test@example.com', first_name='Test', last_name='User')
with app.app_context(): user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'user', 'password': 'pass'}
# Mock error in folder listing imap_service = IMAPService(user)
mock_connection = Mock()
mock_imap.return_value = mock_connection folders = imap_service.get_folders()
mock_connection.login.return_value = None
mock_connection.list.return_value = ('NO', [b'Error']) assert len(folders) == 0
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): def test_get_folders_no_config(self, app):
with app.app_context(): user = User(email='test@example.com', first_name='Test', last_name='User')
user = User(email='test@example.com', first_name='Test', last_name='User') imap_service = IMAPService(user)
imap_service = IMAPService(user)
folders = imap_service.get_folders()
folders = imap_service.get_folders()
assert len(folders) == 0
assert len(folders) == 0
def test_sync_folders_success(self, app): def test_sync_folders_success(self, app):
user = User(email='test@example.com', first_name='Test', last_name='User') user = User(email='test@example.com', first_name='Test', last_name='User')