Introduced comprehensive unit tests for EmailTemplate and NotificationLog, including creation, field validation, and custom methods. Added relevant test fixtures to support these models and expanded `conftest.py` for reusability. Validates functionality and maintains model integrity.
241 lines
7.0 KiB
Python
241 lines
7.0 KiB
Python
# tests/conftest.py
|
|
import uuid
|
|
from datetime import datetime, timezone
|
|
|
|
import pytest
|
|
|
|
from app.models import GiftItem, GiftStatus, GiftPriority, RSVP, RSVPStatus, EventMedia, MediaType, MediaPurpose, \
|
|
EventTheme, Guest, GuestStatus, ActivityType, ActivityLog, EmailTemplate, TemplateType, NotificationLog, \
|
|
NotificationType, NotificationStatus
|
|
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():
|
|
"""
|
|
Creates a fresh SQLite in-memory database for each test function.
|
|
|
|
Yields a SQLAlchemy session that can be used for testing.
|
|
"""
|
|
# Set up the database
|
|
test_engine, TestingSessionLocal = setup_test_db()
|
|
|
|
# Create a session
|
|
with TestingSessionLocal() as session:
|
|
yield session
|
|
|
|
# Clean up
|
|
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
|
|
|
|
|
|
@pytest.fixture
|
|
def gift_item_fixture(db_session, mock_user):
|
|
"""
|
|
Fixture to create and return a default GiftItem instance.
|
|
The event_id, added_by, and other necessary attributes are predefined.
|
|
"""
|
|
gift_item = GiftItem(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
added_by=mock_user.id,
|
|
name="Default Gift",
|
|
description="Default gift description.",
|
|
price=100.00,
|
|
currency="USD",
|
|
quantity_requested=5,
|
|
quantity_received=0,
|
|
status=GiftStatus.AVAILABLE,
|
|
priority=GiftPriority.MEDIUM,
|
|
is_visible=True
|
|
)
|
|
db_session.add(gift_item)
|
|
db_session.commit()
|
|
return gift_item
|
|
|
|
|
|
@pytest.fixture
|
|
def rsvp_fixture(db_session, mock_user):
|
|
"""
|
|
Fixture to create and return a default RSVP instance.
|
|
The event_id and guest_id fields are predefined for testing.
|
|
"""
|
|
rsvp = RSVP(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
guest_id=uuid.uuid4(),
|
|
status=RSVPStatus.ATTENDING,
|
|
number_of_guests=2,
|
|
response_message="Looking forward to the event!",
|
|
dietary_requirements="Vegetarian",
|
|
)
|
|
db_session.add(rsvp)
|
|
db_session.commit()
|
|
return rsvp
|
|
|
|
|
|
@pytest.fixture
|
|
def event_media_fixture(db_session, mock_user):
|
|
"""
|
|
Fixture to create and return a default EventMedia instance.
|
|
"""
|
|
event_media = EventMedia(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
uploaded_by=mock_user.id,
|
|
file_path="uploads/sample.jpg",
|
|
original_filename="sample.jpg",
|
|
media_type=MediaType.IMAGE,
|
|
content_type="image/jpeg",
|
|
file_size=2048,
|
|
purpose=MediaPurpose.GALLERY,
|
|
is_public=True,
|
|
display_order=1,
|
|
title="Sample Image",
|
|
description="A sample image for testing.",
|
|
media_metadata={"resolution": "1920x1080"},
|
|
)
|
|
db_session.add(event_media)
|
|
db_session.commit()
|
|
return event_media
|
|
|
|
|
|
@pytest.fixture
|
|
def event_theme_fixture(db_session):
|
|
"""
|
|
Fixture to create and return a default EventTheme instance.
|
|
"""
|
|
event_theme = EventTheme(
|
|
id=uuid.uuid4(),
|
|
name="Animal Theme",
|
|
description="An animal-themed design for events.",
|
|
preview_image_url="https://example.com/preview/animal_theme.jpg",
|
|
color_palette={
|
|
"primary": "#ff5722",
|
|
"secondary": "#4caf50",
|
|
"background": "#ffffff",
|
|
"text": "#000000"
|
|
},
|
|
fonts={
|
|
"header": "Roboto",
|
|
"body": "Open Sans"
|
|
}
|
|
)
|
|
db_session.add(event_theme)
|
|
db_session.commit()
|
|
return event_theme
|
|
|
|
|
|
@pytest.fixture
|
|
def guest_fixture(db_session, mock_user):
|
|
"""
|
|
Fixture to create and return a default Guest instance.
|
|
"""
|
|
guest = Guest(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
invited_by=mock_user.id,
|
|
full_name="John Doe",
|
|
email="johndoe@example.com",
|
|
phone="1234567890",
|
|
invitation_code="INV123456",
|
|
status=GuestStatus.INVITED,
|
|
max_additional_guests=2,
|
|
actual_additional_guests=1,
|
|
invitation_sent_at=datetime.now(timezone.utc),
|
|
dietary_restrictions="None",
|
|
notes="VIP Guest",
|
|
custom_fields={"allergies": "None", "special_request": "Near the stage"},
|
|
is_blocked=False,
|
|
can_bring_guests=True,
|
|
)
|
|
db_session.add(guest)
|
|
db_session.commit()
|
|
return guest
|
|
|
|
|
|
@pytest.fixture
|
|
def activity_log_fixture(db_session, mock_user, guest_fixture):
|
|
"""
|
|
Fixture to create and return a default ActivityLog entry.
|
|
"""
|
|
activity_log_entry = ActivityLog(
|
|
id=uuid.uuid4(),
|
|
activity_type=ActivityType.USER_LOGIN,
|
|
description="User successfully logged in.",
|
|
event_id=None,
|
|
user_id=mock_user.id,
|
|
guest_id=None,
|
|
target_id=None,
|
|
target_type=None,
|
|
ip_address="192.168.1.1",
|
|
user_agent="Mozilla/5.0",
|
|
activity_data={"extra_info": "Login from web app"},
|
|
created_at=datetime.now(timezone.utc)
|
|
)
|
|
db_session.add(activity_log_entry)
|
|
db_session.commit()
|
|
return activity_log_entry
|
|
|
|
|
|
@pytest.fixture
|
|
def email_template_fixture(db_session, mock_user):
|
|
"""
|
|
Fixture to create and return a default EmailTemplate instance.
|
|
"""
|
|
email_template = EmailTemplate(
|
|
id=uuid.uuid4(),
|
|
name="Invitation Template",
|
|
description="A template for event invitations.",
|
|
template_type=TemplateType.INVITATION,
|
|
subject="You're invited to {{event_name}}!",
|
|
html_content="<h1>Welcome to {{event_name}}</h1><p>We look forward to seeing you!</p>",
|
|
text_content="Welcome to {{event_name}}. We look forward to seeing you!",
|
|
variables={"event_name": "Birthday Party"},
|
|
event_id=None, # Global template
|
|
created_by=mock_user.id,
|
|
is_active=True,
|
|
is_system=False,
|
|
)
|
|
db_session.add(email_template)
|
|
db_session.commit()
|
|
return email_template
|
|
|
|
@pytest.fixture
|
|
def notification_log_fixture(db_session, email_template_fixture, guest_fixture):
|
|
"""
|
|
Fixture to create and return a default NotificationLog entry.
|
|
"""
|
|
notification_log = NotificationLog(
|
|
id=uuid.uuid4(),
|
|
notification_type=NotificationType.EMAIL,
|
|
status=NotificationStatus.QUEUED,
|
|
subject="You're invited!",
|
|
content_preview="Join us for an unforgettable event.",
|
|
template_id=email_template_fixture.id,
|
|
event_id=guest_fixture.event_id,
|
|
guest_id=guest_fixture.id,
|
|
recipient="example@example.com",
|
|
notification_metadata={"extra_info": "Email sent via SendGrid"},
|
|
)
|
|
db_session.add(notification_log)
|
|
db_session.commit()
|
|
return notification_log |