Complete spec: Code alignment and documentation cleanup

- 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
This commit is contained in:
2025-12-18 13:21:54 -08:00
parent b0aa585372
commit ca9d7d9e90
58 changed files with 2726 additions and 377 deletions

View File

@@ -0,0 +1,63 @@
from unittest.mock import AsyncMock, patch
import httpx
import pytest
from backend.src.models.central_db_models import User # noqa: F401
from backend.src.services.central_db_service import CentralDBService
@pytest.fixture
def central_db_service():
return CentralDBService(base_url="http://test-central-db")
@pytest.mark.asyncio
async def test_get_user_by_email_success(central_db_service):
mock_response = AsyncMock()
mock_response.status_code = 200
mock_response.json.return_value = [
{"id": "1", "username": "testuser", "email": "test@example.com"}
]
with patch("httpx.AsyncClient.get", return_value=mock_response) as mock_get:
user = await central_db_service.get_user_by_email("test@example.com")
mock_get.assert_called_once_with(
"http://test-central-db/users?email=test@example.com"
)
assert user is not None
assert user.email == "test@example.com"
@pytest.mark.asyncio
async def test_get_user_by_email_not_found(central_db_service):
mock_response = AsyncMock()
mock_response.status_code = 200
mock_response.json.return_value = []
with patch("httpx.AsyncClient.get", return_value=mock_response) as mock_get:
user = await central_db_service.get_user_by_email("nonexistent@example.com")
mock_get.assert_called_once_with(
"http://test-central-db/users?email=nonexistent@example.com"
)
assert user is None
@pytest.mark.asyncio
async def test_get_user_by_email_api_error(central_db_service):
mock_response = AsyncMock()
mock_response.status_code = 500
mock_response.raise_for_status.side_effect = httpx.HTTPStatusError(
"Server Error",
request=httpx.Request(
"GET", "http://test-central-db/users?email=error@example.com"
),
response=mock_response,
)
with patch("httpx.AsyncClient.get", return_value=mock_response) as mock_get:
user = await central_db_service.get_user_by_email("error@example.com")
mock_get.assert_called_once_with(
"http://test-central-db/users?email=error@example.com"
)
assert user is None

View File

@@ -2,15 +2,15 @@ from unittest.mock import AsyncMock, patch
import pytest
from src.schemas import GarminCredentials
from src.services.garmin_activity_service import GarminActivityService
from src.services.garmin_health_service import GarminHealthService
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(
"src.services.garmin_activity_service.GarminAuthService"
"backend.src.services.garmin_auth_service.GarminAuthService"
) as MockGarminAuthService:
instance = MockGarminAuthService.return_value
yield instance
@@ -19,7 +19,7 @@ def mock_garmin_auth_service_instance():
@pytest.fixture
def mock_central_db_service_instance():
with patch(
"src.services.garmin_activity_service.CentralDBService"
"backend.src.services.central_db_service.CentralDBService"
) as MockCentralDBService:
service_instance = MockCentralDBService.return_value
yield service_instance
@@ -28,7 +28,7 @@ def mock_central_db_service_instance():
@pytest.fixture
def mock_garmin_client_service_instance():
with patch(
"src.services.garmin_activity_service.GarminClientService"
"backend.src.services.garmin_client_service.GarminClientService"
) as MockGarminClientService:
instance = MockGarminClientService.return_value
yield instance