Files
eventspace/backend/tests/models/test_rsvp.py
Felipe Cardoso 1fd1144bc1
All checks were successful
Build and Push Docker Images / changes (push) Successful in 4s
Build and Push Docker Images / build-backend (push) Successful in 49s
Build and Push Docker Images / build-frontend (push) Has been skipped
Add and extend test coverage for models and their methods
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.
2025-02-28 15:57:32 +01:00

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>"