Files
grecia/spec/system/emails_spec.rb
Javi Martín 148ac6dcb4 Move comment_on tests to mailer specs
These tests don't use the browser to send emails since commit e21588ec1.
However, note that this commit actually actually decreased our test
coverage somehow; since then, we're no longer testing whether we send an
email to the author after clicking the "Publish comment" button. We
might need to add a test for this in the `spec/system/comments_spec.rb`
file... but that's a story for another time.

Note we need to stub the `deliver_later` method; otherwise,
`open_last_email` would raise an exception since no email would have
been delivered.

We're moving them now because these tests use the `open_last_email`
method, and we're looking for places where using this method might
result in a flaky test when used inside a system test.
2025-03-26 16:27:08 +01:00

365 lines
14 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 "Comment replies" do
let(:user) { create(:user, email_on_comment_reply: true) }
let(:debate) { create(:debate) }
let!(:comment) { create(:comment, commentable: debate, user: user) }
scenario "Send email on comment reply" do
reply_to(comment)
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(debate))
expect(email).to have_body_text(comment_path(Comment.last))
expect(email).to have_body_text("To unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: user.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone replies to my comments"')
end
scenario "Do not send email about own replies to own comments" do
reply_to(comment, replier: 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(comment)
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))
expect(email).to have_body_text(edit_subscriptions_path(token: receiver.subscriptions_token))
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
end
context "Proposal notification digest" do
scenario "notifications for proposals that I'm following", :no_js 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(edit_subscriptions_path(token: user.subscriptions_token))
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
expect(email_digest.notifications).to be_empty
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) }
before { create(:budget_heading, name: "More hospitals", budget: budget) }
scenario "Investment created" do
login_as(author)
visit new_budget_investment_path(budget_id: budget.id)
fill_in_new_investment_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 "Budget Investment created successfully"
email = open_last_email
expect(email).to have_subject("Thank you for creating an investment!")
expect(email).to deliver_to(author.email)
expect(email).to have_body_text(author.name)
expect(email).to have_body_text("Build a hospital")
expect(email).to have_body_text(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"
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 "This is not legal as stated in Article 34.9"
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: user1.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone replies to my comments"')
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_button "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")
expect(email).to have_body_text("To unsubscribe from these emails, visit")
expect(email).to have_body_text(
edit_subscriptions_path(token: user_with_newsletter_in_segment_2.subscriptions_token)
)
expect(email).to have_body_text('and uncheck "Receive relevant information by email"')
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