mirror of
https://github.com/sstent/Garmin_Analyser.git
synced 2025-12-05 23:52:11 +00:00
221 lines
6.6 KiB
Python
221 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Test script to verify Garmin Analyser installation and basic functionality."""
|
|
|
|
import sys
|
|
import traceback
|
|
from pathlib import Path
|
|
|
|
def test_imports():
|
|
"""Test that all modules can be imported successfully."""
|
|
print("Testing imports...")
|
|
|
|
try:
|
|
from config.settings import Settings
|
|
print("✓ Settings imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import Settings: {e}")
|
|
return False
|
|
|
|
try:
|
|
from models.workout import WorkoutData, WorkoutMetadata, WorkoutSample
|
|
print("✓ Workout models imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import workout models: {e}")
|
|
return False
|
|
|
|
try:
|
|
from models.zones import Zones, Zone
|
|
print("✓ Zones models imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import zones models: {e}")
|
|
return False
|
|
|
|
try:
|
|
from analyzers.workout_analyzer import WorkoutAnalyzer
|
|
print("✓ WorkoutAnalyzer imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import WorkoutAnalyzer: {e}")
|
|
return False
|
|
|
|
try:
|
|
from visualizers.chart_generator import ChartGenerator
|
|
print("✓ ChartGenerator imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import ChartGenerator: {e}")
|
|
return False
|
|
|
|
try:
|
|
from visualizers.report_generator import ReportGenerator
|
|
print("✓ ReportGenerator imported successfully")
|
|
except ImportError as e:
|
|
print(f"✗ Failed to import ReportGenerator: {e}")
|
|
return False
|
|
|
|
return True
|
|
|
|
def test_configuration():
|
|
"""Test configuration loading."""
|
|
print("\nTesting configuration...")
|
|
|
|
try:
|
|
from config.settings import Settings
|
|
|
|
settings = Settings()
|
|
print("✓ Settings loaded successfully")
|
|
|
|
# Test zones configuration
|
|
zones = settings.zones
|
|
print(f"✓ Zones loaded: {len(zones.power_zones)} power zones, {len(zones.heart_rate_zones)} HR zones")
|
|
|
|
# Test FTP value
|
|
ftp = zones.ftp
|
|
print(f"✓ FTP configured: {ftp} W")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"✗ Configuration test failed: {e}")
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def test_basic_functionality():
|
|
"""Test basic functionality with mock data."""
|
|
print("\nTesting basic functionality...")
|
|
|
|
try:
|
|
from models.workout import WorkoutData, WorkoutMetadata, WorkoutSample
|
|
from models.zones import Zones, Zone
|
|
from analyzers.workout_analyzer import WorkoutAnalyzer
|
|
|
|
# Create mock zones
|
|
zones = Zones(
|
|
ftp=250,
|
|
max_heart_rate=180,
|
|
power_zones=[
|
|
Zone("Recovery", 0, 125, True),
|
|
Zone("Endurance", 126, 175, True),
|
|
Zone("Tempo", 176, 212, True),
|
|
Zone("Threshold", 213, 262, True),
|
|
Zone("VO2 Max", 263, 300, True),
|
|
],
|
|
heart_rate_zones=[
|
|
Zone("Zone 1", 0, 108, True),
|
|
Zone("Zone 2", 109, 126, True),
|
|
Zone("Zone 3", 127, 144, True),
|
|
Zone("Zone 4", 145, 162, True),
|
|
Zone("Zone 5", 163, 180, True),
|
|
]
|
|
)
|
|
|
|
# Create mock workout data
|
|
metadata = WorkoutMetadata(
|
|
sport="cycling",
|
|
start_time="2024-01-01T10:00:00Z",
|
|
duration=3600.0,
|
|
distance=30.0,
|
|
calories=800
|
|
)
|
|
|
|
# Create mock samples
|
|
samples = []
|
|
for i in range(60): # 1 sample per minute
|
|
sample = WorkoutSample(
|
|
timestamp=f"2024-01-01T10:{i:02d}:00Z",
|
|
power=200 + (i % 50), # Varying power
|
|
heart_rate=140 + (i % 20), # Varying HR
|
|
speed=30.0 + (i % 5), # Varying speed
|
|
elevation=100 + (i % 10), # Varying elevation
|
|
cadence=85 + (i % 10), # Varying cadence
|
|
temperature=20.0 # Constant temperature
|
|
)
|
|
samples.append(sample)
|
|
|
|
workout = WorkoutData(
|
|
metadata=metadata,
|
|
samples=samples
|
|
)
|
|
|
|
# Test analysis
|
|
analyzer = WorkoutAnalyzer(zones)
|
|
analysis = analyzer.analyze_workout(workout)
|
|
|
|
print("✓ Basic analysis completed successfully")
|
|
print(f" - Summary: {len(analysis['summary'])} metrics")
|
|
print(f" - Power zones: {len(analysis['power_zones'])} zones")
|
|
print(f" - HR zones: {len(analysis['heart_rate_zones'])} zones")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"✗ Basic functionality test failed: {e}")
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def test_dependencies():
|
|
"""Test that all required dependencies are available."""
|
|
print("\nTesting dependencies...")
|
|
|
|
required_packages = [
|
|
'pandas',
|
|
'numpy',
|
|
'matplotlib',
|
|
'seaborn',
|
|
'plotly',
|
|
'jinja2',
|
|
'pyyaml',
|
|
'fitparse',
|
|
'lxml',
|
|
'python-dateutil'
|
|
]
|
|
|
|
failed_packages = []
|
|
|
|
for package in required_packages:
|
|
try:
|
|
__import__(package)
|
|
print(f"✓ {package}")
|
|
except ImportError:
|
|
print(f"✗ {package}")
|
|
failed_packages.append(package)
|
|
|
|
if failed_packages:
|
|
print(f"\nMissing packages: {', '.join(failed_packages)}")
|
|
print("Install with: pip install -r requirements.txt")
|
|
return False
|
|
|
|
return True
|
|
|
|
def main():
|
|
"""Run all tests."""
|
|
print("=== Garmin Analyser Installation Test ===\n")
|
|
|
|
tests = [
|
|
("Dependencies", test_dependencies),
|
|
("Imports", test_imports),
|
|
("Configuration", test_configuration),
|
|
("Basic Functionality", test_basic_functionality),
|
|
]
|
|
|
|
passed = 0
|
|
total = len(tests)
|
|
|
|
for test_name, test_func in tests:
|
|
print(f"\n--- {test_name} Test ---")
|
|
if test_func():
|
|
passed += 1
|
|
print(f"✓ {test_name} test passed")
|
|
else:
|
|
print(f"✗ {test_name} test failed")
|
|
|
|
print(f"\n=== Test Results ===")
|
|
print(f"Passed: {passed}/{total}")
|
|
|
|
if passed == total:
|
|
print("🎉 All tests passed! Garmin Analyser is ready to use.")
|
|
return 0
|
|
else:
|
|
print("❌ Some tests failed. Please check the output above.")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |