#!/usr/bin/env python3 """ Basic test script for core functionality without GUI dependencies. """ import sys from pathlib import Path # Add project root to path project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) def test_imports(): """Test that core modules can be imported.""" print("Testing core module imports...") try: from core.credentials import CredentialManager print("✓ CredentialManager import successful") from utils.validators import validate_page_range, validate_username, validate_password print("✓ Validators import successful") from core.scraper import Scraper print("✓ Scraper import successful") return True except Exception as e: print(f"✗ Import failed: {e}") return False def test_credential_manager(): """Test basic credential manager functionality.""" print("\nTesting credential manager...") try: from core.credentials import CredentialManager cm = CredentialManager("test_app") # Test default settings defaults = cm.get_default_settings() print(f"✓ Default settings: {len(defaults)} items") # Test validation validation = cm.validate_credentials("testuser", "testpass") print(f"✓ Credential validation: {validation['valid']}") # Test config file path config_path = cm.get_config_file_path() print(f"✓ Config file path: {config_path}") return True except Exception as e: print(f"✗ Credential manager test failed: {e}") return False def test_validators(): """Test validation functions.""" print("\nTesting validators...") try: from utils.validators import validate_page_range, validate_username, validate_password # Test page range validation valid_range = validate_page_range(1, 5) print(f"✓ Valid page range (1-5): {valid_range['valid']}") invalid_range = validate_page_range(5, 1) print(f"✓ Invalid page range (5-1): {not invalid_range['valid']}") # Test username validation valid_username = validate_username("testuser") print(f"✓ Valid username: {valid_username['valid']}") invalid_username = validate_username("") print(f"✓ Invalid username (empty): {not invalid_username['valid']}") # Test password validation valid_password = validate_password("password123") print(f"✓ Valid password: {valid_password['valid']}") invalid_password = validate_password("") print(f"✓ Invalid password (empty): {not invalid_password['valid']}") return True except Exception as e: print(f"✗ Validator test failed: {e}") return False def test_scraper_init(): """Test scraper initialization without actually running it.""" print("\nTesting scraper initialization...") try: # Test importing selenium import selenium print(f"✓ Selenium available: {selenium.__version__}") # Test callback mechanism events = [] def test_callback(event_type, data): events.append((event_type, data)) print("✓ Callback mechanism ready") # We won't actually create a Scraper instance since it requires Chrome # but we can test that the class is properly defined from core.scraper import Scraper # Check that the class has the expected methods expected_methods = ['login', 'scrape', 'trigger_download', 'human_delay', 'close'] for method in expected_methods: if hasattr(Scraper, method): print(f"✓ Scraper has {method} method") else: print(f"✗ Scraper missing {method} method") return False return True except Exception as e: print(f"✗ Scraper test failed: {e}") return False def test_project_structure(): """Test that all expected files are present.""" print("\nTesting project structure...") expected_files = [ "core/__init__.py", "core/scraper.py", "core/credentials.py", "core/scraper_thread.py", "gui/__init__.py", "gui/main_window.py", "gui/login_dialog.py", "gui/progress_dialog.py", "utils/__init__.py", "utils/validators.py", "gui_main.py", "requirements.txt", "install_and_run.bat", "install_and_run.sh" ] missing_files = [] for file_path in expected_files: full_path = project_root / file_path if full_path.exists(): print(f"✓ {file_path}") else: print(f"✗ {file_path} missing") missing_files.append(file_path) if missing_files: print(f"\nMissing files: {len(missing_files)}") return False else: print(f"\n✓ All {len(expected_files)} expected files present") return True def main(): """Run all tests.""" print("=== EBoek.info Scraper Core Test ===\n") tests = [ ("Project Structure", test_project_structure), ("Module Imports", test_imports), ("Credential Manager", test_credential_manager), ("Validators", test_validators), ("Scraper Initialization", test_scraper_init), ] results = [] for test_name, test_func in tests: print(f"\n{'='*50}") print(f"Running: {test_name}") print('='*50) try: result = test_func() results.append((test_name, result)) except Exception as e: print(f"✗ Test '{test_name}' crashed: {e}") results.append((test_name, False)) # Summary print(f"\n{'='*50}") print("TEST SUMMARY") print('='*50) passed = 0 failed = 0 for test_name, result in results: status = "PASS" if result else "FAIL" symbol = "✓" if result else "✗" print(f"{symbol} {test_name}: {status}") if result: passed += 1 else: failed += 1 print(f"\nResults: {passed} passed, {failed} failed") if failed == 0: print("\n🎉 All tests passed! The core functionality is ready.") print("\nNext steps:") print("1. Install PyQt5: pip install PyQt5") print("2. Run the GUI: python3 gui_main.py") print("3. Or use the installer: ./install_and_run.sh") else: print(f"\n⚠️ {failed} test(s) failed. Please check the errors above.") return failed == 0 if __name__ == "__main__": success = main() sys.exit(0 if success else 1)