LinkDesk/backend/test_recovery_structure_ver...

361 lines
12 KiB
Python

"""
Recovery Management Structure Verification Test
This test verifies that the existing functionality structure is preserved
without requiring a running server.
Requirements tested:
- 4.1: Component interfaces remain unchanged
- 4.2: API endpoints are properly configured
- 4.3: Navigation and routing functionality is preserved
- 4.4: Service method signatures stay the same
- 4.5: Database schemas remain unchanged
"""
import os
import sys
import inspect
from typing import get_type_hints
# Add the backend directory to the path
sys.path.insert(0, os.path.dirname(__file__))
def test_admin_router_structure():
"""Test that admin router has all expected endpoints"""
print("Testing Admin Router Structure...")
print("=" * 50)
try:
from routers.admin import router
# Get all routes from the admin router
routes = []
for route in router.routes:
if hasattr(route, 'path') and hasattr(route, 'methods'):
routes.append({
'path': route.path,
'methods': list(route.methods),
'name': getattr(route, 'name', 'unknown')
})
# Expected endpoints
expected_endpoints = [
{'path': '/deleted-shots/', 'methods': ['GET']},
{'path': '/deleted-assets/', 'methods': ['GET']},
{'path': '/shots/{shot_id}/recovery-preview', 'methods': ['GET']},
{'path': '/assets/{asset_id}/recovery-preview', 'methods': ['GET']},
{'path': '/shots/{shot_id}/recover', 'methods': ['POST']},
{'path': '/assets/{asset_id}/recover', 'methods': ['POST']},
{'path': '/shots/bulk-recover', 'methods': ['POST']},
{'path': '/assets/bulk-recover', 'methods': ['POST']},
{'path': '/recovery-stats/', 'methods': ['GET']}
]
all_found = True
for expected in expected_endpoints:
found = False
for route in routes:
if (route['path'] == expected['path'] and
any(method in route['methods'] for method in expected['methods'])):
found = True
break
if found:
print(f"✅ Endpoint found: {expected['methods'][0]} {expected['path']}")
else:
print(f"❌ Endpoint missing: {expected['methods'][0]} {expected['path']}")
all_found = False
print("=" * 50)
if all_found:
print("🎉 All admin router endpoints are properly configured!")
print("✅ Requirement 4.2: API endpoints are properly configured - PASSED")
else:
print("⚠️ Some admin router endpoints are missing.")
print("❌ Requirement 4.2: API endpoints are properly configured - FAILED")
return all_found
except Exception as e:
print(f"❌ Error testing admin router: {e}")
return False
def test_recovery_service_interface():
"""Test that RecoveryService maintains its interface"""
print("\nTesting Recovery Service Interface...")
print("=" * 50)
try:
from services.recovery_service import RecoveryService
service = RecoveryService()
# Expected methods
expected_methods = [
'get_deleted_shots',
'get_deleted_assets',
'preview_shot_recovery',
'preview_asset_recovery',
'recover_shot',
'recover_asset',
'bulk_recover_shots',
'bulk_recover_assets',
'get_recovery_stats'
]
all_found = True
for method_name in expected_methods:
if hasattr(service, method_name):
method = getattr(service, method_name)
if callable(method):
print(f"✅ Method found: {method_name}")
else:
print(f"❌ Method not callable: {method_name}")
all_found = False
else:
print(f"❌ Method missing: {method_name}")
all_found = False
print("=" * 50)
if all_found:
print("🎉 Recovery service interface is preserved!")
print("✅ Requirement 4.4: Service method signatures stay the same - PASSED")
else:
print("⚠️ Recovery service interface has issues.")
print("❌ Requirement 4.4: Service method signatures stay the same - FAILED")
return all_found
except Exception as e:
print(f"❌ Error testing recovery service: {e}")
return False
def test_database_models():
"""Test that database models maintain required fields"""
print("\nTesting Database Models...")
print("=" * 50)
try:
from models.shot import Shot
from models.asset import Asset
from sqlalchemy import inspect
# Test Shot model
shot_inspector = inspect(Shot)
shot_columns = [column.name for column in shot_inspector.columns]
required_shot_fields = [
'id', 'name', 'episode_id', 'project_id',
'deleted_at', 'deleted_by'
]
shot_fields_ok = True
for field in required_shot_fields:
if field in shot_columns:
print(f"✅ Shot model has field: {field}")
else:
print(f"❌ Shot model missing field: {field}")
shot_fields_ok = False
# Test Asset model
asset_inspector = inspect(Asset)
asset_columns = [column.name for column in asset_inspector.columns]
required_asset_fields = [
'id', 'name', 'category', 'project_id',
'deleted_at', 'deleted_by'
]
asset_fields_ok = True
for field in required_asset_fields:
if field in asset_columns:
print(f"✅ Asset model has field: {field}")
else:
print(f"❌ Asset model missing field: {field}")
asset_fields_ok = False
print("=" * 50)
if shot_fields_ok and asset_fields_ok:
print("🎉 Database models maintain required fields!")
print("✅ Requirement 4.5: Database schemas remain unchanged - PASSED")
else:
print("⚠️ Database models have missing fields.")
print("❌ Requirement 4.5: Database schemas remain unchanged - FAILED")
return shot_fields_ok and asset_fields_ok
except Exception as e:
print(f"❌ Error testing database models: {e}")
return False
def test_frontend_service_interface():
"""Test that frontend service interface is preserved"""
print("\nTesting Frontend Service Interface...")
print("=" * 50)
recovery_service_file = "../frontend/src/services/recovery.ts"
if not os.path.exists(recovery_service_file):
print(f"❌ Recovery service file not found: {recovery_service_file}")
return False
with open(recovery_service_file, 'r') as f:
content = f.read()
# Check for required interfaces
required_interfaces = [
"DeletedShot",
"DeletedAsset",
"RecoveryInfo",
"RecoveryResult",
"BulkRecoveryResult"
]
interfaces_ok = True
for interface in required_interfaces:
if f"interface {interface}" in content:
print(f"✅ Interface found: {interface}")
else:
print(f"❌ Interface missing: {interface}")
interfaces_ok = False
# Check for required methods
required_methods = [
"getDeletedShots",
"getDeletedAssets",
"previewShotRecovery",
"previewAssetRecovery",
"recoverShot",
"recoverAsset",
"bulkRecoverShots",
"bulkRecoverAssets"
]
methods_ok = True
for method in required_methods:
if method in content:
print(f"✅ Method found: {method}")
else:
print(f"❌ Method missing: {method}")
methods_ok = False
print("=" * 50)
if interfaces_ok and methods_ok:
print("🎉 Frontend service interface is preserved!")
print("✅ Requirement 4.1: Component interfaces remain unchanged - PASSED")
else:
print("⚠️ Frontend service interface has issues.")
print("❌ Requirement 4.1: Component interfaces remain unchanged - FAILED")
return interfaces_ok and methods_ok
def test_navigation_structure():
"""Test that navigation structure is preserved"""
print("\nTesting Navigation Structure...")
print("=" * 50)
# Test router configuration
router_file = "../frontend/src/router/index.ts"
sidebar_file = "../frontend/src/components/layout/AppSidebar.vue"
files_to_check = [
(router_file, ["'/admin/deleted-items'", "RecoveryManagement", "DeletedItemsManagementView"]),
(sidebar_file, ["'/admin/deleted-items'", "Recovery Management", "RotateCcw"])
]
all_ok = True
for file_path, required_elements in files_to_check:
if not os.path.exists(file_path):
print(f"❌ File not found: {file_path}")
all_ok = False
continue
with open(file_path, 'r') as f:
content = f.read()
file_ok = True
for element in required_elements:
if element in content:
print(f"✅ Found in {os.path.basename(file_path)}: {element}")
else:
print(f"❌ Missing in {os.path.basename(file_path)}: {element}")
file_ok = False
if not file_ok:
all_ok = False
print("=" * 50)
if all_ok:
print("🎉 Navigation structure is preserved!")
print("✅ Requirement 4.3: Navigation and routing functionality is preserved - PASSED")
else:
print("⚠️ Navigation structure has issues.")
print("❌ Requirement 4.3: Navigation and routing functionality is preserved - FAILED")
return all_ok
def main():
"""Run all structure verification tests"""
print("Recovery Management Structure Verification Test")
print("=" * 60)
print("Testing Requirements 4.1, 4.2, 4.3, 4.4, 4.5")
print("=" * 60)
# Run all tests
tests = [
("Admin Router Structure", test_admin_router_structure),
("Recovery Service Interface", test_recovery_service_interface),
("Database Models", test_database_models),
("Frontend Service Interface", test_frontend_service_interface),
("Navigation Structure", test_navigation_structure)
]
results = []
for test_name, test_func in tests:
try:
result = test_func()
results.append((test_name, result))
except Exception as e:
print(f"❌ Error running {test_name}: {e}")
results.append((test_name, False))
# Summary
print("\n" + "=" * 60)
print("FINAL RESULTS:")
print("=" * 60)
passed = sum(1 for _, result in results if result)
total = len(results)
for test_name, result in results:
status = "✅ PASSED" if result else "❌ FAILED"
print(f"{test_name}: {status}")
print("=" * 60)
print(f"Tests Passed: {passed}/{total}")
if passed == total:
print("🎉 ALL TESTS PASSED!")
print("✅ Existing functionality structure is preserved after terminology changes")
print("✅ Task 3: Verify existing functionality preservation - COMPLETED")
else:
print("⚠️ SOME TESTS FAILED!")
print("❌ Review the issues above before proceeding")
print("❌ Task 3: Verify existing functionality preservation - NEEDS ATTENTION")
print("=" * 60)
return passed == total
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)