Enhanced test coverage includes `repr` methods, model functionality, and validation logic for key models like `GiftItem`, `GiftCategory`, `EventMedia`, `RSVP`, and `GiftPurchase`. Refactored and added fixtures to support comprehensive testing scenarios. Addresses validation for gift reordering and updates `EventMedia` representation format for consistency.
125 lines
3.4 KiB
Python
125 lines
3.4 KiB
Python
# tests/models/test_rsvp.py
|
|
import uuid
|
|
from datetime import datetime, timedelta, timezone
|
|
from app.models.rsvp import RSVP, RSVPStatus
|
|
|
|
|
|
def test_create_rsvp(db_session):
|
|
# Arrange
|
|
rsvp = RSVP(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
guest_id=uuid.uuid4(),
|
|
status=RSVPStatus.NOT_ATTENDING,
|
|
number_of_guests=1,
|
|
response_message="Sorry, can't make it.",
|
|
dietary_requirements="None",
|
|
)
|
|
db_session.add(rsvp)
|
|
|
|
# Act
|
|
db_session.commit()
|
|
created_rsvp = db_session.query(RSVP).filter_by(id=rsvp.id).first()
|
|
|
|
# Assert
|
|
assert created_rsvp is not None
|
|
assert created_rsvp.status == RSVPStatus.NOT_ATTENDING
|
|
assert created_rsvp.number_of_guests == 1
|
|
assert created_rsvp.dietary_requirements == "None"
|
|
|
|
|
|
def test_update_rsvp_status(rsvp_fixture, db_session):
|
|
# Act
|
|
rsvp_fixture.update_status(new_status=RSVPStatus.MAYBE, guests_count=3)
|
|
db_session.commit()
|
|
|
|
# Assert
|
|
assert rsvp_fixture.status == RSVPStatus.MAYBE
|
|
assert rsvp_fixture.number_of_guests == 3
|
|
|
|
# Check last_updated is approximately now
|
|
assert rsvp_fixture.last_updated >= datetime.now(timezone.utc) - timedelta(seconds=1)
|
|
|
|
|
|
def test_is_attending(rsvp_fixture):
|
|
# Act
|
|
is_attending = rsvp_fixture.is_attending
|
|
|
|
# Assert
|
|
assert is_attending is True # By default RSVPStatus.ATTENDING is set in the fixture
|
|
|
|
# Update RSVP to NOT_ATTENDING and verify
|
|
rsvp_fixture.status = RSVPStatus.NOT_ATTENDING
|
|
assert rsvp_fixture.is_attending is False
|
|
|
|
|
|
def test_unique_rsvp_constraint(db_session):
|
|
# Arrange
|
|
event_id = uuid.uuid4()
|
|
guest_id = uuid.uuid4()
|
|
|
|
rsvp1 = RSVP(
|
|
id=uuid.uuid4(),
|
|
event_id=event_id,
|
|
guest_id=guest_id,
|
|
status=RSVPStatus.ATTENDING,
|
|
number_of_guests=2,
|
|
)
|
|
db_session.add(rsvp1)
|
|
db_session.commit()
|
|
|
|
# Attempt to create another RSVP for the same event and guest
|
|
rsvp2 = RSVP(
|
|
id=uuid.uuid4(),
|
|
event_id=event_id,
|
|
guest_id=guest_id,
|
|
status=RSVPStatus.NOT_ATTENDING,
|
|
number_of_guests=1,
|
|
)
|
|
db_session.add(rsvp2)
|
|
|
|
# Act and Assert
|
|
try:
|
|
db_session.commit()
|
|
# If no exception is raised, the test should fail
|
|
assert False, "Expected IntegrityError for duplicate RSVP"
|
|
except Exception as e:
|
|
# Check the exception to confirm it matches SQLite's UNIQUE constraint error
|
|
error_message = str(e)
|
|
if "sqlite3.IntegrityError" in error_message:
|
|
assert "UNIQUE constraint failed: rsvps.event_id, rsvps.guest_id" in error_message
|
|
else:
|
|
# For other databases (e.g., PostgreSQL), the constraint name should appear
|
|
assert "uq_event_guest_rsvp" in error_message
|
|
|
|
|
|
|
|
def test_dietary_requirements(rsvp_fixture):
|
|
# Act
|
|
dietary = rsvp_fixture.dietary_requirements
|
|
|
|
# Assert
|
|
assert dietary == "Vegetarian"
|
|
|
|
# Update and re-check
|
|
rsvp_fixture.dietary_requirements = "No preference"
|
|
assert rsvp_fixture.dietary_requirements == "No preference"
|
|
|
|
def test_rsvp_repr(db_session):
|
|
# Arrange
|
|
rsvp = RSVP(
|
|
id=uuid.uuid4(),
|
|
event_id=uuid.uuid4(),
|
|
guest_id=uuid.uuid4(),
|
|
status=RSVPStatus.ATTENDING,
|
|
number_of_guests=3,
|
|
)
|
|
db_session.add(rsvp)
|
|
db_session.commit()
|
|
|
|
# Act
|
|
result = repr(rsvp)
|
|
|
|
# Assert
|
|
assert result == f"<RSVP guest_id={rsvp.guest_id} status=attending>"
|