mirror of
https://github.com/sstent/FitTrack_GarminSync.git
synced 2026-01-25 16:41:41 +00:00
- Ensure code aligns with CentralDB models - Document code alignment with CentralDB models - Remove informal reference documents (data-model.md, DB_API_SPEC.json, GARMINSYNC_SPEC.md) - Run linters and formatters (black, isort, mypy) - Update project configuration files - Add .dockerignore for Docker builds - Perform code formatting and import sorting - Fix type checking issues - Update documentation files - Complete implementation tasks as per spec
140 lines
5.0 KiB
Python
140 lines
5.0 KiB
Python
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
|
|
from backend.src.models.central_db_models import GarminCredentials
|
|
from backend.src.services.garmin_activity_service import GarminActivityService
|
|
from backend.src.services.garmin_health_service import GarminHealthService
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_garmin_auth_service_instance():
|
|
with patch(
|
|
"backend.src.services.garmin_auth_service.GarminAuthService"
|
|
) as MockGarminAuthService:
|
|
instance = MockGarminAuthService.return_value
|
|
yield instance
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_central_db_service_instance():
|
|
with patch(
|
|
"backend.src.services.central_db_service.CentralDBService"
|
|
) as MockCentralDBService:
|
|
service_instance = MockCentralDBService.return_value
|
|
yield service_instance
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_garmin_client_service_instance():
|
|
with patch(
|
|
"backend.src.services.garmin_client_service.GarminClientService"
|
|
) as MockGarminClientService:
|
|
instance = MockGarminClientService.return_value
|
|
yield instance
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_garmin_activity_sync_authentication_flow(
|
|
mock_garmin_auth_service_instance,
|
|
mock_central_db_service_instance,
|
|
mock_garmin_client_service_instance,
|
|
):
|
|
user_id = 1
|
|
username = "test@example.com"
|
|
password = "password123"
|
|
|
|
# Mock GarminCredentials from CentralDB
|
|
mock_credentials = GarminCredentials(
|
|
garmin_username=username, garmin_password_plaintext=password
|
|
)
|
|
mock_central_db_service_instance.get_garmin_credentials.return_value = (
|
|
mock_credentials
|
|
)
|
|
|
|
# Mock GarminClientService authentication
|
|
mock_garmin_client_service_instance.is_authenticated.return_value = False
|
|
mock_garmin_client_service_instance.authenticate.return_value = True
|
|
|
|
# Mock GarminClientService.get_client().get_activities
|
|
mock_garmin_client_instance = AsyncMock()
|
|
mock_garmin_client_service_instance.get_client.return_value = (
|
|
mock_garmin_client_instance
|
|
)
|
|
mock_garmin_client_instance.get_activities.return_value = (
|
|
[]
|
|
) # Simulate no activities
|
|
|
|
activity_service = GarminActivityService(
|
|
garmin_client_service=mock_garmin_client_service_instance,
|
|
activity_download_service=AsyncMock(), # Mock this dependency
|
|
garmin_auth_service=mock_garmin_auth_service_instance, # Still needed for init, but methods not called
|
|
central_db_service=mock_central_db_service_instance,
|
|
)
|
|
|
|
# Call sync_activities_in_background, which will trigger authentication
|
|
await activity_service.sync_activities_in_background(user_id=user_id)
|
|
|
|
# Assertions
|
|
mock_central_db_service_instance.get_garmin_credentials.assert_called_once_with(
|
|
user_id
|
|
)
|
|
mock_garmin_client_service_instance.update_credentials.assert_called_once_with(
|
|
username, password
|
|
)
|
|
mock_garmin_client_service_instance.is_authenticated.assert_called_once()
|
|
mock_garmin_client_service_instance.authenticate.assert_called_once()
|
|
mock_garmin_client_instance.get_activities.assert_called_once()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_garmin_health_sync_authentication_flow(
|
|
mock_garmin_auth_service_instance,
|
|
mock_central_db_service_instance,
|
|
mock_garmin_client_service_instance,
|
|
):
|
|
user_id = 1
|
|
username = "test@example.com"
|
|
password = "password123"
|
|
|
|
# Mock GarminCredentials from CentralDB
|
|
mock_credentials = GarminCredentials(
|
|
garmin_username=username, garmin_password_plaintext=password
|
|
)
|
|
mock_central_db_service_instance.get_garmin_credentials.return_value = (
|
|
mock_credentials
|
|
)
|
|
|
|
# Mock GarminClientService authentication
|
|
mock_garmin_client_service_instance.is_authenticated.return_value = False
|
|
mock_garmin_client_service_instance.authenticate.return_value = True
|
|
|
|
# Mock GarminClientService.get_client().get_daily_summary
|
|
mock_garmin_client_instance = AsyncMock()
|
|
mock_garmin_client_service_instance.get_client.return_value = (
|
|
mock_garmin_client_instance
|
|
)
|
|
mock_garmin_client_instance.get_daily_summary.return_value = (
|
|
[]
|
|
) # Simulate no summaries
|
|
|
|
health_service = GarminHealthService(
|
|
garmin_client_service=mock_garmin_client_service_instance,
|
|
central_db_service=mock_central_db_service_instance,
|
|
garmin_auth_service=mock_garmin_auth_service_instance, # Still needed for init, but methods not called
|
|
)
|
|
|
|
# Call sync_health_metrics_in_background, which will trigger authentication
|
|
await health_service.sync_health_metrics_in_background(user_id=user_id)
|
|
|
|
# Assertions
|
|
mock_central_db_service_instance.get_garmin_credentials.assert_called_once_with(
|
|
user_id
|
|
)
|
|
mock_garmin_client_service_instance.update_credentials.assert_called_once_with(
|
|
username, password
|
|
)
|
|
mock_garmin_client_service_instance.is_authenticated.assert_called_once()
|
|
mock_garmin_client_service_instance.authenticate.assert_called_once()
|
|
mock_garmin_client_instance.get_daily_summary.assert_called_once()
|