diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index f757ac1..5e5a09c 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -4,7 +4,7 @@ import uuid from app.models.user import User from app.utils.test_utils import setup_test_db, teardown_test_db from app.models import GiftItem, GiftStatus, GiftPriority, RSVP, RSVPStatus, EventMedia, MediaType, MediaPurpose, \ - EventTheme + EventTheme, Guest, GuestStatus @pytest.fixture(scope="function") @@ -138,3 +138,35 @@ def event_theme_fixture(db_session): db_session.add(event_theme) db_session.commit() return event_theme + +import uuid +from datetime import datetime, timezone +from app.models.guest import Guest, GuestStatus + + +@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 \ No newline at end of file diff --git a/backend/tests/models/test_guest.py b/backend/tests/models/test_guest.py new file mode 100644 index 0000000..0003dab --- /dev/null +++ b/backend/tests/models/test_guest.py @@ -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"" + + +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 \ No newline at end of file