import io import pytest from unittest.mock import MagicMock, patch from src.core.file_parser import ( FitParser, WorkoutData, WorkoutMetadata, PowerData, HeartRateData, SpeedData, ElevationData, ) from datetime import datetime, timedelta import pandas as pd @pytest.fixture def mock_fit_file(): with patch("fitparse.FitFile") as mock_fit_file_class: mock_fit_file_instance = MagicMock() mock_fit_file_class.return_value = mock_fit_file_instance # Mocking get_messages to return some dummy records mock_record1 = MagicMock() mock_record1.as_dict.return_value = { "timestamp": datetime(2023, 1, 1, 10, 0, 0), "power": 150, "heart_rate": 130, "speed": 5.0, "altitude": 100.0, } mock_record2 = MagicMock() mock_record2.as_dict.return_value = { "timestamp": datetime(2023, 1, 1, 10, 1, 0), "power": 160, "heart_rate": 135, "speed": 5.5, "altitude": 105.0, } mock_fit_file_instance.get_messages.return_value = [mock_record1, mock_record2] yield mock_fit_file_class def test_fit_parser_parse_method_returns_workout_data(mock_fit_file): # Mock the FitFile constructor directly within the test with patch('fitparse.FitFile') as MockFitFile: MockFitFile.return_value = mock_fit_file.return_value # Use the mocked instance from the fixture parser = FitParser() workout_data = parser.parse(io.BytesIO(b"dummy content")) assert isinstance(workout_data, WorkoutData) assert isinstance(workout_data.metadata, WorkoutMetadata) assert workout_data.metadata.file_type == "FIT" assert isinstance(workout_data.time_series_data, pd.DataFrame) assert not workout_data.time_series_data.empty assert "power" in workout_data.time_series_data.columns assert "heart_rate" in workout_data.time_series_data.columns assert "speed" in workout_data.time_series_data.columns assert "altitude" in workout_data.time_series_data.columns assert workout_data.metadata.start_time == datetime(2023, 1, 1, 10, 0, 0) assert workout_data.metadata.duration == timedelta(minutes=1)