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.
226 lines
6.3 KiB
Python
226 lines
6.3 KiB
Python
# 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"} |