Files
FitTrack2/FitnessSync/backend/tests/test_analysis.py
2026-01-13 09:42:16 -08:00

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