imap progress
This commit is contained in:
63
tests/test_imap_routes.py
Normal file
63
tests/test_imap_routes.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import pytest
|
||||
from app import create_app
|
||||
from app.models import User, db, Folder
|
||||
|
||||
class TestIMAPRoutes:
|
||||
def test_imap_config_modal(self, client):
|
||||
# Create a test user and log in
|
||||
user = User(email='test@example.com', first_name='Test', last_name='User')
|
||||
user.set_password('password')
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
client.post('/auth/login', data={
|
||||
'email': 'test@example.com',
|
||||
'password': 'password'
|
||||
})
|
||||
|
||||
response = client.get('/api/imap/config')
|
||||
assert response.status_code == 200
|
||||
assert b'Configure IMAP Connection' in response.data
|
||||
|
||||
def test_imap_connection_test_success(self, client, app):
|
||||
with app.app_context():
|
||||
# Create a test user and log in
|
||||
user = User(email='test2@example.com', first_name='Test', last_name='User')
|
||||
user.set_password('password')
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
client.post('/auth/login', data={
|
||||
'email': 'test2@example.com',
|
||||
'password': 'password'
|
||||
})
|
||||
|
||||
response = client.post('/api/imap/test', data={
|
||||
'server': 'test.com',
|
||||
'port': '993',
|
||||
'username': 'test@test.com',
|
||||
'password': 'testpass',
|
||||
'use_ssl': 'on'
|
||||
})
|
||||
|
||||
assert response.status_code == 200
|
||||
# Should show either success or error message
|
||||
assert b'Test Connection' in response.data
|
||||
|
||||
def test_imap_sync_folders(self, client, app):
|
||||
with app.app_context():
|
||||
# Create a test user and log in
|
||||
user = User(email='test3@example.com', first_name='Test', last_name='User')
|
||||
user.set_password('password')
|
||||
user.imap_config = {'server': 'test.com', 'port': 993, 'username': 'test', 'password': 'pass'}
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
client.post('/auth/login', data={
|
||||
'email': 'test3@example.com',
|
||||
'password': 'password'
|
||||
})
|
||||
|
||||
response = client.post('/api/imap/sync')
|
||||
# Should fail without real IMAP server but return proper response
|
||||
assert response.status_code in [200, 400]
|
||||
220
tests/test_imap_service.py
Normal file
220
tests/test_imap_service.py
Normal file
@@ -0,0 +1,220 @@
|
||||
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
|
||||
Reference in New Issue
Block a user