Files
ASE/test_ftp_send_migration.py
2025-10-11 22:31:54 +02:00

187 lines
6.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Test suite for AsyncFTPConnection class migration.
Tests the new async FTP implementation to ensure it correctly replaces
the blocking ftplib implementation.
Run this test:
python3 test_ftp_send_migration.py
"""
import asyncio
import logging
import sys
from pathlib import Path
# Add src to path
sys.path.insert(0, str(Path(__file__).parent / "src"))
from utils.connect.send_data import AsyncFTPConnection, parse_ftp_parms
# Setup logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
class TestAsyncFTPConnection:
"""Test suite for AsyncFTPConnection class"""
def __init__(self):
self.passed = 0
self.failed = 0
self.test_results = []
async def test_parse_ftp_parms_basic(self):
"""Test 1: Parse basic FTP parameters"""
test_name = "Parse basic FTP parameters"
try:
ftp_parms_str = "port => 21, passive => true, timeout => 30"
result = await parse_ftp_parms(ftp_parms_str)
assert result["port"] == 21, f"Expected port=21, got {result['port']}"
assert result["passive"] == "true", f"Expected passive='true', got {result['passive']}"
assert result["timeout"] == 30, f"Expected timeout=30, got {result['timeout']}"
self.passed += 1
self.test_results.append((test_name, "✓ PASS", None))
logger.info(f"{test_name}: PASS")
except Exception as e:
self.failed += 1
self.test_results.append((test_name, "✗ FAIL", str(e)))
logger.error(f"{test_name}: FAIL - {e}")
async def test_parse_ftp_parms_with_ssl(self):
"""Test 2: Parse FTP parameters with SSL"""
test_name = "Parse FTP parameters with SSL"
try:
ftp_parms_str = "port => 990, ssl_version => TLSv1.2, passive => true"
result = await parse_ftp_parms(ftp_parms_str)
assert result["port"] == 990, f"Expected port=990, got {result['port']}"
assert "ssl_version" in result, "ssl_version key missing"
assert result["ssl_version"] == "tlsv1.2", f"Expected ssl_version='tlsv1.2', got {result['ssl_version']}"
self.passed += 1
self.test_results.append((test_name, "✓ PASS", None))
logger.info(f"{test_name}: PASS")
except Exception as e:
self.failed += 1
self.test_results.append((test_name, "✗ FAIL", str(e)))
logger.error(f"{test_name}: FAIL - {e}")
async def test_async_ftp_connection_init(self):
"""Test 3: Initialize AsyncFTPConnection"""
test_name = "Initialize AsyncFTPConnection"
try:
ftp = AsyncFTPConnection(
host="ftp.example.com",
port=21,
use_tls=False,
user="testuser",
passwd="testpass",
passive=True,
timeout=30.0
)
assert ftp.host == "ftp.example.com", f"Expected host='ftp.example.com', got {ftp.host}"
assert ftp.port == 21, f"Expected port=21, got {ftp.port}"
assert ftp.use_tls is False, f"Expected use_tls=False, got {ftp.use_tls}"
assert ftp.user == "testuser", f"Expected user='testuser', got {ftp.user}"
assert ftp.passwd == "testpass", f"Expected passwd='testpass', got {ftp.passwd}"
assert ftp.timeout == 30.0, f"Expected timeout=30.0, got {ftp.timeout}"
self.passed += 1
self.test_results.append((test_name, "✓ PASS", None))
logger.info(f"{test_name}: PASS")
except Exception as e:
self.failed += 1
self.test_results.append((test_name, "✗ FAIL", str(e)))
logger.error(f"{test_name}: FAIL - {e}")
async def test_async_ftp_connection_tls_init(self):
"""Test 4: Initialize AsyncFTPConnection with TLS"""
test_name = "Initialize AsyncFTPConnection with TLS"
try:
ftp = AsyncFTPConnection(
host="ftps.example.com",
port=990,
use_tls=True,
user="testuser",
passwd="testpass",
passive=True,
timeout=30.0
)
assert ftp.use_tls is True, f"Expected use_tls=True, got {ftp.use_tls}"
assert ftp.port == 990, f"Expected port=990, got {ftp.port}"
self.passed += 1
self.test_results.append((test_name, "✓ PASS", None))
logger.info(f"{test_name}: PASS")
except Exception as e:
self.failed += 1
self.test_results.append((test_name, "✗ FAIL", str(e)))
logger.error(f"{test_name}: FAIL - {e}")
async def test_parse_ftp_parms_empty_values(self):
"""Test 5: Parse FTP parameters with empty values"""
test_name = "Parse FTP parameters with empty values"
try:
ftp_parms_str = "port => 21, user => , passive => true"
result = await parse_ftp_parms(ftp_parms_str)
assert result["port"] == 21, f"Expected port=21, got {result['port']}"
assert result["user"] is None, f"Expected user=None, got {result['user']}"
assert result["passive"] == "true", f"Expected passive='true', got {result['passive']}"
self.passed += 1
self.test_results.append((test_name, "✓ PASS", None))
logger.info(f"{test_name}: PASS")
except Exception as e:
self.failed += 1
self.test_results.append((test_name, "✗ FAIL", str(e)))
logger.error(f"{test_name}: FAIL - {e}")
async def run_all_tests(self):
"""Run all tests"""
logger.info("=" * 60)
logger.info("Starting AsyncFTPConnection Migration Tests")
logger.info("=" * 60)
await self.test_parse_ftp_parms_basic()
await self.test_parse_ftp_parms_with_ssl()
await self.test_async_ftp_connection_init()
await self.test_async_ftp_connection_tls_init()
await self.test_parse_ftp_parms_empty_values()
logger.info("=" * 60)
logger.info(f"Test Results: {self.passed} passed, {self.failed} failed")
logger.info("=" * 60)
if self.failed > 0:
logger.error("\n❌ Some tests failed:")
for test_name, status, error in self.test_results:
if status == "✗ FAIL":
logger.error(f" - {test_name}: {error}")
return False
else:
logger.info("\n✅ All tests passed!")
return True
async def main():
"""Main test runner"""
test_suite = TestAsyncFTPConnection()
success = await test_suite.run_all_tests()
if not success:
sys.exit(1)
if __name__ == "__main__":
asyncio.run(main())