From c31042b03e93ec6d25ab71b699ede32cfbda4d48 Mon Sep 17 00:00:00 2001 From: Morgan Roderick Date: Fri, 7 Aug 2026 11:31:22 +0200 Subject: [PATCH 1/3] fix(workshops): handle existing nil-attending invitation in rsvp --- app/controllers/workshops_controller.rb | 7 +-- spec/controllers/workshops_controller_spec.rb | 50 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 spec/controllers/workshops_controller_spec.rb diff --git a/app/controllers/workshops_controller.rb b/app/controllers/workshops_controller.rb index 20753a58c..883670e94 100644 --- a/app/controllers/workshops_controller.rb +++ b/app/controllers/workshops_controller.rb @@ -44,9 +44,10 @@ def find_attending_invitation(workshop, user) end def find_or_create_invitation(workshop, user, role) - WorkshopInvitation.create_or_find_by(workshop: workshop, - member: user, - role: role) + invitation = WorkshopInvitation.create_or_find_by(workshop: workshop, + member: user, + role: role) + invitation.persisted? ? invitation : WorkshopInvitation.find_by(workshop: workshop, member: user, role: role) end def user_attending_or_waitlisted?(workshop, user) diff --git a/spec/controllers/workshops_controller_spec.rb b/spec/controllers/workshops_controller_spec.rb new file mode 100644 index 000000000..615d60304 --- /dev/null +++ b/spec/controllers/workshops_controller_spec.rb @@ -0,0 +1,50 @@ +RSpec.describe WorkshopsController, type: :controller do + let(:member) { Fabricate(:member) } + let(:workshop) { Fabricate(:workshop) } + + before { login(member) } + + describe 'POST #rsvp' do + context 'when the member already has an invitation for the workshop and role with attending nil' do + let!(:invitation) do + Fabricate(:workshop_invitation, workshop: workshop, member: member, role: 'Coach', attending: nil) + end + + it 'redirects to the existing invitation page' do + post :rsvp, params: { id: workshop.id, role: 'Coach' } + + expect(response).to redirect_to(invitation_path(invitation)) + end + + it 'does not create a new invitation' do + expect do + post :rsvp, params: { id: workshop.id, role: 'Coach' } + end.not_to change(WorkshopInvitation, :count) + end + end + + context 'when the member does not have an invitation for the workshop and role' do + it 'creates a new invitation and redirects' do + expect do + post :rsvp, params: { id: workshop.id, role: 'Coach' } + end.to change(WorkshopInvitation, :count).by(1) + + invitation = WorkshopInvitation.last + expect(response).to redirect_to(invitation_path(invitation)) + end + end + + context 'when the member is already attending' do + before do + Fabricate(:attending_workshop_invitation, workshop: workshop, member: member, role: 'Coach') + end + + it 'redirects back with already wish to attend message' do + post :rsvp, params: { id: workshop.id, role: 'Coach' } + + expect(response).to redirect_to(root_path) + expect(flash[:notice]).to eq(I18n.t('workshops.already_wish_to_attend')) + end + end + end +end From 06717749ce880de920da994d55a85006369209cc Mon Sep 17 00:00:00 2001 From: Morgan Roderick <20321+mroderick@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:43:20 +0200 Subject: [PATCH 2/3] Update spec/controllers/workshops_controller_spec.rb Co-authored-by: Olle Jonsson --- spec/controllers/workshops_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/controllers/workshops_controller_spec.rb b/spec/controllers/workshops_controller_spec.rb index 615d60304..efa675548 100644 --- a/spec/controllers/workshops_controller_spec.rb +++ b/spec/controllers/workshops_controller_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe WorkshopsController, type: :controller do +RSpec.describe WorkshopsController do let(:member) { Fabricate(:member) } let(:workshop) { Fabricate(:workshop) } From ba2be8cd9a1de42967beef1605c80eaca5838669 Mon Sep 17 00:00:00 2001 From: Morgan Roderick <20321+mroderick@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:43:42 +0200 Subject: [PATCH 3/3] Update app/controllers/workshops_controller.rb Co-authored-by: Olle Jonsson --- app/controllers/workshops_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/workshops_controller.rb b/app/controllers/workshops_controller.rb index 883670e94..90a83ab86 100644 --- a/app/controllers/workshops_controller.rb +++ b/app/controllers/workshops_controller.rb @@ -44,10 +44,10 @@ def find_attending_invitation(workshop, user) end def find_or_create_invitation(workshop, user, role) - invitation = WorkshopInvitation.create_or_find_by(workshop: workshop, + invitation = WorkshopInvitation.create_or_find_by(workshop:, member: user, - role: role) - invitation.persisted? ? invitation : WorkshopInvitation.find_by(workshop: workshop, member: user, role: role) + role:) + invitation.persisted? ? invitation : WorkshopInvitation.find_by(workshop:, member: user, role:) end def user_attending_or_waitlisted?(workshop, user)