Refactor event API and extend authentication utilities
All checks were successful
Build and Push Docker Images / changes (push) Successful in 6s
Build and Push Docker Images / build-backend (push) Successful in 55s
Build and Push Docker Images / build-frontend (push) Has been skipped

Refactored the event API routes to improve error handling, add logging, and provide enhanced response structures with pagination. Updated tests to use new fixtures and include additional authentication utilities to facilitate testing with FastAPI's dependency injection. Also resolved issues with timezone awareness in event schemas.
This commit is contained in:
2025-03-09 16:04:51 +01:00
parent fe2bcbd6e7
commit c2cdc3c110
7 changed files with 466 additions and 96 deletions

View File

@@ -1,10 +1,17 @@
# tests/conftest.py
import uuid
from datetime import datetime, timezone, timedelta
from typing import Dict
from typing import Optional
import pytest
from fastapi import FastAPI
from fastapi.routing import APIRouter
from fastapi.security import OAuth2PasswordBearer
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
from app.api.dependencies.auth import get_current_user
from app.core.database import get_db
from app.models import Event, GiftItem, GiftStatus, GiftPriority, GiftCategory, GiftPurchase, RSVP, RSVPStatus, \
EventMedia, MediaType, MediaPurpose, \
EventTheme, Guest, GuestStatus, ActivityType, ActivityLog, EmailTemplate, TemplateType, NotificationLog, \
@@ -39,6 +46,7 @@ async def async_test_db():
yield test_engine, AsyncTestingSessionLocal
await teardown_async_test_db(test_engine)
@pytest.fixture
def user_create_data():
return {
@@ -72,7 +80,7 @@ def mock_user(db_session):
@pytest.fixture
def event_fixture(db_session, mock_user):
def mock_event(db_session, mock_user):
"""Create a test event fixture."""
event_data = {
"title": "Birthday Party",
@@ -91,7 +99,6 @@ def event_fixture(db_session, mock_user):
return event
@pytest.fixture
def gift_item_fixture(db_session, mock_user):
"""
@@ -308,7 +315,7 @@ def gift_purchase_fixture(db_session, gift_item_fixture, guest_fixture):
@pytest.fixture
def gift_category_fixture(db_session, mock_user, event_fixture):
def gift_category_fixture(db_session, mock_user, mock_event):
"""
Fixture to create and return a GiftCategory instance.
"""
@@ -316,7 +323,7 @@ def gift_category_fixture(db_session, mock_user, event_fixture):
id=uuid.uuid4(),
name="Electronics",
description="Category for electronic gifts",
event_id=event_fixture.id,
event_id=mock_event.id,
created_by=mock_user.id,
display_order=0,
is_visible=True
@@ -344,3 +351,32 @@ def theme_data() -> Dict:
}
}
@pytest.fixture
def oauth2_scheme():
"""Return the OAuth2PasswordBearer instance used by the app."""
return OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login")
@pytest.fixture
def create_test_client():
def _create_test_client(router: APIRouter, prefix: str, db_session, user):
from fastapi import FastAPI
app = FastAPI()
# Mimic your dependency overrides here
def get_db_override():
yield db_session
def get_current_user_override():
return user
# Include your router
app.include_router(router, prefix=prefix)
# Override dependencies
app.dependency_overrides[get_db] = get_db_override
app.dependency_overrides[get_current_user] = get_current_user_override
return TestClient(app)
return _create_test_client

View File

@@ -28,23 +28,23 @@ def test_create_event(db_session, mock_user):
assert event.created_by == mock_user.id
def test_get_event(db_session, event_fixture):
def test_get_event(db_session, mock_event):
"""Test retrieving an event by ID."""
stored_event = crud_event.get(db=db_session, id=event_fixture.id)
stored_event = crud_event.get(db=db_session, id=mock_event.id)
assert stored_event
assert stored_event.id == event_fixture.id
assert stored_event.title == event_fixture.title
assert stored_event.id == mock_event.id
assert stored_event.title == mock_event.title
def test_get_event_by_slug(db_session, event_fixture):
def test_get_event_by_slug(db_session, mock_event):
"""Test retrieving an event by slug."""
stored_event = crud_event.get_by_slug(db=db_session, slug=event_fixture.slug)
stored_event = crud_event.get_by_slug(db=db_session, slug=mock_event.slug)
assert stored_event
assert stored_event.id == event_fixture.id
assert stored_event.slug == event_fixture.slug
assert stored_event.id == mock_event.id
assert stored_event.slug == mock_event.slug
def test_get_user_events(db_session, event_fixture, mock_user):
def test_get_user_events(db_session, mock_event, mock_user):
"""Test retrieving all events for a specific user."""
events = crud_event.get_user_events(
db=db_session,
@@ -53,10 +53,10 @@ def test_get_user_events(db_session, event_fixture, mock_user):
limit=100
)
assert len(events) > 0
assert any(event.id == event_fixture.id for event in events)
assert any(event.id == mock_event.id for event in events)
def test_update_event(db_session, event_fixture):
def test_update_event(db_session, mock_event):
"""Test updating an event."""
update_data = EventUpdate(
title="Updated Birthday Party",
@@ -64,18 +64,18 @@ def test_update_event(db_session, event_fixture):
)
updated_event = crud_event.update(
db=db_session,
db_obj=event_fixture,
db_obj=mock_event,
obj_in=update_data
)
assert updated_event.title == "Updated Birthday Party"
assert updated_event.description == "Updated description"
def test_delete_event(db_session, event_fixture):
def test_delete_event(db_session, mock_event):
"""Test deleting an event."""
event = crud_event.remove(db=db_session, id=event_fixture.id)
assert event.id == event_fixture.id
deleted_event = crud_event.get(db=db_session, id=event_fixture.id)
event = crud_event.remove(db=db_session, id=mock_event.id)
assert event.id == mock_event.id
deleted_event = crud_event.get(db=db_session, id=mock_event.id)
assert deleted_event is None
@@ -115,11 +115,11 @@ def test_get_upcoming_events(db_session):
assert event_date >= current_time
def test_get_public_event(db_session, event_fixture):
def test_get_public_event(db_session, mock_event):
"""Test retrieving a public event."""
public_event = crud_event.get_public_event(
db=db_session,
slug=event_fixture.slug
slug=mock_event.slug
)
assert public_event is not None
assert public_event.is_public is True

View File

@@ -77,9 +77,9 @@ def test_delete_event_theme(db_session: Session, event_theme_fixture) -> None:
assert theme is None
def test_get_active_themes(db_session: Session, event_theme_fixture, event_fixture) -> None:
def test_get_active_themes(db_session: Session, event_theme_fixture, mock_event) -> None:
# First, ensure the theme is associated with an event
event_fixture.theme_id = event_theme_fixture.id
mock_event.theme_id = event_theme_fixture.id
db_session.commit()
# Get active themes