This commit is contained in:
2025-10-12 06:38:44 -07:00
parent 9e0bd322d3
commit 3886dcb9ab
158 changed files with 2022 additions and 9699 deletions

View File

@@ -0,0 +1,66 @@
import pytest
import httpx
from fastapi.testclient import TestClient
from unittest.mock import patch, AsyncMock
from api.main import app
from uuid import uuid4
client = TestClient(app)
@pytest.mark.asyncio
async def test_get_summary_new_analysis():
activity_id = uuid4()
with patch("src.clients.centraldb_client.CentralDBClient") as MockCentralDBClient:
mock_client = MockCentralDBClient.return_value
# Mock the case where the artifact is not in CentralDB
mock_client.get_analysis_artifact = AsyncMock(
side_effect=httpx.HTTPStatusError(
"", request=None, response=httpx.Response(status_code=404)
)
)
mock_client.download_fit_file = AsyncMock(return_value=b"fit file content")
mock_client.create_analysis_artifact = AsyncMock(
return_value={
"id": 1,
"activity_id": str(activity_id),
"data": {"summary": "metrics"},
}
)
with patch("src.core.file_parser.FitParser.parse") as mock_parse:
# Mock the workout data object that the parser would return
mock_workout_data = "mock workout data"
mock_parse.return_value = mock_workout_data
with patch(
"src.core.workout_analyzer.WorkoutAnalyzer"
) as MockWorkoutAnalyzer:
mock_analyzer = MockWorkoutAnalyzer.return_value
summary_metrics = {
"average_power": 200,
"normalized_power": 220,
"intensity_factor": 0.8,
"training_stress_score": 50,
"average_heart_rate": 150,
"max_heart_rate": 180,
"average_speed": 25,
"max_speed": 50,
"total_ascent": 100,
"total_descent": 50,
}
mock_analyzer.calculate_summary_metrics.return_value = summary_metrics
response = client.get(f"/api/analysis/{activity_id}/summary")
assert response.status_code == 200
assert response.json() == summary_metrics
# Verify that the client methods were called as expected
mock_client.get_analysis_artifact.assert_called_once_with(str(activity_id))
mock_client.download_fit_file.assert_called_once_with(str(activity_id))
mock_client.create_analysis_artifact.assert_called_once_with(
str(activity_id), data=summary_metrics
)
MockWorkoutAnalyzer.assert_called_once_with(mock_workout_data)