mirror of
https://github.com/sstent/FitTrack_ReportGenerator.git
synced 2026-01-26 09:02:26 +00:00
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from datetime import datetime
|
|
from unittest.mock import patch, MagicMock
|
|
import shutil
|
|
import pytest
|
|
import time
|
|
from fastapi.testclient import TestClient
|
|
from api.main import app
|
|
import os
|
|
import io
|
|
from uuid import uuid4
|
|
|
|
client = TestClient(app)
|
|
|
|
# Performance Goal SC-002: Analysis of a typical 2-hour workout file MUST complete in under 30 seconds.
|
|
|
|
|
|
# Helper to create a dummy FIT file for testing
|
|
def create_dummy_fit_file(file_path, source_file_path="/home/sstent/Projects/FitTrack_ReportGenerator/activity_207928738.fit"):
|
|
shutil.copy(source_file_path, file_path)
|
|
|
|
|
|
# Helper to create a dummy ZIP file with multiple workout files
|
|
@patch("src.db.models.WorkoutAnalysis")
|
|
@patch("src.db.session.get_db")
|
|
@patch("src.core.file_parser.FitParser")
|
|
@patch("src.core.workout_analyzer.WorkoutAnalyzer")
|
|
@patch("src.core.report_generator.ReportGenerator")
|
|
def test_performance_single_workout_analysis(
|
|
mock_report_generator_cls,
|
|
mock_workout_analyzer_cls,
|
|
mock_fit_parser_cls,
|
|
mock_get_db,
|
|
mock_workout_analysis_cls,
|
|
tmp_path,
|
|
):
|
|
# Mock database session
|
|
mock_db_session = MagicMock()
|
|
mock_get_db.return_value = mock_db_session
|
|
mock_db_session.add.return_value = None
|
|
mock_db_session.commit.return_value = None
|
|
mock_db_session.refresh.return_value = None
|
|
mock_db_session.query.return_value.filter.return_value.first.return_value = MagicMock(id=uuid4(), ftp_value=250.0)
|
|
|
|
# SC-002: Analysis of a typical 2-hour workout file MUST complete in under 30 seconds.
|
|
dummy_fit_file_path = tmp_path / "2_hour_workout.fit"
|
|
create_dummy_fit_file(dummy_fit_file_path)
|
|
|
|
start_time = time.time()
|
|
with open(dummy_fit_file_path, "rb") as f:
|
|
response = client.post(
|
|
"/api/analyze/workout",
|
|
files={"file": ("2_hour_workout.fit", f, "application/octet-stream")},
|
|
data={"user_id": str(uuid4()), "ftp_value": 250.0},
|
|
)
|
|
end_time = time.time()
|
|
elapsed_time = end_time - start_time
|
|
|
|
assert response.status_code == 200
|
|
assert elapsed_time < 30, (
|
|
f"Single workout analysis took {elapsed_time:.2f} seconds, exceeding 30 seconds."
|
|
)
|
|
print(f"Single workout analysis completed in {elapsed_time:.2f} seconds.")
|
|
|
|
|