import io
import pytest
from unittest.mock import MagicMock, patch, mock_open
from src.core.file_parser import GpxParser, WorkoutData, WorkoutMetadata
from datetime import datetime, timedelta
@pytest.fixture
def mock_gpxpy_parse():
with patch("gpxpy.parse") as mock_parse:
mock_gpx = MagicMock()
mock_parse.return_value = mock_gpx
# Mock GPX data
mock_gpx.time = datetime(2023, 1, 1, 10, 0, 0)
mock_gpx.get_moving_data.return_value.moving_time = 3600
mock_point1 = MagicMock()
mock_point1.time = datetime(2023, 1, 1, 10, 0, 0)
mock_point1.latitude = 40.0
mock_point1.longitude = -105.0
mock_point1.elevation = 1600.0
mock_point2 = MagicMock()
mock_point2.time = datetime(2023, 1, 1, 10, 1, 0)
mock_point2.latitude = 40.1
mock_point2.longitude = -105.1
mock_point2.elevation = 1610.0
mock_segment = MagicMock()
mock_segment.points = [mock_point1, mock_point2]
mock_track = MagicMock()
mock_track.segments = [mock_segment]
mock_gpx.tracks = [mock_track]
yield mock_parse
def test_gpx_parser_parse_method_returns_workout_data(mock_gpxpy_parse):
# Mock the open function as well, since GpxParser directly opens the file
with patch("builtins.open", mock_open(read_data="")):
parser = GpxParser()
workout_data = parser.parse(io.BytesIO(b""))
mock_gpxpy_parse.assert_called_once() # gpxpy.parse is called
assert isinstance(workout_data, WorkoutData)
assert isinstance(workout_data.metadata, WorkoutMetadata)
assert workout_data.metadata.file_type == "GPX"
assert workout_data.metadata.start_time == datetime(2023, 1, 1, 10, 0, 0)
assert workout_data.metadata.duration == timedelta(seconds=3600)
assert not workout_data.time_series_data.empty
assert "latitude" in workout_data.time_series_data.columns
assert "longitude" in workout_data.time_series_data.columns
assert "elevation" in workout_data.time_series_data.columns