JavaScript is used by about 98% of web users, so by testing without it enabled, we're only testing that the application works for a very reduced number of users. We proceeded this way in the past because CONSUL started using Rails 4.2 and truncating the database between JavaScript tests with database cleaner, which made these tests terribly slow. When we upgraded to Rails 5.1 and introduced system tests, we started using database transactions in JavaScript tests, making these tests much faster. So now we can use JavaScript tests everywhere without critically slowing down our test suite.
512 lines
19 KiB
Ruby
512 lines
19 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Emails" do
|
|
before do
|
|
reset_mailer
|
|
end
|
|
|
|
context "On Staging Environment" do
|
|
scenario "emails are delivered to configured recipient" do
|
|
interceptor = RecipientInterceptor.new("recipient@consul.dev", subject_prefix: "[staging]")
|
|
Mail.register_interceptor(interceptor)
|
|
|
|
sign_up
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("[staging] Confirmation instructions")
|
|
expect(email).to deliver_to("recipient@consul.dev")
|
|
expect(email).not_to deliver_to("manuela@consul.dev")
|
|
|
|
Mail.unregister_interceptor(interceptor)
|
|
end
|
|
end
|
|
|
|
scenario "Signup Email" do
|
|
sign_up
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Confirmation instructions")
|
|
expect(email).to deliver_to("manuela@consul.dev")
|
|
expect(email).to have_body_text(user_confirmation_path)
|
|
end
|
|
|
|
scenario "Reset password" do
|
|
reset_password
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Instructions for resetting your password")
|
|
expect(email).to deliver_to("manuela@consul.dev")
|
|
expect(email).to have_body_text(edit_user_password_path)
|
|
end
|
|
|
|
context "Proposal comments" do
|
|
let(:user) { create(:user, email_on_comment: true) }
|
|
let(:proposal) { create(:proposal, author: user) }
|
|
|
|
scenario "Send email on proposal comment" do
|
|
comment_on(proposal)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has commented on your citizen proposal")
|
|
expect(email).to deliver_to(proposal.author)
|
|
expect(email).to have_body_text(proposal_path(proposal))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own proposal comments" do
|
|
comment_on(proposal, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about proposal comment unless set in preferences" do
|
|
user.update!(email_on_comment: false)
|
|
comment_on(proposal)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
context "Debate comments" do
|
|
let(:user) { create(:user, email_on_comment: true) }
|
|
let(:debate) { create(:debate, author: user) }
|
|
|
|
scenario "Send email on debate comment" do
|
|
comment_on(debate)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has commented on your debate")
|
|
expect(email).to deliver_to(debate.author)
|
|
expect(email).to have_body_text(debate_path(debate))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own debate comments" do
|
|
comment_on(debate, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about debate comment unless set in preferences" do
|
|
user.update!(email_on_comment: false)
|
|
comment_on(debate)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
context "Budget investments comments" do
|
|
let(:user) { create(:user, email_on_comment: true) }
|
|
let(:investment) { create(:budget_investment, author: user, budget: create(:budget)) }
|
|
|
|
scenario "Send email on budget investment comment" do
|
|
comment_on(investment)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has commented on your investment")
|
|
expect(email).to deliver_to(investment.author)
|
|
expect(email).to have_body_text(budget_investment_path(investment, budget_id: investment.budget_id))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own budget investments comments" do
|
|
comment_on(investment, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about budget investment comment unless set in preferences" do
|
|
user.update!(email_on_comment: false)
|
|
comment_on(investment)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
context "Topic comments" do
|
|
let(:user) { create(:user, email_on_comment: true) }
|
|
let(:proposal) { create(:proposal) }
|
|
let(:topic) { create(:topic, author: user, community: proposal.community) }
|
|
|
|
scenario "Send email on topic comment" do
|
|
comment_on(topic)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has commented on your topic")
|
|
expect(email).to deliver_to(topic.author)
|
|
expect(email).to have_body_text(community_topic_path(topic, community_id: topic.community_id))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own topic comments" do
|
|
comment_on(topic, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about topic comment unless set in preferences" do
|
|
user.update!(email_on_comment: false)
|
|
comment_on(topic)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
context "Poll comments" do
|
|
let(:user) { create(:user, email_on_comment: true) }
|
|
let(:poll) { create(:poll, author: user) }
|
|
|
|
scenario "Send email on poll comment" do
|
|
comment_on(poll)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has commented on your poll")
|
|
expect(email).to deliver_to(poll.author)
|
|
expect(email).to have_body_text(poll_path(poll))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own poll comments" do
|
|
comment_on(poll, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about poll question comment unless set in preferences" do
|
|
user.update!(email_on_comment: false)
|
|
comment_on(poll)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
context "Comment replies" do
|
|
let(:user) { create(:user, email_on_comment_reply: true) }
|
|
|
|
scenario "Send email on comment reply" do
|
|
reply_to(user)
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has responded to your comment")
|
|
expect(email).to deliver_to(user)
|
|
expect(email).not_to have_body_text(debate_path(Comment.first.commentable))
|
|
expect(email).to have_body_text(comment_path(Comment.last))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
|
|
scenario "Do not send email about own replies to own comments" do
|
|
reply_to(user, user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
|
|
scenario "Do not send email about comment reply unless set in preferences" do
|
|
user.update!(email_on_comment_reply: false)
|
|
reply_to(user)
|
|
expect { open_last_email }.to raise_error("No email has been sent!")
|
|
end
|
|
end
|
|
|
|
scenario "Email depending on user's locale" do
|
|
visit root_path(locale: :es)
|
|
|
|
click_link "Registrarse"
|
|
fill_in_signup_form
|
|
click_button "Registrarse"
|
|
|
|
expect(page).to have_content "visita el enlace para activar tu cuenta."
|
|
|
|
email = open_last_email
|
|
expect(email).to deliver_to("manuela@consul.dev")
|
|
expect(email).to have_body_text(user_confirmation_path)
|
|
expect(email).to have_subject("Instrucciones de confirmación")
|
|
end
|
|
|
|
context "Direct Message" do
|
|
scenario "Receiver email" do
|
|
sender = create(:user, :level_two)
|
|
receiver = create(:user, :level_two)
|
|
|
|
direct_message = create_direct_message(sender, receiver)
|
|
|
|
email = unread_emails_for(receiver.email).first
|
|
|
|
expect(email).to have_subject("You have received a new private message")
|
|
expect(email).to have_body_text(direct_message.title)
|
|
expect(email).to have_body_text(direct_message.body)
|
|
expect(email).to have_body_text(direct_message.sender.name)
|
|
expect(email).to have_body_text(/#{user_path(direct_message.sender_id)}/)
|
|
end
|
|
|
|
scenario "Sender email" do
|
|
sender = create(:user, :level_two)
|
|
receiver = create(:user, :level_two)
|
|
|
|
direct_message = create_direct_message(sender, receiver)
|
|
|
|
email = unread_emails_for(sender.email).first
|
|
|
|
expect(email).to have_subject("You have sent a new private message")
|
|
expect(email).to have_body_text(direct_message.title)
|
|
expect(email).to have_body_text(direct_message.body)
|
|
expect(email).to have_body_text(direct_message.receiver.name)
|
|
end
|
|
|
|
pending "In the copy sent to the sender, display the receiver's name"
|
|
end
|
|
|
|
context "Proposal notification digest" do
|
|
scenario "notifications for proposals that I'm following" do
|
|
Setting["org_name"] = "CONSUL"
|
|
user = create(:user, email_digest: true)
|
|
|
|
proposal1 = create(:proposal, followers: [user])
|
|
proposal2 = create(:proposal, followers: [user])
|
|
proposal3 = create(:proposal)
|
|
|
|
reset_mailer
|
|
|
|
notification1 = create_proposal_notification(proposal1)
|
|
notification2 = create_proposal_notification(proposal2)
|
|
|
|
email_digest = EmailDigest.new(user)
|
|
email_digest.deliver(Time.current)
|
|
email_digest.mark_as_emailed
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Proposal notifications in CONSUL")
|
|
expect(email).to deliver_to(user.email)
|
|
|
|
expect(email).to have_body_text(proposal1.title)
|
|
expect(email).to have_body_text(notification1.notifiable.title)
|
|
expect(email).to have_body_text(notification1.notifiable.body)
|
|
expect(email).to have_body_text(proposal1.author.name)
|
|
|
|
expect(email).to have_body_text(/#{proposal_path(proposal1, anchor: "tab-notifications")}/)
|
|
expect(email).to have_body_text(/#{proposal_path(proposal1, anchor: "comments")}/)
|
|
expect(email).to have_body_text(/#{proposal_path(proposal1, anchor: "social-share")}/)
|
|
|
|
expect(email).to have_body_text(proposal2.title)
|
|
expect(email).to have_body_text(notification2.notifiable.title)
|
|
expect(email).to have_body_text(notification2.notifiable.body)
|
|
expect(email).to have_body_text(/#{proposal_path(proposal2, anchor: "tab-notifications")}/)
|
|
expect(email).to have_body_text(/#{proposal_path(proposal2, anchor: "comments")}/)
|
|
expect(email).to have_body_text(/#{proposal_path(proposal2, anchor: "social-share")}/)
|
|
expect(email).to have_body_text(proposal2.author.name)
|
|
|
|
expect(email).not_to have_body_text(proposal3.title)
|
|
expect(email).to have_body_text(/#{account_path}/)
|
|
expect(email).to have_body_text("Visit this proposal and unfollow it to stop receiving notifications.")
|
|
|
|
notification1.reload
|
|
notification2.reload
|
|
expect(notification1.emailed_at).to be
|
|
expect(notification2.emailed_at).to be
|
|
end
|
|
|
|
scenario "notifications moderated are not sent" do
|
|
user = create(:user, email_digest: true)
|
|
notification = create(:notification, :for_proposal_notification)
|
|
|
|
reset_mailer
|
|
|
|
notification.notifiable.moderate_system_email(create(:administrator).user)
|
|
|
|
email_digest = EmailDigest.new(user)
|
|
email_digest.deliver(Time.current)
|
|
email_digest.mark_as_emailed
|
|
|
|
expect { open_last_email }.to raise_error "No email has been sent!"
|
|
end
|
|
|
|
xscenario "Delete all Notifications included in the digest after email sent" do
|
|
end
|
|
end
|
|
|
|
context "User invites" do
|
|
scenario "Send an invitation" do
|
|
Setting["org_name"] = "CONSUL"
|
|
login_as_manager
|
|
visit new_management_user_invite_path
|
|
|
|
fill_in "emails", with: " john@example.com, ana@example.com,isable@example.com "
|
|
click_button "Send invitations"
|
|
|
|
expect(page).to have_content "3 invitations have been sent."
|
|
|
|
expect(unread_emails_for("john@example.com").count).to eq 1
|
|
expect(unread_emails_for("ana@example.com").count).to eq 1
|
|
expect(unread_emails_for("isable@example.com").count).to eq 1
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Invitation to CONSUL")
|
|
expect(email).to have_body_text(/#{new_user_registration_path}/)
|
|
end
|
|
end
|
|
|
|
context "Budgets" do
|
|
let(:author) { create(:user, :level_two) }
|
|
let(:budget) { create(:budget) }
|
|
let!(:heading) { create(:budget_heading, name: "More hospitals", budget: budget) }
|
|
|
|
scenario "Investment created" do
|
|
login_as(author)
|
|
visit new_budget_investment_path(budget_id: budget.id)
|
|
|
|
select heading.name, from: "budget_investment_heading_id"
|
|
fill_in "Title", with: "Build a hospital"
|
|
fill_in_ckeditor "Description", with: "We have lots of people that require medical attention"
|
|
check "budget_investment_terms_of_service"
|
|
|
|
click_button "Create Investment"
|
|
expect(page).to have_content "Investment created successfully"
|
|
|
|
email = open_last_email
|
|
investment = Budget::Investment.last
|
|
|
|
expect(email).to have_subject("Thank you for creating an investment!")
|
|
expect(email).to deliver_to(investment.author.email)
|
|
expect(email).to have_body_text(author.name)
|
|
expect(email).to have_body_text(investment.title)
|
|
expect(email).to have_body_text(investment.budget.name)
|
|
expect(email).to have_body_text(budget_path(budget))
|
|
end
|
|
|
|
scenario "Unfeasible investment" do
|
|
budget.update!(phase: "valuating")
|
|
valuator = create(:valuator)
|
|
investment = create(:budget_investment, author: author, budget: budget, valuators: [valuator])
|
|
|
|
login_as(valuator.user)
|
|
visit edit_valuation_budget_budget_investment_path(budget, investment)
|
|
|
|
within_fieldset("Feasibility") { choose "Unfeasible" }
|
|
fill_in "Feasibility explanation", with: "This is not legal as stated in Article 34.9"
|
|
accept_confirm { check "Valuation finished" }
|
|
click_button "Save changes"
|
|
|
|
expect(page).to have_content "Dossier updated"
|
|
investment.reload
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Your investment project '#{investment.code}' has been marked as unfeasible")
|
|
expect(email).to deliver_to(investment.author.email)
|
|
expect(email).to have_body_text(investment.unfeasibility_explanation)
|
|
end
|
|
|
|
scenario "Selected investment" do
|
|
author1 = create(:user)
|
|
author2 = create(:user)
|
|
author3 = create(:user)
|
|
|
|
investment1 = create(:budget_investment, :selected, author: author1, budget: budget)
|
|
investment2 = create(:budget_investment, :selected, author: author2, budget: budget)
|
|
investment3 = create(:budget_investment, :unselected, author: author3, budget: budget)
|
|
|
|
reset_mailer
|
|
budget.email_selected
|
|
|
|
expect(find_email(investment1.author.email)).to be
|
|
expect(find_email(investment2.author.email)).to be
|
|
expect(find_email(investment3.author.email)).not_to be
|
|
|
|
email = open_last_email
|
|
investment = investment2
|
|
expect(email).to have_subject("Your investment project '#{investment.code}' has been selected")
|
|
expect(email).to deliver_to(investment.author.email)
|
|
end
|
|
|
|
scenario "Unselected investment" do
|
|
author1 = create(:user)
|
|
author2 = create(:user)
|
|
author3 = create(:user)
|
|
|
|
investment1 = create(:budget_investment, :unselected, author: author1, budget: budget)
|
|
investment2 = create(:budget_investment, :unselected, author: author2, budget: budget)
|
|
investment3 = create(:budget_investment, :selected, author: author3, budget: budget)
|
|
|
|
reset_mailer
|
|
budget.email_unselected
|
|
|
|
expect(find_email(investment1.author.email)).to be
|
|
expect(find_email(investment2.author.email)).to be
|
|
expect(find_email(investment3.author.email)).not_to be
|
|
|
|
email = open_last_email
|
|
investment = investment2
|
|
expect(email).to have_subject("Your investment project '#{investment.code}' has not been selected")
|
|
expect(email).to deliver_to(investment.author.email)
|
|
end
|
|
end
|
|
|
|
context "Polls" do
|
|
scenario "Send email on poll comment reply" do
|
|
user1 = create(:user, email_on_comment_reply: true)
|
|
user2 = create(:user)
|
|
poll = create(:poll, author: create(:user))
|
|
comment = create(:comment, commentable: poll, author: user1)
|
|
|
|
login_as(user2)
|
|
visit poll_path(poll)
|
|
|
|
click_link "Reply"
|
|
|
|
within "#js-comment-form-comment_#{comment.id}" do
|
|
fill_in "Leave your comment", with: "It will be done next week."
|
|
click_button "Publish reply"
|
|
end
|
|
|
|
within "#comment_#{comment.id}" do
|
|
expect(page).to have_content "It will be done next week."
|
|
end
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("Someone has responded to your comment")
|
|
expect(email).to deliver_to(user1)
|
|
expect(email).not_to have_body_text(poll_path(poll))
|
|
expect(email).to have_body_text(comment_path(Comment.last))
|
|
expect(email).to have_body_text("To stop receiving these emails change your settings in")
|
|
expect(email).to have_body_text(account_path)
|
|
end
|
|
end
|
|
|
|
context "Newsletter", :admin do
|
|
scenario "Send newsletter email to selected users" do
|
|
user_with_newsletter_in_segment_1 = create(:user, :with_proposal, newsletter: true)
|
|
user_with_newsletter_in_segment_2 = create(:user, :with_proposal, newsletter: true)
|
|
user_with_newsletter_not_in_segment = create(:user, newsletter: true)
|
|
user_without_newsletter_in_segment = create(:user, :with_proposal, newsletter: false)
|
|
|
|
visit new_admin_newsletter_path
|
|
fill_in_newsletter_form(segment_recipient: "Proposal authors")
|
|
click_button "Create Newsletter"
|
|
|
|
expect(page).to have_content "Newsletter created successfully"
|
|
|
|
accept_confirm { click_link "Send" }
|
|
|
|
expect(page).to have_content "Newsletter sent successfully"
|
|
|
|
expect(unread_emails_for(user_with_newsletter_in_segment_1.email).count).to eq 1
|
|
expect(unread_emails_for(user_with_newsletter_in_segment_2.email).count).to eq 1
|
|
expect(unread_emails_for(user_with_newsletter_not_in_segment.email).count).to eq 0
|
|
expect(unread_emails_for(user_without_newsletter_in_segment.email).count).to eq 0
|
|
|
|
email = open_last_email
|
|
expect(email).to have_subject("This is a different subject")
|
|
expect(email).to deliver_from("no-reply@consul.dev")
|
|
expect(email.body.encoded).to include("This is a different body")
|
|
end
|
|
end
|
|
|
|
context "Users without email" do
|
|
scenario "should not receive emails" do
|
|
user = create(:user, :verified, email_on_comment: true)
|
|
proposal = create(:proposal, author: user)
|
|
|
|
user_commenting = create(:user)
|
|
comment = create(:comment, commentable: proposal, user: user_commenting)
|
|
user.update!(email: nil)
|
|
|
|
Mailer.comment(comment).deliver_now
|
|
|
|
expect { open_last_email }.to raise_error "No email has been sent!"
|
|
end
|
|
end
|
|
end
|