Add tests for Guest model and corresponding fixtures

Introduce unit tests for the Guest model covering properties, methods, and behaviors such as creation, status updates, and permissions. Add `guest_fixture` in `conftest.py` to streamline reusable test setup for Guest instances.
This commit is contained in:
2025-02-28 15:01:13 +01:00
parent 0bbd74ff50
commit d442182ed0
2 changed files with 135 additions and 1 deletions

View File

@@ -0,0 +1,102 @@
# tests/models/test_guest.py
import uuid
from datetime import datetime, timezone
from app.models.guest import Guest, GuestStatus
def test_create_guest(db_session, mock_user):
# Arrange
guest = Guest(
id=uuid.uuid4(),
event_id=uuid.uuid4(),
invited_by=mock_user.id,
full_name="Jane Smith",
email="janesmith@example.com",
phone="9876543210",
invitation_code="INV654321",
status=GuestStatus.PENDING,
max_additional_guests=3,
dietary_restrictions="Vegetarian",
notes="VIP Guest",
custom_fields={"special_request": "Near the buffet"},
)
db_session.add(guest)
# Act
db_session.commit()
created_guest = db_session.query(Guest).filter_by(id=guest.id).first()
# Assert
assert created_guest is not None
assert created_guest.full_name == "Jane Smith"
assert created_guest.email == "janesmith@example.com"
assert created_guest.phone == "9876543210"
assert created_guest.invitation_code == "INV654321"
assert created_guest.status == GuestStatus.PENDING
assert created_guest.max_additional_guests == 3
assert created_guest.dietary_restrictions == "Vegetarian"
assert created_guest.notes == "VIP Guest"
assert created_guest.custom_fields == {"special_request": "Near the buffet"}
def test_total_guests_property(guest_fixture):
# Act
total_guests = guest_fixture.total_guests
# Assert
assert total_guests == 2 # 1 guest + 1 additional guest
def test_has_responded_property(guest_fixture):
# Act
responded = guest_fixture.has_responded
# Assert
assert responded is False # Default status is INVITED
# Update status to CONFIRMED
guest_fixture.status = GuestStatus.CONFIRMED
assert guest_fixture.has_responded is True
def test_update_status_method(guest_fixture):
# Act: Update status to CONFIRMED
guest_fixture.update_status(GuestStatus.CONFIRMED)
# Assert: Status is updated and response date is set
assert guest_fixture.status == GuestStatus.CONFIRMED
assert guest_fixture.response_date is not None
assert abs(
(guest_fixture.response_date - datetime.now(timezone.utc)).total_seconds()) < 10 # Response date is recent
def test_repr_method(guest_fixture):
# Act
repr_output = repr(guest_fixture)
# Assert
assert repr_output == f"<Guest {guest_fixture.full_name} ({guest_fixture.status.value})>"
def test_invitation_sent_at(guest_fixture):
# Assert
assert guest_fixture.invitation_sent_at is not None
assert abs((guest_fixture.invitation_sent_at - datetime.now(timezone.utc)).total_seconds()) < 10
def test_guest_is_blocked(guest_fixture):
# Act & Assert
assert guest_fixture.is_blocked is False
# Set guest to blocked
guest_fixture.is_blocked = True
assert guest_fixture.is_blocked is True
def test_can_bring_guests(guest_fixture):
# Act & Assert
assert guest_fixture.can_bring_guests is True
# Remove guest's "bring guests" permission
guest_fixture.can_bring_guests = False
assert guest_fixture.can_bring_guests is False