- Add pytest test suite across all modules (config, database, file_processor, ai_processor, api, scheduler, monitoring, ftp_server) - 145 tests covering normal paths, error handling, edge cases - Mock external dependencies (AI endpoint, requests, pyftpdlib) - 95% code coverage with fail-under=90 threshold in CI - Update CI workflow to run pytest with coverage enforcement - Add pyproject.toml with pytest/coverage configuration
74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
"""Extended tests for ftp_server: start/stop logic."""
|
|
|
|
import pytest
|
|
from unittest.mock import patch, MagicMock
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def mock_pyftpdlib():
|
|
"""Mock pyftpdlib for all FTP tests."""
|
|
with patch.dict("sys.modules", {
|
|
"pyftpdlib": MagicMock(),
|
|
"pyftpdlib.authorizers": MagicMock(),
|
|
"pyftpdlib.handlers": MagicMock(),
|
|
"pyftpdlib.servers": MagicMock(),
|
|
}):
|
|
yield
|
|
|
|
|
|
class MockConfig:
|
|
def __init__(self):
|
|
self.ftp_server = MagicMock()
|
|
self.ftp_server.host = "0.0.0.0"
|
|
self.ftp_server.port = 2121
|
|
self.ftp_server.username = "testuser"
|
|
self.ftp_server.password = "testpass"
|
|
self.database = MagicMock()
|
|
|
|
|
|
class TestFtpStartStop:
|
|
def test_start_success(self, mock_pyftpdlib):
|
|
from factsdb.ftp_server import FTPServerManager
|
|
cfg = MockConfig()
|
|
mgr = FTPServerManager(cfg)
|
|
with patch.object(mgr, "_run_server"):
|
|
mgr.start()
|
|
assert mgr.is_running is True
|
|
assert mgr.server is not None
|
|
mgr.stop()
|
|
|
|
def test_stop(self, mock_pyftpdlib):
|
|
from factsdb.ftp_server import FTPServerManager
|
|
cfg = MockConfig()
|
|
mgr = FTPServerManager(cfg)
|
|
mgr.server = MagicMock()
|
|
mgr.is_running = True
|
|
mgr.stop()
|
|
assert mgr.is_running is False
|
|
mgr.server.close_all.assert_called_once()
|
|
|
|
def test_stop_no_server(self, mock_pyftpdlib):
|
|
from factsdb.ftp_server import FTPServerManager
|
|
cfg = MockConfig()
|
|
mgr = FTPServerManager(cfg)
|
|
mgr.server = None
|
|
mgr.is_running = True
|
|
mgr.stop()
|
|
assert mgr.server is None
|
|
|
|
def test_run_server(self, mock_pyftpdlib):
|
|
from factsdb.ftp_server import FTPServerManager
|
|
cfg = MockConfig()
|
|
mgr = FTPServerManager(cfg)
|
|
mock_server = MagicMock()
|
|
mgr.server = mock_server
|
|
# Call serve_forever once then stop to avoid blocking
|
|
call_count = [0]
|
|
def mock_forever():
|
|
call_count[0] += 1
|
|
if call_count[0] > 1:
|
|
return
|
|
mock_server.serve_forever.side_effect = mock_forever
|
|
mgr._run_server()
|
|
assert call_count[0] >= 1
|