diff --git a/app/controllers/better_together/events_controller.rb b/app/controllers/better_together/events_controller.rb
index 16a9cc834..f04eb27d9 100644
--- a/app/controllers/better_together/events_controller.rb
+++ b/app/controllers/better_together/events_controller.rb
@@ -11,9 +11,15 @@ class EventsController < FriendlyResourceController
before_action :build_event_hosts, only: :new
def index
+ @events = @events
+ .includes(:categories, cover_image_attachment: :blob)
+
@draft_events = @events.draft
+ .page(params[:draft_page]).per(params[:per])
@upcoming_events = @events.upcoming
+ .page(params[:upcoming_page]).per(params[:per])
@past_events = @events.past
+ .page(params[:past_page]).per(params[:per])
end
def show
diff --git a/app/views/better_together/events/index.html.erb b/app/views/better_together/events/index.html.erb
index d6932a1c2..f5b7500f4 100644
--- a/app/views/better_together/events/index.html.erb
+++ b/app/views/better_together/events/index.html.erb
@@ -15,6 +15,7 @@
<%= render(@draft_events) || render('none') %>
+ <%= paginate @draft_events %>
<% end %>
<% if @upcoming_events.size > 0 || @past_events.size > 0 %>
@@ -22,12 +23,14 @@
<%= render(@upcoming_events) || render('none') %>
+ <%= paginate @upcoming_events %>
<% if @past_events.size > 0 %>
Past
<%= render(@past_events) %>
+ <%= paginate @past_events %>
<% end %>
<% else %>
diff --git a/spec/factories/better_together/events.rb b/spec/factories/better_together/events.rb
index bb09c607f..c67bceadc 100644
--- a/spec/factories/better_together/events.rb
+++ b/spec/factories/better_together/events.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'faker'
+
FactoryBot.define do
factory 'better_together/event',
class: 'BetterTogether::Event',
diff --git a/spec/features/events/index_spec.rb b/spec/features/events/index_spec.rb
new file mode 100644
index 000000000..9c588d938
--- /dev/null
+++ b/spec/features/events/index_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'events index', type: :feature do
+ include BetterTogether::DeviseSessionHelpers
+
+ before do
+ configure_host_platform
+ login_as_platform_manager
+ end
+
+ let!(:draft_event) { create(:event, :draft, name: 'Draft Event') }
+ let!(:upcoming_event) { create(:event, name: 'Upcoming Event', starts_at: 1.day.from_now) }
+ let!(:past_event) { create(:event, name: 'Past Event', starts_at: 2.days.ago) }
+
+ scenario 'displays events grouped by status' do
+ visit events_path(locale: I18n.default_locale)
+
+ draft_section = find('h2', text: 'Draft').sibling('div')
+ within(draft_section) do
+ expect(page).to have_content(draft_event.name)
+ end
+
+ upcoming_section = find('h2', text: 'Upcoming').sibling('div')
+ within(upcoming_section) do
+ expect(page).to have_content(upcoming_event.name)
+ end
+
+ past_section = find('h2', text: 'Past').sibling('div')
+ within(past_section) do
+ expect(page).to have_content(past_event.name)
+ end
+ end
+end
diff --git a/spec/requests/better_together/events_spec.rb b/spec/requests/better_together/events_spec.rb
new file mode 100644
index 000000000..8d247b05f
--- /dev/null
+++ b/spec/requests/better_together/events_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Events', type: :request do
+ include BetterTogether::Engine.routes.url_helpers
+ include RequestSpecHelper
+
+ let(:locale) { I18n.default_locale }
+
+ describe 'GET /events' do
+ let!(:event) { create(:event) }
+
+ it 'returns http success' do
+ get events_path(locale: locale)
+ expect(response).to have_http_status(:success)
+ end
+ end
+
+ describe 'POST /events' do
+ let(:user) { create(:better_together_user, :confirmed, :platform_manager) }
+
+ before { login(user) }
+
+ it 'creates an event' do
+ expect do
+ post events_path(locale: locale),
+ params: { event: { name: 'New Event', starts_at: 1.day.from_now } }
+ end.to change(BetterTogether::Event, :count).by(1)
+ expect(response).to redirect_to(event_path(BetterTogether::Event.last, locale: locale))
+ end
+ end
+
+ describe 'PATCH /events/:id' do
+ let(:user) { create(:better_together_user, :confirmed, :platform_manager) }
+ let!(:event) { create(:event, name: 'Old Name', creator: user.person) }
+
+ before { login(user) }
+
+ it 'updates the event' do
+ patch event_path(event, locale: locale), params: { event: { name: 'Updated Name', starts_at: 1.day.from_now } }
+ expect(response).to redirect_to(edit_event_path(event, locale: locale))
+ expect(event.reload.name).to eq('Updated Name')
+ end
+ end
+
+ describe 'DELETE /events/:id' do
+ let(:user) { create(:better_together_user, :confirmed, :platform_manager) }
+ let!(:event) { create(:event, name: 'Delete Me', creator: user.person) }
+
+ before { login(user) }
+
+ it 'destroys the event' do
+ expect do
+ delete event_path(event, locale: locale)
+ end.to change(BetterTogether::Event, :count).by(-1)
+ expect(response).to redirect_to(events_path(locale: locale))
+ end
+ end
+end