Add tests for Event model and new mock_user fixture
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:
@@ -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
|
||||
|
||||
226
backend/tests/models/test_event.py
Normal file
226
backend/tests/models/test_event.py
Normal 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"}
|
||||
Reference in New Issue
Block a user