# tests/models/test_event.py import uuid from datetime import datetime, time, timezone from app.models.event import Event def test_create_event(db_session): # Arrange new_event = Event( id=uuid.uuid4(), title="Emma's First Birthday Party", slug="emma-birthday-party", description="An animal-themed birthday party to celebrate Emma's 1st birthday!", location_name="Sunshine Park", location_address="123 Sunny Street, Springfield", location_url="https://maps.example.com/sunshine-park", event_date=datetime(2024, 5, 20, 14, 0, tzinfo=timezone.utc), timezone="UTC", created_by=uuid.uuid4(), is_public=False, rsvp_deadline=datetime(2024, 5, 15, 23, 59, tzinfo=timezone.utc), rsvp_enabled=True, gift_registry_enabled=True, updates_enabled=True, max_guests_per_invitation=5, contact_email="host@example.com", contact_phone="555-123-4567", ) db_session.add(new_event) # Act db_session.commit() created_event = db_session.query(Event).filter_by(slug="emma-birthday-party").first() # Assert assert created_event is not None assert created_event.title == "Emma's First Birthday Party" assert created_event.description.startswith("An animal-themed birthday party") assert created_event.location_name == "Sunshine Park" assert created_event.event_date == datetime(2024, 5, 20, 14, 0, tzinfo=timezone.utc) assert created_event.is_public is False assert created_event.rsvp_enabled is True def test_update_event(db_session): # Arrange event = Event( id=uuid.uuid4(), title="Original Title", slug="original-slug", timezone="UTC", event_date=datetime(2024, 6, 15, 12, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), is_public=True ) db_session.add(event) db_session.commit() # Act event.title = "Updated Event Title" event.is_public = False db_session.commit() updated_event = db_session.query(Event).filter_by(slug="original-slug").first() # Assert assert updated_event is not None assert updated_event.title == "Updated Event Title" assert updated_event.is_public is False def test_delete_event(db_session): # Arrange event = Event( id=uuid.uuid4(), title="Event to Delete", slug="event-to-delete", timezone="UTC", event_date=datetime(2024, 7, 10, 18, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), ) db_session.add(event) db_session.commit() # Act db_session.delete(event) db_session.commit() deleted_event = db_session.query(Event).filter_by(slug="event-to-delete").first() # Assert assert deleted_event is None def test_event_unique_slug_constraint(db_session): # Arrange slug = "unique-event-slug" event1 = Event( id=uuid.uuid4(), title="First Event", slug=slug, timezone="UTC", event_date=datetime(2024, 8, 1, 10, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), ) event2 = Event( id=uuid.uuid4(), title="Second Event", slug=slug, timezone="UTC", event_date=datetime(2024, 8, 15, 16, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), ) db_session.add(event1) db_session.commit() # Act & Assert db_session.add(event2) try: db_session.commit() assert False, "Expected an IntegrityError due to unique constraint on slug." except Exception: db_session.rollback() def test_event_required_fields(db_session): # Arrange invalid_event = Event( id=uuid.uuid4(), created_by=uuid.uuid4(), # Only trying to insert the minimal fields. ) db_session.add(invalid_event) # Act & Assert try: db_session.commit() assert False, "Expected an error due to missing required fields." except Exception: db_session.rollback() def test_event_defaults(db_session): # Arrange event = Event( id=uuid.uuid4(), title="Default Field Test", slug="default-field-test", timezone="UTC", event_date=datetime(2024, 9, 10, 14, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), ) db_session.add(event) # Act db_session.commit() created_event = db_session.query(Event).filter_by(slug="default-field-test").first() # Assert assert created_event is not None assert created_event.is_active is True assert created_event.rsvp_enabled is True assert created_event.gift_registry_enabled is True assert created_event.updates_enabled is True def test_event_relationship_with_user(db_session, mock_user): """Test the relationship between Event and its creator (User).""" # Arrange event = Event( id=uuid.uuid4(), title="User Relationship Event", slug="user-relationship-event", timezone="UTC", event_date=datetime(2024, 12, 25, 12, 0, tzinfo=timezone.utc), created_by=mock_user.id, # Link with the mock user ) db_session.add(event) db_session.commit() # Act created_event = db_session.query(Event).filter_by(slug="user-relationship-event").first() # Assert assert created_event.creator == mock_user def test_event_string_representation(): # Arrange event = Event( title="Sample Event", event_date=datetime(2024, 8, 5, 9, 30, tzinfo=timezone.utc), ) # Act representation = repr(event) # Assert assert representation == "" def test_event_with_custom_fields_json(db_session): # Arrange event = Event( id=uuid.uuid4(), title="With JSON Fields", slug="json-fields", timezone="UTC", event_date=datetime(2024, 11, 1, 10, 0, tzinfo=timezone.utc), created_by=uuid.uuid4(), custom_theme_settings={"color": "blue", "font": "Roboto"}, additional_info={"attendees": 100, "budget": "1000 USD"}, ) db_session.add(event) # Act db_session.commit() created_event = db_session.query(Event).filter_by(slug="json-fields").first() # Assert assert created_event.custom_theme_settings == {"color": "blue", "font": "Roboto"} assert created_event.additional_info == {"attendees": 100, "budget": "1000 USD"}