#!/usr/bin/env python3 """ Test script per verificare la migrazione FTP con aiomysql. Questo script crea file CSV di test e verifica che il server FTP li riceva e processi correttamente usando le nuove funzioni async. NOTA: Questo script richiede che il server FTP sia in esecuzione. Usage: # Terminal 1: Avvia il server FTP python src/ftp_csv_receiver.py # Terminal 2: Esegui i test python test_ftp_migration.py """ import logging import os import sys import tempfile from datetime import datetime from ftplib import FTP from pathlib import Path # Add src directory to Python path src_path = Path(__file__).parent / "src" sys.path.insert(0, str(src_path)) # Setup logging logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # FTP Configuration (adjust as needed) FTP_CONFIG = { "host": "localhost", "port": 2121, "user": "asega", # Adjust with your FTP admin user "password": "batt1l0", # Adjust with your FTP admin password } # Test data configurations TEST_CSV_TEMPLATES = { "simple": """Unit: TEST_UNIT Tool: TEST_TOOL Timestamp: {timestamp} Data line 1 Data line 2 Data line 3 """, "with_separator": """Unit: TEST_UNIT Tool: TEST_TOOL Timestamp: {timestamp} Header ;|;10;|;20;|;30 ;|;11;|;21;|;31 ;|;12;|;22;|;32 """, } def create_test_csv(template_name="simple"): """Create a temporary CSV file for testing.""" timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") content = TEST_CSV_TEMPLATES[template_name].format(timestamp=timestamp) # Create temp file fd, filepath = tempfile.mkstemp(suffix=".csv", prefix=f"test_ftp_{timestamp}_") with os.fdopen(fd, "w") as f: f.write(content) logger.info(f"Created test file: {filepath}") return filepath def connect_ftp(): """Connect to FTP server.""" try: ftp = FTP() ftp.connect(FTP_CONFIG["host"], FTP_CONFIG["port"]) ftp.login(FTP_CONFIG["user"], FTP_CONFIG["password"]) logger.info(f"✅ Connected to FTP server {FTP_CONFIG['host']}:{FTP_CONFIG['port']}") return ftp except Exception as e: logger.error(f"❌ Failed to connect to FTP server: {e}") logger.error("Make sure the FTP server is running: python src/ftp_csv_receiver.py") return None def test_ftp_connection(): """Test 1: Basic FTP connection.""" logger.info("\n" + "=" * 60) logger.info("TEST 1: FTP Connection Test") logger.info("=" * 60) ftp = connect_ftp() if ftp: try: # Test PWD command pwd = ftp.pwd() logger.info(f"✅ Current directory: {pwd}") # Test LIST command files = [] ftp.retrlines("LIST", files.append) logger.info(f"✅ Directory listing retrieved ({len(files)} items)") ftp.quit() logger.info("✅ FTP connection test passed") return True except Exception as e: logger.error(f"❌ FTP connection test failed: {e}") return False return False def test_file_upload(): """Test 2: File upload to FTP server.""" logger.info("\n" + "=" * 60) logger.info("TEST 2: File Upload Test") logger.info("=" * 60) ftp = connect_ftp() if not ftp: return False try: # Create test file test_file = create_test_csv("simple") filename = os.path.basename(test_file) # Upload file with open(test_file, "rb") as f: logger.info(f"Uploading {filename}...") response = ftp.storbinary(f"STOR {filename}", f) logger.info(f"Server response: {response}") # Verify file was uploaded (might not be visible if processed immediately) logger.info("✅ File uploaded successfully") # Cleanup os.remove(test_file) ftp.quit() logger.info("✅ File upload test passed") logger.info(" Check server logs to verify file was processed") return True except Exception as e: logger.error(f"❌ File upload test failed: {e}") try: ftp.quit() except: pass return False def test_multiple_uploads(): """Test 3: Multiple concurrent file uploads.""" logger.info("\n" + "=" * 60) logger.info("TEST 3: Multiple File Upload Test") logger.info("=" * 60) success_count = 0 total_files = 5 try: for i in range(total_files): ftp = connect_ftp() if not ftp: continue try: # Create test file test_file = create_test_csv("simple") filename = f"test_{i + 1}_{os.path.basename(test_file)}" # Upload file with open(test_file, "rb") as f: logger.info(f"Uploading file {i + 1}/{total_files}: {filename}") response = ftp.storbinary(f"STOR {filename}", f) success_count += 1 # Cleanup os.remove(test_file) ftp.quit() except Exception as e: logger.error(f"❌ Failed to upload file {i + 1}: {e}") try: ftp.quit() except: pass logger.info(f"\n✅ Successfully uploaded {success_count}/{total_files} files") logger.info(" Check server logs to verify all files were processed") return success_count == total_files except Exception as e: logger.error(f"❌ Multiple upload test failed: {e}") return False def test_site_commands(): """Test 4: FTP SITE commands (user management).""" logger.info("\n" + "=" * 60) logger.info("TEST 4: SITE Commands Test") logger.info("=" * 60) ftp = connect_ftp() if not ftp: return False try: test_user = f"testuser_{datetime.now().strftime('%Y%m%d%H%M%S')}" test_pass = "testpass123" # Test SITE LSTU (list users) logger.info("Testing SITE LSTU (list users)...") try: response = ftp.sendcmd("SITE LSTU") logger.info(f"✅ SITE LSTU response: {response[:100]}...") except Exception as e: logger.warning(f"⚠️ SITE LSTU failed: {e}") # Test SITE ADDU (add user) logger.info(f"Testing SITE ADDU (add user {test_user})...") try: response = ftp.sendcmd(f"SITE ADDU {test_user} {test_pass}") logger.info(f"✅ SITE ADDU response: {response}") except Exception as e: logger.warning(f"⚠️ SITE ADDU failed: {e}") # Test SITE DISU (disable user) logger.info(f"Testing SITE DISU (disable user {test_user})...") try: response = ftp.sendcmd(f"SITE DISU {test_user}") logger.info(f"✅ SITE DISU response: {response}") except Exception as e: logger.warning(f"⚠️ SITE DISU failed: {e}") ftp.quit() logger.info("✅ SITE commands test passed") logger.info(" Check database to verify user management operations") return True except Exception as e: logger.error(f"❌ SITE commands test failed: {e}") try: ftp.quit() except: pass return False def main(): """Run all FTP tests.""" logger.info("\n" + "=" * 60) logger.info("FTP MIGRATION TEST SUITE") logger.info("=" * 60) logger.info(f"Start time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") logger.info(f"FTP Server: {FTP_CONFIG['host']}:{FTP_CONFIG['port']}") logger.info("=" * 60) tests = [ ("FTP Connection", test_ftp_connection), ("File Upload", test_file_upload), ("Multiple Uploads", test_multiple_uploads), ("SITE Commands", test_site_commands), ] results = [] for test_name, test_func in tests: try: result = test_func() results.append((test_name, result)) except Exception as e: logger.error(f"❌ {test_name} crashed: {e}") results.append((test_name, False)) # Summary logger.info("\n" + "=" * 60) logger.info("TEST SUMMARY") logger.info("=" * 60) passed = sum(1 for _, result in results if result) total = len(results) for test_name, result in results: status = "✅ PASS" if result else "❌ FAIL" logger.info(f"{status:10} | {test_name}") logger.info("=" * 60) logger.info(f"Results: {passed}/{total} tests passed") logger.info(f"End time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") logger.info("=" * 60) if passed == total: logger.info("\n🎉 All FTP tests PASSED!") logger.info(" Remember to check:") logger.info(" - Server logs for file processing") logger.info(" - Database for inserted records") logger.info(" - Database for user management changes") return 0 else: logger.error(f"\n⚠️ {total - passed} FTP test(s) FAILED.") logger.error(" Make sure:") logger.error(" - FTP server is running: python src/ftp_csv_receiver.py") logger.error(" - Database is accessible") logger.error(" - FTP credentials are correct") return 1 if __name__ == "__main__": exit_code = main() sys.exit(exit_code)