Refactor event API and extend authentication utilities
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:
0
backend/tests/api/routes/events/__init__.py
Normal file
0
backend/tests/api/routes/events/__init__.py
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user