FactsDB/tests/test_ftp_server_ext.py
Jarian Cottingham 93e287f88b test: add comprehensive test suite with 95% coverage
- 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
2026-07-06 16:27:51 +00:00

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