Files
FitTrack2/FitnessSync/backend/tests/unit/test_garmin_data.py

115 lines
4.7 KiB
Python

import pytest
from unittest.mock import MagicMock, patch
from datetime import datetime, timedelta
import garth
from garth.exc import GarthException
from src.services.garmin.client import GarminClient
from src.models.api_token import APIToken # Needed for AuthMixin
@pytest.fixture
def garmin_client_instance():
"""Fixture for a GarminClient instance with test credentials."""
client = GarminClient(username="testuser", password="testpassword")
client.is_connected = True # Assume connected for data tests
return client
@patch("garth.client.connectapi")
def test_get_activities_success(mock_connectapi, garmin_client_instance):
"""Test successful fetching of activities."""
mock_connectapi.return_value = [{"activityId": 1, "activityName": "Run"}, {"activityId": 2, "activityName": "Bike"}]
start_date = "2023-01-01"
end_date = "2023-01-07"
limit = 2
activities = garmin_client_instance.get_activities(start_date, end_date, limit)
mock_connectapi.assert_called_once_with(
"/activitylist-service/activities/search/activities",
params={"startDate": start_date, "endDate": end_date, "limit": limit}
)
assert len(activities) == 2
assert activities[0]["activityName"] == "Run"
@patch("garth.client.connectapi")
def test_get_activities_failure(mock_connectapi, garmin_client_instance):
"""Test failure during fetching of activities."""
mock_connectapi.side_effect = GarthException("API error")
start_date = "2023-01-01"
end_date = "2023-01-07"
limit = 2
with pytest.raises(GarthException, match="API error"):
garmin_client_instance.get_activities(start_date, end_date, limit)
mock_connectapi.assert_called_once()
@patch("garth.client.download")
def test_download_activity_success(mock_download, garmin_client_instance):
"""Test successful downloading of an activity file."""
mock_download.return_value = b"file_content_mock"
activity_id = "12345"
file_type = "tcx"
file_content = garmin_client_instance.download_activity(activity_id, file_type)
mock_download.assert_called_once_with(f"/download-service/export/{file_type}/activity/{activity_id}")
assert file_content == b"file_content_mock"
@patch("garth.client.download")
def test_download_activity_failure(mock_download, garmin_client_instance):
"""Test failure during downloading of an activity file."""
mock_download.side_effect = GarthException("Download error")
activity_id = "12345"
file_type = "gpx"
file_content = garmin_client_instance.download_activity(activity_id, file_type)
mock_download.assert_called_once()
assert file_content is None # Should return None on exception
@patch("src.services.garmin.data.DailySteps")
@patch("src.services.garmin.data.DailyHRV")
@patch("src.services.garmin.data.SleepData")
def test_get_daily_metrics_success(mock_sleep_data, mock_daily_hrv, mock_daily_steps, garmin_client_instance):
"""Test successful fetching of daily metrics."""
mock_daily_steps.list.return_value = [MagicMock(calendar_date="2023-01-01", total_steps=1000)]
mock_daily_hrv.list.return_value = [MagicMock(calendar_date="2023-01-01", last_night_avg=50)]
mock_sleep_data.list.return_value = [MagicMock(daily_sleep_dto=MagicMock(calendar_date="2023-01-01", sleep_time_seconds=28800))]
start_date = "2023-01-01"
end_date = "2023-01-01"
metrics = garmin_client_instance.get_daily_metrics(start_date, end_date)
mock_daily_steps.list.assert_called_once_with(datetime(2023, 1, 1).date(), period=1)
mock_daily_hrv.list.assert_called_once_with(datetime(2023, 1, 1).date(), period=1)
mock_sleep_data.list.assert_called_once_with(datetime(2023, 1, 1).date(), days=1)
assert len(metrics["steps"]) == 1
assert metrics["steps"][0].total_steps == 1000
assert len(metrics["hrv"]) == 1
assert metrics["hrv"][0].last_night_avg == 50
assert len(metrics["sleep"]) == 1
assert metrics["sleep"][0].daily_sleep_dto.sleep_time_seconds == 28800
@patch("src.services.garmin.data.DailySteps")
@patch("src.services.garmin.data.DailyHRV")
@patch("src.services.garmin.data.SleepData")
def test_get_daily_metrics_partial_failure(mock_sleep_data, mock_daily_hrv, mock_daily_steps, garmin_client_instance):
"""Test fetching daily metrics with some failures."""
mock_daily_steps.list.side_effect = GarthException("Steps error")
mock_daily_hrv.list.return_value = [MagicMock(calendar_date="2023-01-01", last_night_avg=50)]
mock_sleep_data.list.return_value = []
start_date = "2023-01-01"
end_date = "2023-01-01"
metrics = garmin_client_instance.get_daily_metrics(start_date, end_date)
assert metrics["steps"] == [] # Should return empty list on error
assert len(metrics["hrv"]) == 1
assert metrics["sleep"] == []