Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,27 +82,8 @@ jobs:
needs: changes
if: ${{ needs.changes.outputs.backend == 'true' }}
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: open-wearables
POSTGRES_PASSWORD: open-wearables
POSTGRES_DB: open_wearables_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis:7
ports:
- 6379:6379
env:
ENV: test
TEST_DATABASE_URL: postgresql+psycopg://open-wearables:open-wearables@localhost:5432/open_wearables_test
SECRET_KEY: test-secret-key-for-ci
MASTER_KEY: dGVzdC1tYXN0ZXIta2V5LWZvci10ZXN0aW5nLW9ubHk=
steps:
Expand Down
3 changes: 1 addition & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ stop: ## Stops running instance
down: ## Kills running instance
$(DOCKER_COMMAND) down

test: ## Run the tests.
export ENV=backend/config/.env.test && \
test: ## Run the tests
cd backend && uv run pytest -v --cov=app

migrate: ## Apply all migrations
Expand Down
5 changes: 4 additions & 1 deletion backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ uv run alembic downgrade -1

### Running Tests

Tests use **testcontainers** — a disposable PostgreSQL container is created
automatically. Just make sure Docker is running.

```bash
# Run all tests
uv run pytest
Expand All @@ -133,7 +136,7 @@ uv run pytest
uv run pytest --cov=app --cov-report=html

# Run specific test file
uv run pytest tests/path/to/test_file.py
uv run pytest tests/api/v1/test_users.py
```

### Code Quality
Expand Down
1 change: 1 addition & 0 deletions backend/_tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Tests package for Open Wearables backend
1 change: 1 addition & 0 deletions backend/_tests/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# API tests package
1 change: 1 addition & 0 deletions backend/_tests/api/v1/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# API v1 tests package
40 changes: 40 additions & 0 deletions backend/_tests/api/v1/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
API v1 specific fixtures.
"""

import pytest
from sqlalchemy.orm import Session

from app.models import ApiKey, Developer, User
from _tests.factories import ApiKeyFactory, DeveloperFactory, UserFactory
from _tests.utils import api_key_headers, developer_auth_headers


@pytest.fixture
def developer(db: Session) -> Developer:
"""Create a test developer for authentication."""
return DeveloperFactory(email="test@example.com", password="test_password")


@pytest.fixture
def api_key(db: Session, developer: Developer) -> ApiKey:
"""Create a test API key."""
return ApiKeyFactory(developer=developer, name="Test API Key")


@pytest.fixture
def user(db: Session) -> User:
"""Create a test user."""
return UserFactory()


@pytest.fixture
def auth_headers(developer: Developer) -> dict[str, str]:
"""Get authentication headers for the test developer."""
return developer_auth_headers(developer.id)


@pytest.fixture
def api_key_header(api_key: ApiKey) -> dict[str, str]:
"""Get API key headers."""
return api_key_headers(api_key.id)
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import ApiKeyFactory, DeveloperFactory
from tests.utils import developer_auth_headers
from _tests.factories import ApiKeyFactory, DeveloperFactory
from _tests.utils import developer_auth_headers


class TestListApiKeys:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from sqlalchemy.orm import Session
from starlette.testclient import TestClient

from tests.factories import ApplicationFactory, DeveloperFactory
from tests.utils import developer_auth_headers
from _tests.factories import ApplicationFactory, DeveloperFactory
from _tests.utils import developer_auth_headers


class TestListApplications:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
from sqlalchemy.orm import Session

from app.config import settings
from tests.factories import DeveloperFactory
from tests.utils import developer_auth_headers
from _tests.factories import DeveloperFactory
from _tests.utils import developer_auth_headers


class TestLogin:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
from sqlalchemy.orm import Session

from app.schemas.oauth import ConnectionStatus
from tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory
from tests.utils import api_key_headers
from _tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory
from _tests.utils import api_key_headers


class TestConnectionsEndpoints:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import (
from _tests.factories import (
DataPointSeriesFactory,
DataSourceFactory,
DeveloperFactory,
Expand All @@ -17,7 +17,7 @@
UserConnectionFactory,
UserFactory,
)
from tests.utils import developer_auth_headers
from _tests.utils import developer_auth_headers


class TestGetDashboardStats:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from starlette.testclient import TestClient

from app.services.sdk_token_service import create_sdk_user_token
from tests.factories import ApiKeyFactory
from _tests.factories import ApiKeyFactory


@pytest.fixture(autouse=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import UserConnectionFactory, UserFactory
from _tests.factories import UserConnectionFactory, UserFactory


class TestGarminPingWebhook:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import ApiKeyFactory, UserFactory
from tests.utils import api_key_headers
from _tests.factories import ApiKeyFactory, UserFactory
from _tests.utils import api_key_headers


class TestXMLImportEndpoint:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import DeveloperFactory
from tests.utils import developer_auth_headers
from _tests.factories import DeveloperFactory
from _tests.utils import developer_auth_headers


class TestOAuthAuthorizeEndpoint:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from starlette.testclient import TestClient

from app.services.sdk_token_service import create_sdk_user_token
from tests.factories import ApiKeyFactory, DeveloperFactory
from tests.utils import developer_auth_headers
from _tests.factories import ApiKeyFactory, DeveloperFactory
from _tests.utils import developer_auth_headers


@pytest.fixture(autouse=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from starlette.testclient import TestClient

from app.config import settings
from tests.factories import ApplicationFactory, DeveloperFactory, UserFactory
from _tests.factories import ApplicationFactory, DeveloperFactory, UserFactory


class TestCreateUserToken:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sqlalchemy.orm import Session

from app.schemas.oauth import ProviderName
from tests.factories import (
from _tests.factories import (
ApiKeyFactory,
DataPointSeriesFactory,
DataSourceFactory,
Expand All @@ -18,7 +18,7 @@
UserFactory,
WorkoutDetailsFactory,
)
from tests.utils import api_key_headers
from _tests.utils import api_key_headers


class TestSleepSummaryEndpoint:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from sqlalchemy.orm import Session

from app.schemas.oauth import ConnectionStatus
from tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory
from _tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory


class TestSyncDataEndpoint:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

from app.config import settings
from app.services import refresh_token_service
from tests.factories import ApplicationFactory, DeveloperFactory, UserFactory
from _tests.factories import ApplicationFactory, DeveloperFactory, UserFactory


class TestRefreshToken:
Expand Down Expand Up @@ -257,7 +257,7 @@ def test_sdk_token_returns_refresh_token_for_app_credentials(
def test_admin_sdk_token_returns_refresh_token(self, client: TestClient, db: Session, api_v1_prefix: str) -> None:
"""Admin-generated SDK token should return refresh token."""
# Arrange
from tests.utils import developer_auth_headers
from _tests.utils import developer_auth_headers

developer = DeveloperFactory()
user = UserFactory() # Create user
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

from app.config import settings
from app.models.user_invitation_code import UserInvitationCode
from tests.factories import DeveloperFactory, UserFactory
from tests.utils import developer_auth_headers
from _tests.factories import DeveloperFactory, UserFactory
from _tests.utils import developer_auth_headers


class TestGenerateInvitationCode:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import ApiKeyFactory, DeveloperFactory, UserFactory
from tests.utils import api_key_headers, developer_auth_headers
from _tests.factories import ApiKeyFactory, DeveloperFactory, UserFactory
from _tests.utils import api_key_headers, developer_auth_headers


class TestListUsers:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from sqlalchemy.orm import Session

from app.schemas.oauth import ConnectionStatus
from tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory
from _tests.factories import ApiKeyFactory, UserConnectionFactory, UserFactory


class TestVendorWorkoutsEndpoints:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from tests.factories import ApiKeyFactory, DataSourceFactory, EventRecordFactory, UserFactory
from tests.utils import api_key_headers
from _tests.factories import ApiKeyFactory, DataSourceFactory, EventRecordFactory, UserFactory
from _tests.utils import api_key_headers


class TestWorkoutsEndpoints:
Expand Down
Loading
Loading