require "test_helper" class EventsControllerTest < ActionDispatch::IntegrationTest def setup @user = User.create!( email: "test@example.com", password: "password123", password_confirmation: "password123" ) @event = Event.create!( name: "Test Event", slug: "test-event", description: "A valid description for the test event that is long enough", latitude: 48.8566, longitude: 2.3522, venue_name: "Test Venue", venue_address: "123 Test Street", user: @user, start_time: 1.week.from_now, end_time: 1.week.from_now + 3.hours, state: :published ) @unpublished_event = Event.create!( name: "Unpublished Event", slug: "unpublished-event", description: "A valid description for the unpublished event that is long enough", latitude: 48.8566, longitude: 2.3522, venue_name: "Test Venue", venue_address: "123 Test Street", user: @user, start_time: 2.weeks.from_now, end_time: 2.weeks.from_now + 3.hours, state: :draft ) @ticket_type = TicketType.create!( name: "General Admission", description: "General admission tickets with full access to the event", price_cents: 2500, quantity: 100, sale_start_at: Time.current, sale_end_at: @event.start_time - 1.hour, requires_id: false, event: @event ) end # === Index Action Tests === test "should get index" do get events_url assert_response :success end test "index should assign upcoming published events" do get events_url assert_response :success # Check that @events is assigned events = assigns(:events) assert_not_nil events # Should include published upcoming events assert_includes events.to_a, @event # Should not include unpublished events assert_not_includes events.to_a, @unpublished_event end test "index should handle pagination" do # Create additional events to test pagination 15.times do |i| Event.create!( name: "Event #{i}", slug: "event-#{i}", description: "A valid description for event #{i} that is long enough", latitude: 48.8566, longitude: 2.3522, venue_name: "Test Venue", venue_address: "123 Test Street", user: @user, start_time: (i + 1).days.from_now, end_time: (i + 1).days.from_now + 3.hours, state: :published ) end get events_url assert_response :success events = assigns(:events) assert_not_nil events # Should be paginated (12 per page as per controller) assert_equal 12, events.size end test "index should handle pagination with page parameter" do # Create additional events to test pagination 15.times do |i| Event.create!( name: "Event #{i}", slug: "event-#{i}", description: "A valid description for event #{i} that is long enough", latitude: 48.8566, longitude: 2.3522, venue_name: "Test Venue", venue_address: "123 Test Street", user: @user, start_time: (i + 1).days.from_now, end_time: (i + 1).days.from_now + 3.hours, state: :published ) end get events_url, params: { page: 2 } assert_response :success events = assigns(:events) assert_not_nil events # Should show remaining events on page 2 assert events.size <= 12 end test "index should include user association" do get events_url assert_response :success events = assigns(:events) assert_not_nil events # Just verify the association exists events.each do |event| assert_not_nil event.user end if events.present? end # === Show Action Tests === test "should show event" do get event_url(@event.slug, @event.id) assert_response :success end test "should assign event with ticket_types" do get event_url(@event.slug, @event.id) assert_response :success event = assigns(:event) assert_not_nil event assert_equal @event.id, event.id # Test that ticket_types association is preloaded assert_includes event.ticket_types.to_a, @ticket_type end test "should show unpublished event" do # The controller doesn't seem to restrict access to unpublished events # This might be intentional for preview purposes get event_url(@unpublished_event.slug, @unpublished_event.id) assert_response :success end test "should handle mismatched slug and id" do # Even with wrong slug, should still find event by ID get event_url("wrong-slug", @event.id) assert_response :success event = assigns(:event) assert_equal @event.id, event.id end # === Authentication Tests === test "index should not require authentication" do get events_url assert_response :success # Should not redirect to login (success means it didn't redirect) assert_not_equal 302, @response.status end test "show should not require authentication" do get event_url(@event.slug, @event.id) assert_response :success # Should not redirect to login (success means it didn't redirect) assert_not_equal 302, @response.status end # === Response Format Tests === test "index should render correct template" do get events_url assert_response :success assert_template :index end test "show should render correct template" do get event_url(@event.slug, @event.id) assert_response :success assert_template :show end # === Edge Case Tests === test "index should handle empty results" do # Hide all events by making them draft Event.update_all(state: Event.states[:draft]) get events_url assert_response :success events = assigns(:events) assert_not_nil events assert_empty events end test "index should handle invalid page parameter" do get events_url, params: { page: "invalid" } assert_response :success # Should default to page 1 events = assigns(:events) assert_not_nil events end test "index should handle negative page parameter" do get events_url, params: { page: -1 } assert_response :success # Should default to page 1 events = assigns(:events) assert_not_nil events end test "index should handle very large page parameter" do get events_url, params: { page: 999999 } assert_response :success # Should handle gracefully (probably empty results) events = assigns(:events) assert_not_nil events end end