Merge pull request #2516 from consul/fix_user_segment_emails

Remove empty emails from user segment usages
This commit is contained in:
Alberto Calderón Queimadelos
2018-03-05 14:08:03 +01:00
committed by GitHub
9 changed files with 50 additions and 27 deletions

View File

@@ -13,6 +13,6 @@ class Admin::EmailsDownloadController < Admin::BaseController
private
def users_segment_emails_csv(users_segment)
UserSegments.send(users_segment).newsletter.pluck(:email).to_csv
UserSegments.user_segment_emails(users_segment).join(',')
end
end

View File

@@ -48,8 +48,8 @@ class Admin::NewslettersController < Admin::BaseController
@newsletter = Newsletter.find(params[:id])
if @newsletter.valid?
@newsletter.list_of_recipients.each do |recipient|
Mailer.newsletter(@newsletter, recipient).deliver_later
@newsletter.list_of_recipient_emails.each do |recipient_email|
Mailer.newsletter(@newsletter, recipient_email).deliver_later
end
@newsletter.update(sent_at: Time.current)

View File

@@ -126,9 +126,9 @@ class Mailer < ApplicationMailer
end
end
def newsletter(newsletter, recipient)
def newsletter(newsletter, recipient_email)
@newsletter = newsletter
@email_to = recipient.email
@email_to = recipient_email
mail(to: @email_to, from: @newsletter.from, subject: @newsletter.subject)
end

View File

@@ -8,8 +8,8 @@ class Newsletter < ActiveRecord::Base
validates_format_of :from, :with => /@/
def list_of_recipients
UserSegments.send(segment_recipient).newsletter if valid_segment_recipient?
def list_of_recipient_emails
UserSegments.user_segment_emails(segment_recipient) if valid_segment_recipient?
end
def valid_segment_recipient?

View File

@@ -2,7 +2,7 @@
<h2><%= t("admin.newsletters.show.title") %></h2>
<% recipients_count = @newsletter.valid_segment_recipient? ? @newsletter.list_of_recipients.count : 0 %>
<% recipients_count = @newsletter.valid_segment_recipient? ? @newsletter.list_of_recipient_emails.count : 0 %>
<div class="small-12 column">
<div class="callout highlight">

View File

@@ -37,6 +37,10 @@ class UserSegments
author_ids(current_budget_investments.winners.pluck(:author_id).uniq)
end
def self.user_segment_emails(users_segment)
UserSegments.send(users_segment).newsletter.pluck(:email).compact
end
private
def self.current_budget_investments

View File

@@ -2,29 +2,48 @@ require 'rails_helper'
feature "Admin download user emails" do
let(:admin_user) { create(:user, newsletter: false, email: 'admin@consul.dev') }
background do
admin = create(:administrator)
login_as(admin.user)
create(:administrator, user: admin_user)
login_as(admin_user)
end
context "Index" do
scenario "returns the selected users segment csv file" do
user1 = create(:user)
user2 = create(:user)
context "Download only emails from segment users with newsletter flag & present email " do
before do
create(:user, email: 'user@consul.dev')
create(:administrator, user: create(:user, newsletter: true, email: 'admin_news1@consul.dev'))
create(:administrator, user: create(:user, newsletter: true, email: 'admin_news2@consul.dev'))
create(:administrator, user: create(:user, newsletter: false, email: 'no_news@consul.dev'))
admin_without_email = create(:user, newsletter: true, email: 'no_email@consul.dev')
create(:administrator, user: admin_without_email)
admin_without_email.update_attribute(:email, nil)
end
scenario "returns the selected users segment csv file" do
visit admin_emails_download_index_path
within('#admin_download_emails') do
select 'All users', from: 'users_segment'
select 'Administrators', from: 'users_segment'
click_button 'Download emails list'
end
header = page.response_headers['Content-Disposition']
expect(header).to match /^attachment/
expect(header).to match /filename="All users.csv"$/
expect(header).to match /filename="Administrators.csv"$/
expect(page).to have_content(user1.email)
expect(page).to have_content(user2.email)
file_contents = page.body.split(',')
expect(file_contents.count).to eq(2)
expect(file_contents).to include('admin_news1@consul.dev')
expect(file_contents).to include('admin_news2@consul.dev')
expect(file_contents).not_to include('admin@consul.dev')
expect(file_contents).not_to include('user@consul.dev')
expect(file_contents).not_to include('no_news@consul.dev')
expect(file_contents).not_to include('no_email@consul.dev')
end
end
end

View File

@@ -133,7 +133,7 @@ feature "Admin newsletter emails" do
click_link "Send"
total_users = newsletter.list_of_recipients.count
total_users = newsletter.list_of_recipient_emails.count
page.accept_confirm("Are you sure you want to send this newsletter to #{total_users} users?")
expect(page).to have_content "Newsletter sent successfully"

View File

@@ -47,20 +47,20 @@ describe Newsletter do
end
end
describe '#list_of_recipients' do
let(:erased_user) { create(:user, username: 'erased_user') }
describe '#list_of_recipient_emails' do
before do
create(:user, newsletter: true, username: 'newsletter_user')
create(:user, newsletter: false)
erased_user.erase
create(:user, newsletter: true, email: 'newsletter_user@consul.dev')
create(:user, newsletter: false, email: 'no_news_user@consul.dev')
create(:user, email: 'erased_user@consul.dev').erase
newsletter.update(segment_recipient: 'all_users')
end
it 'returns list of recipients excluding users with disabled newsletter' do
expect(newsletter.list_of_recipients.count).to eq(1)
expect(newsletter.list_of_recipients.first.username).to eq('newsletter_user')
expect(newsletter.list_of_recipients).not_to include(erased_user)
expect(newsletter.list_of_recipient_emails.count).to eq(1)
expect(newsletter.list_of_recipient_emails).to include('newsletter_user@consul.dev')
expect(newsletter.list_of_recipient_emails).not_to include('no_news_user@consul.dev')
expect(newsletter.list_of_recipient_emails).not_to include('erased_user@consul.dev')
end
end
end