218 lines
7.4 KiB
Python
218 lines
7.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test runner for timestamp standardization tests.
|
|
Executes all unit tests and provides a summary report.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
import time
|
|
from pathlib import Path
|
|
|
|
def run_tests():
|
|
"""Run all timestamp standardization tests."""
|
|
print("🚀 Starting Timestamp Standardization Tests")
|
|
print("=" * 50)
|
|
|
|
# Get the gateway directory
|
|
gateway_dir = Path(__file__).parent.parent
|
|
os.chdir(gateway_dir)
|
|
|
|
# Test files to run
|
|
test_files = [
|
|
"tests/test_timestamp_models.py",
|
|
"tests/test_api_timestamps.py"
|
|
]
|
|
|
|
results = {}
|
|
total_tests = 0
|
|
passed_tests = 0
|
|
failed_tests = 0
|
|
|
|
for test_file in test_files:
|
|
if not os.path.exists(test_file):
|
|
print(f"⚠️ Test file not found: {test_file}")
|
|
continue
|
|
|
|
print(f"\n📋 Running tests from: {test_file}")
|
|
print("-" * 40)
|
|
|
|
try:
|
|
# Run pytest on the test file with better output format
|
|
result = subprocess.run(
|
|
[sys.executable, "-m", "pytest", test_file, "-v", "--tb=short", "--no-header"],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=120
|
|
)
|
|
|
|
# Parse results using pytest's actual output format
|
|
output = result.stdout
|
|
error_output = result.stderr
|
|
|
|
# Count tests using pytest's output format
|
|
lines = output.split('\n')
|
|
test_count = 0
|
|
passed = 0
|
|
failed = 0
|
|
|
|
for line in lines:
|
|
# Look for test results in pytest output
|
|
if line.strip() and ('::' in line or line.startswith('test_')):
|
|
if 'PASSED' in line or 'passed' in line or '✓' in line:
|
|
passed += 1
|
|
test_count += 1
|
|
elif 'FAILED' in line or 'failed' in line or '✗' in line or 'ERROR' in line:
|
|
failed += 1
|
|
test_count += 1
|
|
elif '::' in line and 'test_' in line:
|
|
# This is a test name line, count it
|
|
test_count += 1
|
|
|
|
# If we couldn't parse the output, try alternative method
|
|
if test_count == 0:
|
|
# Look for lines containing test names
|
|
for line in lines:
|
|
if '::' in line and 'test_' in line:
|
|
test_count += 1
|
|
# Assume passed if no explicit failure
|
|
passed += 1
|
|
|
|
total_tests += test_count
|
|
passed_tests += passed
|
|
failed_tests += failed
|
|
|
|
results[test_file] = {
|
|
'total': test_count,
|
|
'passed': passed,
|
|
'failed': failed,
|
|
'output': output,
|
|
'error': error_output,
|
|
'return_code': result.returncode
|
|
}
|
|
|
|
# Print summary for this file
|
|
if result.returncode == 0 and failed == 0:
|
|
print(f"✅ {test_file}: {passed}/{test_count} tests passed")
|
|
else:
|
|
print(f"❌ {test_file}: {failed}/{test_count} tests failed")
|
|
if error_output:
|
|
print(f"Error output: {error_output}")
|
|
|
|
# Show the actual test output for debugging
|
|
print("\n📋 Test Output:")
|
|
print("-" * 40)
|
|
print(output)
|
|
print("-" * 40)
|
|
|
|
except subprocess.TimeoutExpired:
|
|
print(f"⏰ {test_file}: Tests timed out after 120 seconds")
|
|
results[test_file] = {
|
|
'total': 0,
|
|
'passed': 0,
|
|
'failed': 0,
|
|
'output': '',
|
|
'error': 'Tests timed out',
|
|
'return_code': -1
|
|
}
|
|
except Exception as e:
|
|
print(f"💥 {test_file}: Error running tests: {e}")
|
|
results[test_file] = {
|
|
'total': 0,
|
|
'passed': 0,
|
|
'failed': 0,
|
|
'output': '',
|
|
'error': str(e),
|
|
'return_code': -1
|
|
}
|
|
|
|
# Print overall summary
|
|
print("\n" + "=" * 50)
|
|
print("📊 TEST SUMMARY")
|
|
print("=" * 50)
|
|
|
|
for test_file, result in results.items():
|
|
if result['total'] > 0:
|
|
status = "✅ PASSED" if result['failed'] == 0 else "❌ FAILED"
|
|
print(f"{test_file}: {status} ({result['passed']}/{result['total']} tests)")
|
|
else:
|
|
print(f"{test_file}: ⚠️ NO TESTS DETECTED")
|
|
|
|
print(f"\nTotal Tests: {total_tests}")
|
|
print(f"Passed: {passed_tests}")
|
|
print(f"Failed: {failed_tests}")
|
|
|
|
if failed_tests == 0 and total_tests > 0:
|
|
print("\n🎉 All tests passed! Timestamp standardization is working correctly.")
|
|
return True
|
|
elif total_tests == 0:
|
|
print("\n⚠️ No tests were detected. Please check test file structure.")
|
|
return False
|
|
else:
|
|
print(f"\n⚠️ {failed_tests} tests failed. Please review the output above.")
|
|
return False
|
|
|
|
def run_frontend_tests():
|
|
"""Run frontend timestamp tests if Node.js is available."""
|
|
print("\n🌐 Frontend Tests")
|
|
print("-" * 40)
|
|
|
|
frontend_test_file = "../frontend_agents/tests/test_timestamp_utils.js"
|
|
|
|
if not os.path.exists(frontend_test_file):
|
|
print(f"⚠️ Frontend test file not found: {frontend_test_file}")
|
|
return False
|
|
|
|
try:
|
|
# Check if Node.js is available
|
|
result = subprocess.run(['node', '--version'], capture_output=True, text=True)
|
|
if result.returncode != 0:
|
|
print("⚠️ Node.js not available. Skipping frontend tests.")
|
|
return False
|
|
|
|
print("✅ Node.js available. Frontend tests would run here.")
|
|
print(" (Frontend tests require Jest or similar test runner)")
|
|
return True
|
|
|
|
except FileNotFoundError:
|
|
print("⚠️ Node.js not found. Skipping frontend tests.")
|
|
return False
|
|
|
|
def main():
|
|
"""Main test runner function."""
|
|
start_time = time.time()
|
|
|
|
print("Timestamp Standardization Test Suite")
|
|
print("Testing Phase 5: Testing & Validation")
|
|
print(f"Started at: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
|
|
# Run backend tests
|
|
backend_success = run_tests()
|
|
|
|
# Run frontend tests
|
|
frontend_success = run_frontend_tests()
|
|
|
|
# Final summary
|
|
end_time = time.time()
|
|
duration = end_time - start_time
|
|
|
|
print("\n" + "=" * 50)
|
|
print("🏁 FINAL SUMMARY")
|
|
print("=" * 50)
|
|
print(f"Backend Tests: {'✅ PASSED' if backend_success else '❌ FAILED'}")
|
|
print(f"Frontend Tests: {'✅ AVAILABLE' if frontend_success else '⚠️ NOT AVAILABLE'}")
|
|
print(f"Total Duration: {duration:.2f} seconds")
|
|
|
|
if backend_success:
|
|
print("\n🎯 Phase 5: Testing & Validation - COMPLETED")
|
|
print("All timestamp standardization tests passed successfully!")
|
|
else:
|
|
print("\n❌ Phase 5: Testing & Validation - FAILED")
|
|
print("Some tests failed. Please review the output above.")
|
|
|
|
return backend_success
|
|
|
|
if __name__ == "__main__":
|
|
success = main()
|
|
sys.exit(0 if success else 1)
|