Extract method to get a user segment name

We're going to add geozones as user segments, so it's handy to have the
method in the UserSegments class.

We're also changing the `user_segment_emails` parameter name for
consistency and simplicity.
This commit is contained in:
Javi Martín
2021-11-10 20:35:46 +01:00
parent a0416d4d85
commit 78e543f6d3
7 changed files with 36 additions and 18 deletions

View File

@@ -4,7 +4,7 @@ class Admin::EmailsDownloadController < Admin::BaseController
def generate_csv def generate_csv
users_segment = params[:users_segment] users_segment = params[:users_segment]
filename = t("admin.segment_recipient.#{users_segment}") filename = UserSegments.segment_name(users_segment)
csv_file = users_segment_emails_csv(users_segment) csv_file = users_segment_emails_csv(users_segment)
send_data csv_file, filename: "#{filename}.csv" send_data csv_file, filename: "#{filename}.csv"

View File

@@ -1,15 +1,11 @@
module UserSegmentsHelper module UserSegmentsHelper
def user_segments_options def user_segments_options
UserSegments.segments.map do |user_segment_name| UserSegments.segments.map do |user_segment_name|
[t("admin.segment_recipient.#{user_segment_name}"), user_segment_name] [segment_name(user_segment_name), user_segment_name]
end end
end end
def segment_name(user_segment) def segment_name(user_segment)
if user_segment && UserSegments.respond_to?(user_segment) UserSegments.segment_name(user_segment) || I18n.t("admin.segment_recipient.invalid_recipients_segment")
I18n.t("admin.segment_recipient.#{user_segment}")
else
I18n.t("admin.segment_recipient.invalid_recipients_segment")
end
end end
end end

View File

@@ -81,6 +81,7 @@ search:
- app/ - app/
- db/pages/ - db/pages/
- db/dev_seeds/ - db/dev_seeds/
- lib/
## Root directories for relative keys resolution. ## Root directories for relative keys resolution.
# relative_roots: # relative_roots:

View File

@@ -11,6 +11,10 @@ class UserSegments
not_supported_on_current_budget].freeze not_supported_on_current_budget].freeze
end end
def self.segment_name(segment)
I18n.t("admin.segment_recipient.#{segment}") if segments.include?(segment.to_s)
end
def self.all_users def self.all_users
User.active.where.not(confirmed_at: nil) User.active.where.not(confirmed_at: nil)
end end
@@ -53,8 +57,8 @@ class UserSegments
) )
end end
def self.user_segment_emails(users_segment) def self.user_segment_emails(segment)
UserSegments.send(users_segment).newsletter.order(:created_at).pluck(:email).compact UserSegments.send(segment).newsletter.order(:created_at).pluck(:email).compact
end end
private private

View File

@@ -5,6 +5,22 @@ describe UserSegments do
let(:user2) { create(:user) } let(:user2) { create(:user) }
let(:user3) { create(:user) } let(:user3) { create(:user) }
describe ".segment_name" do
it "returns a readable name of the segment" do
expect(UserSegments.segment_name("all_users")).to eq "All users"
expect(UserSegments.segment_name("administrators")).to eq "Administrators"
expect(UserSegments.segment_name("proposal_authors")).to eq "Proposal authors"
end
it "accepts symbols as parameters" do
expect(UserSegments.segment_name(:all_users)).to eq "All users"
end
it "returns nil for invalid segments" do
expect(UserSegments.segment_name("invalid")).to be nil
end
end
describe ".all_users" do describe ".all_users" do
it "returns all active users enabled" do it "returns all active users enabled" do
active_user = create(:user) active_user = create(:user)

View File

@@ -215,15 +215,15 @@ describe "Admin Notifications", :admin do
end end
scenario "Select list of users to send notification" do scenario "Select list of users to send notification" do
UserSegments.segments.each do |user_segment| UserSegments.segments.each do |segment|
segment_recipient = I18n.t("admin.segment_recipient.#{user_segment}") segment_recipient = UserSegments.segment_name(segment)
visit new_admin_admin_notification_path visit new_admin_admin_notification_path
fill_in_admin_notification_form(segment_recipient: segment_recipient) fill_in_admin_notification_form(segment_recipient: segment_recipient)
click_button "Create notification" click_button "Create notification"
expect(page).to have_content(I18n.t("admin.segment_recipient.#{user_segment}")) expect(page).to have_content segment_recipient
end end
end end
end end

View File

@@ -16,7 +16,7 @@ describe "Admin newsletter emails", :admin do
expect(page).to have_link "Go back", href: admin_newsletters_path expect(page).to have_link "Go back", href: admin_newsletters_path
expect(page).to have_content "This is a subject" expect(page).to have_content "This is a subject"
expect(page).to have_content I18n.t("admin.segment_recipient.#{newsletter.segment_recipient}") expect(page).to have_content "All users"
expect(page).to have_content "no-reply@consul.dev" expect(page).to have_content "no-reply@consul.dev"
expect(page).to have_content "This is a body" expect(page).to have_content "This is a body"
end end
@@ -40,10 +40,9 @@ describe "Admin newsletter emails", :admin do
expect(page).to have_css(".newsletter", count: 3) expect(page).to have_css(".newsletter", count: 3)
newsletters.each do |newsletter| newsletters.each do |newsletter|
segment_recipient = I18n.t("admin.segment_recipient.#{newsletter.segment_recipient}")
within("#newsletter_#{newsletter.id}") do within("#newsletter_#{newsletter.id}") do
expect(page).to have_content newsletter.subject expect(page).to have_content newsletter.subject
expect(page).to have_content segment_recipient expect(page).to have_content UserSegments.segment_name(newsletter.segment_recipient)
end end
end end
end end
@@ -162,13 +161,15 @@ describe "Admin newsletter emails", :admin do
end end
scenario "Select list of users to send newsletter" do scenario "Select list of users to send newsletter" do
UserSegments.segments.each do |user_segment| UserSegments.segments.each do |segment|
segment_recipient = UserSegments.segment_name(segment)
visit new_admin_newsletter_path visit new_admin_newsletter_path
fill_in_newsletter_form(segment_recipient: I18n.t("admin.segment_recipient.#{user_segment}")) fill_in_newsletter_form(segment_recipient: segment_recipient)
click_button "Create Newsletter" click_button "Create Newsletter"
expect(page).to have_content(I18n.t("admin.segment_recipient.#{user_segment}")) expect(page).to have_content segment_recipient
end end
end end
end end