Add tests for Event model and new mock_user fixture
All checks were successful
Build and Push Docker Images / changes (push) Successful in 5s
Build and Push Docker Images / build-backend (push) Successful in 51s
Build and Push Docker Images / build-frontend (push) Has been skipped

Introduce comprehensive tests for the Event model, covering creation, updates, deletions, relationships, defaults, and constraints. Added the `mock_user` fixture to streamline user-related test setups and ensure proper linkage between users and events. Improves test coverage and ensures model behavior consistency.
This commit is contained in:
2025-02-28 14:25:00 +01:00
parent 82e0f192b1
commit 180c4c2c09
2 changed files with 248 additions and 3 deletions

View File

@@ -1,9 +1,10 @@
# tests/conftest.py
import pytest
from sqlalchemy.orm import Session, sessionmaker
import uuid
from app.models.user import User
from app.utils.test_utils import setup_test_db, teardown_test_db
@pytest.fixture(scope="function")
def db_session():
"""
@@ -19,4 +20,22 @@ def db_session():
yield session
# Clean up
teardown_test_db(test_engine)
teardown_test_db(test_engine)
@pytest.fixture
def mock_user(db_session):
"""Fixture to create and return a mock User instance."""
mock_user = User(
id=uuid.uuid4(),
email="mockuser@example.com",
password_hash="mockhashedpassword",
first_name="Mock",
last_name="User",
phone_number="1234567890",
is_active=True,
is_superuser=False
)
db_session.add(mock_user)
db_session.commit()
return mock_user

View File

@@ -0,0 +1,226 @@
# tests/models/test_event.py
import uuid
from datetime import datetime, time, timezone
from app.models.event import Event
def test_create_event(db_session):
# Arrange
new_event = Event(
id=uuid.uuid4(),
title="Emma's First Birthday Party",
slug="emma-birthday-party",
description="An animal-themed birthday party to celebrate Emma's 1st birthday!",
location_name="Sunshine Park",
location_address="123 Sunny Street, Springfield",
location_url="https://maps.example.com/sunshine-park",
event_date=datetime(2024, 5, 20, 14, 0, tzinfo=timezone.utc),
timezone="UTC",
created_by=uuid.uuid4(),
is_public=False,
rsvp_deadline=datetime(2024, 5, 15, 23, 59, tzinfo=timezone.utc),
rsvp_enabled=True,
gift_registry_enabled=True,
updates_enabled=True,
max_guests_per_invitation=5,
contact_email="host@example.com",
contact_phone="555-123-4567",
)
db_session.add(new_event)
# Act
db_session.commit()
created_event = db_session.query(Event).filter_by(slug="emma-birthday-party").first()
# Assert
assert created_event is not None
assert created_event.title == "Emma's First Birthday Party"
assert created_event.description.startswith("An animal-themed birthday party")
assert created_event.location_name == "Sunshine Park"
assert created_event.event_date == datetime(2024, 5, 20, 14, 0, tzinfo=timezone.utc)
assert created_event.is_public is False
assert created_event.rsvp_enabled is True
def test_update_event(db_session):
# Arrange
event = Event(
id=uuid.uuid4(),
title="Original Title",
slug="original-slug",
timezone="UTC",
event_date=datetime(2024, 6, 15, 12, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
is_public=True
)
db_session.add(event)
db_session.commit()
# Act
event.title = "Updated Event Title"
event.is_public = False
db_session.commit()
updated_event = db_session.query(Event).filter_by(slug="original-slug").first()
# Assert
assert updated_event is not None
assert updated_event.title == "Updated Event Title"
assert updated_event.is_public is False
def test_delete_event(db_session):
# Arrange
event = Event(
id=uuid.uuid4(),
title="Event to Delete",
slug="event-to-delete",
timezone="UTC",
event_date=datetime(2024, 7, 10, 18, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
)
db_session.add(event)
db_session.commit()
# Act
db_session.delete(event)
db_session.commit()
deleted_event = db_session.query(Event).filter_by(slug="event-to-delete").first()
# Assert
assert deleted_event is None
def test_event_unique_slug_constraint(db_session):
# Arrange
slug = "unique-event-slug"
event1 = Event(
id=uuid.uuid4(),
title="First Event",
slug=slug,
timezone="UTC",
event_date=datetime(2024, 8, 1, 10, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
)
event2 = Event(
id=uuid.uuid4(),
title="Second Event",
slug=slug,
timezone="UTC",
event_date=datetime(2024, 8, 15, 16, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
)
db_session.add(event1)
db_session.commit()
# Act & Assert
db_session.add(event2)
try:
db_session.commit()
assert False, "Expected an IntegrityError due to unique constraint on slug."
except Exception:
db_session.rollback()
def test_event_required_fields(db_session):
# Arrange
invalid_event = Event(
id=uuid.uuid4(),
created_by=uuid.uuid4(), # Only trying to insert the minimal fields.
)
db_session.add(invalid_event)
# Act & Assert
try:
db_session.commit()
assert False, "Expected an error due to missing required fields."
except Exception:
db_session.rollback()
def test_event_defaults(db_session):
# Arrange
event = Event(
id=uuid.uuid4(),
title="Default Field Test",
slug="default-field-test",
timezone="UTC",
event_date=datetime(2024, 9, 10, 14, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
)
db_session.add(event)
# Act
db_session.commit()
created_event = db_session.query(Event).filter_by(slug="default-field-test").first()
# Assert
assert created_event is not None
assert created_event.is_active is True
assert created_event.rsvp_enabled is True
assert created_event.gift_registry_enabled is True
assert created_event.updates_enabled is True
def test_event_relationship_with_user(db_session, mock_user):
"""Test the relationship between Event and its creator (User)."""
# Arrange
event = Event(
id=uuid.uuid4(),
title="User Relationship Event",
slug="user-relationship-event",
timezone="UTC",
event_date=datetime(2024, 12, 25, 12, 0, tzinfo=timezone.utc),
created_by=mock_user.id, # Link with the mock user
)
db_session.add(event)
db_session.commit()
# Act
created_event = db_session.query(Event).filter_by(slug="user-relationship-event").first()
# Assert
assert created_event.creator == mock_user
def test_event_string_representation():
# Arrange
event = Event(
title="Sample Event",
event_date=datetime(2024, 8, 5, 9, 30, tzinfo=timezone.utc),
)
# Act
representation = repr(event)
# Assert
assert representation == "<Event Sample Event (2024-08-05 09:30:00+00:00)>"
def test_event_with_custom_fields_json(db_session):
# Arrange
event = Event(
id=uuid.uuid4(),
title="With JSON Fields",
slug="json-fields",
timezone="UTC",
event_date=datetime(2024, 11, 1, 10, 0, tzinfo=timezone.utc),
created_by=uuid.uuid4(),
custom_theme_settings={"color": "blue", "font": "Roboto"},
additional_info={"attendees": 100, "budget": "1000 USD"},
)
db_session.add(event)
# Act
db_session.commit()
created_event = db_session.query(Event).filter_by(slug="json-fields").first()
# Assert
assert created_event.custom_theme_settings == {"color": "blue", "font": "Roboto"}
assert created_event.additional_info == {"attendees": 100, "budget": "1000 USD"}