diff --git a/backend/tests/models/test_rsvp.py b/backend/tests/models/test_rsvp.py new file mode 100644 index 0000000..9b99dbe --- /dev/null +++ b/backend/tests/models/test_rsvp.py @@ -0,0 +1,106 @@ +# 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" \ No newline at end of file