50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
|
|
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
|