import pytest from unittest.mock import MagicMock, patch from datetime import datetime from src.api.analysis import compare_efforts, ComparisonResponse from src.models.segment_effort import SegmentEffort from src.models.activity import Activity from src.models.bike_setup import BikeSetup from src.models.health_metric import HealthMetric def test_compare_efforts_logic(): # Mock DB Session mock_db = MagicMock() # Setup Entities bike = BikeSetup(id=1, name="S-Works", weight_kg=7.5) act1 = Activity(id=1, activity_name="Ride 1", start_time=datetime(2023, 6, 1, 10, 0), avg_cadence=90, avg_speed=10.0, avg_temperature=20.0, bike_setup=bike) act2 = Activity(id=2, activity_name="Ride 2", start_time=datetime(2023, 6, 2, 10, 0), avg_cadence=95, avg_speed=11.0, avg_temperature=25.0, bike_setup=bike) eff1 = SegmentEffort(id=101, activity_id=1, elapsed_time=100, avg_power=200, avg_hr=150, activity=act1) eff2 = SegmentEffort(id=102, activity_id=2, elapsed_time=90, avg_power=220, avg_hr=160, activity=act2) # Mock Query Results # Filter efforts mock_db.query.return_value.filter.return_value.all.return_value = [eff1, eff2] # Mock HealthMetric (Body Weight) weight_metric = HealthMetric(metric_value=70.0, date=datetime(2023, 6, 1)) mock_db.query.return_value.filter.return_value.order_by.return_value.first.return_value = weight_metric # Run Function response = compare_efforts([101, 102], mock_db) # Assertions assert len(response.efforts) == 2 e1_data = next(e for e in response.efforts if e.effort_id == 101) e2_data = next(e for e in response.efforts if e.effort_id == 102) assert e1_data.avg_power == 200 assert e2_data.avg_power == 220 assert e1_data.total_weight == 77.5 # 70 + 7.5 assert e1_data.watts_per_kg == round(200/70.0, 2) # Winners assert response.winners['avg_power'] == 102 assert response.winners['elapsed_time'] == 102 # Lower is better? Logic said min for time. assert response.winners['avg_hr'] == 101 # Lower is better