"""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