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.")