Skip to content

Commit

Permalink
Revise default interests for Mailchimp forms (#4275)
Browse files Browse the repository at this point in the history
  • Loading branch information
ldodds authored Feb 19, 2025
1 parent 9cd66b0 commit 08ddea6
Show file tree
Hide file tree
Showing 3 changed files with 225 additions and 10 deletions.
43 changes: 39 additions & 4 deletions app/models/mailchimp/contact.rb
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,47 @@ def self.free_school_meal_tags(school)
tags
end


# All the email types
# Using the names rather than the ids, as this allows us to test against the
# developer account
GETTING_THE_MOST = 'Getting the most out of Energy Sparks'.freeze
ENGAGING_PUPILS = 'Engaging pupils in energy saving and climate'.freeze
LEADERSHIP = 'Energy saving leadership'.freeze
TAILORED_ADVICE = 'Tailored advice and support'.freeze
TRAINING = 'Training opportunities'.freeze

LEADERSHIP_INTERESTS = [GETTING_THE_MOST, TRAINING, TAILORED_ADVICE, LEADERSHIP].freeze
TEACHING_INTERESTS = [GETTING_THE_MOST, TRAINING, TAILORED_ADVICE, ENGAGING_PUPILS].freeze

ALL_INTERESTS = [GETTING_THE_MOST, TRAINING, TAILORED_ADVICE, LEADERSHIP, ENGAGING_PUPILS].freeze

SCHOOL_USER_INTERESTS = {
'Business manager' => LEADERSHIP_INTERESTS,
'Building/site manager or caretaker' => LEADERSHIP_INTERESTS,
'Governor' => LEADERSHIP_INTERESTS,
'Teacher or teaching assistant' => TEACHING_INTERESTS,
'Headteacher or Deputy Head' => ALL_INTERESTS,
'Council or MAT staff' => LEADERSHIP_INTERESTS,
'Parent or volunteer' => TEACHING_INTERESTS,
'Public' => [GETTING_THE_MOST, TRAINING, TAILORED_ADVICE]
}.freeze

ORGANIC_SIGN_UP_INTERESTS = [GETTING_THE_MOST, ENGAGING_PUPILS, LEADERSHIP].freeze

# Take Array of interests returned by AudienceManager and turn into hash
# for use on forms, setting the default opt-in state.
#
# TODO: change defaults based on user role/staff role
def self.default_interests(interests, _user = nil)
interests.to_h { |i| [i.id, true] }
def self.default_interests(interests, user = nil)
interest_list = if user&.group_admin?
ALL_INTERESTS
elsif user&.staff_role && SCHOOL_USER_INTERESTS.key?(user.staff_role.title)
SCHOOL_USER_INTERESTS[user.staff_role.title]
else
ORGANIC_SIGN_UP_INTERESTS
end
interests.to_h do |interest|
[interest.id, interest_list.include?(interest.name)]
end
end

# Convert to hash for submitting to mailchimp api
Expand Down
184 changes: 184 additions & 0 deletions spec/models/mailchimp/contact_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -234,4 +234,188 @@ def expect_fsm_tag(fsm_percentage, expected_tags)
expect_fsm_tag(nil, [])
end
end

describe '.default_interests' do
include_context 'with a stubbed audience manager'

let(:interests) { Mailchimp::AudienceManager.new.interests('abc') }

shared_examples 'interests have been selected' do
subject(:defaults) { described_class.default_interests(interests, user) }

def expect_all_interests(name_to_id, list, val)
list.each do |i|
interest_id = name_to_id[i]
expect(defaults[interest_id]).to be(val)
end
end

it 'with only expected options as true' do
name_to_id = interests.to_h { |i| [i.name, i.id] }
expect_all_interests(name_to_id, selected, true)
expect_all_interests(name_to_id, name_to_id.keys - selected, false)
end
end

shared_examples 'it maps all the roles correctly' do
it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Business manager'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Building/site manager or caretaker'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Governor'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Teacher or teaching assistant'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::ENGAGING_PUPILS,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Headteacher or Deputy Head'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::ENGAGING_PUPILS,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Council or MAT staff'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Parent or volunteer'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::ENGAGING_PUPILS,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end

it_behaves_like 'interests have been selected' do
let(:user) { create(role, staff_role: create(:staff_role, title: 'Public'))}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end
end

context 'with no user' do
it_behaves_like 'interests have been selected' do
let(:user) { nil }
let(:selected) do
[described_class::GETTING_THE_MOST, described_class::ENGAGING_PUPILS, described_class::LEADERSHIP]
end
end
end

context 'with group admin' do
it_behaves_like 'interests have been selected' do
let(:user) { create(:group_admin)}
let(:selected) do
[
described_class::GETTING_THE_MOST,
described_class::ENGAGING_PUPILS,
described_class::LEADERSHIP,
described_class::TRAINING,
described_class::TAILORED_ADVICE
]
end
end
end

context 'with admin' do
it_behaves_like 'interests have been selected' do
let(:user) { create(:admin) }
let(:selected) do
[Mailchimp::Contact::GETTING_THE_MOST, Mailchimp::Contact::ENGAGING_PUPILS, Mailchimp::Contact::LEADERSHIP]
end
end
end

context 'with school users' do
context 'with staff' do
it_behaves_like 'it maps all the roles correctly' do
let(:role) { :staff }
end
end

context 'with school admin' do
it_behaves_like 'it maps all the roles correctly' do
let(:role) { :school_admin }
end
end

context 'with volunteer' do
it_behaves_like 'it maps all the roles correctly' do
let(:role) { :volunteer }
end
end

context 'with a user with no staff role' do
let(:user) { create(:volunteer, staff_role: nil) }

it_behaves_like 'interests have been selected' do
let(:selected) do
[Mailchimp::Contact::GETTING_THE_MOST, Mailchimp::Contact::ENGAGING_PUPILS, Mailchimp::Contact::LEADERSHIP]
end
end
end
end
end
end
8 changes: 2 additions & 6 deletions spec/system/users/email_management_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,9 @@
allow(audience_manager).to receive(:get_list_member).and_return(nil)
end

it 'defaults form to all checked' do
it 'some default options are pre-selected' do
refresh
expect(page).to have_checked_field('Getting the most out of Energy Sparks')
expect(page).to have_checked_field('Engaging pupils in energy saving and climate')
expect(page).to have_checked_field('Energy saving leadership')
expect(page).to have_checked_field('Training opportunities')
expect(page).to have_checked_field('Tailored advice and support')
expect(all('input[type=checkbox]').map(&:checked?)).not_to be_empty
end
end

Expand Down

0 comments on commit 08ddea6

Please sign in to comment.