diff --git a/app/controllers/member/details_controller.rb b/app/controllers/member/details_controller.rb index eff9fba53..14cc0c711 100644 --- a/app/controllers/member/details_controller.rb +++ b/app/controllers/member/details_controller.rb @@ -21,7 +21,7 @@ def update return render :edit unless @member.update(attrs) - attrs[:newsletter] ? subscribe_to_newsletter(@member) : unsubscribe_from_newsletter(@member) + @member.newsletter ? subscribe_to_newsletter(@member) : unsubscribe_from_newsletter(@member) redirect_to step2_member_path end diff --git a/app/models/member.rb b/app/models/member.rb index f68b6427c..b2a96dfa7 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -63,7 +63,9 @@ class Member < ApplicationRecord acts_as_taggable_on :skills - attr_accessor :attendance, :newsletter + attr_accessor :attendance + + attribute :newsletter, :boolean def organiser? organised_chapters.present? diff --git a/spec/controllers/member/details_controller_spec.rb b/spec/controllers/member/details_controller_spec.rb index bb06347f6..d0db8a953 100644 --- a/spec/controllers/member/details_controller_spec.rb +++ b/spec/controllers/member/details_controller_spec.rb @@ -73,6 +73,54 @@ expect(member.how_you_found_us_other_reason).to eq('From a colleague') expect(response).to redirect_to(step2_member_path) end + + it 'subscribes to the newsletter when checked' do + patch :update, params: { + id: member.id, + member: { + how_you_found_us: 'social_media', + newsletter: 'true' + } + } + + expect(mailing_list).to have_received(:subscribe) + expect(mailing_list).not_to have_received(:unsubscribe) + end + + it 'unsubscribes from the newsletter when unchecked' do + patch :update, params: { + id: member.id, + member: { + how_you_found_us: 'social_media', + newsletter: 'false' + } + } + + expect(mailing_list).to have_received(:unsubscribe) + expect(mailing_list).not_to have_received(:subscribe) + end + end + + context 'with a validation failure' do + it 'keeps the newsletter checkbox checked when it was checked' do + patch :update, params: { + id: member.id, + member: { newsletter: 'true' } + } + + expect(response.body).to include('You must select one option') + expect(response.body).to have_css('input#member_newsletter[checked]') + end + + it 'keeps the newsletter checkbox unchecked when it was unchecked' do + patch :update, params: { + id: member.id, + member: { newsletter: 'false' } + } + + expect(response.body).to include('You must select one option') + expect(response.body).to have_no_css('input#member_newsletter[checked]') + end end context 'when update fails (invalid data)' do