Files
nairobi/spec/system/emails_spec.rb
Javi Martín 1c2ec3f37e Don't access the database in comment replies tests
As mentioned in commits like a586ba806, a7664ad81, 006128da5, b41fbfa52
and c480cdd91, accessing the database after starting the browser with
the `visit` method sometimes results in database corruption and failing
tests on our CI due to the process running the test accessing the
database after the process running the browser has started.

In this case, we're avoiding the usage of `user.subscriptions_token` and
`Comment.last`. In the future, we should probably simplify these tests
by moving most of the checks to a mailer test.
2025-04-01 14:53:26 +02:00

388 lines
15 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, subscriptions_token: "commenter_token") }
let(:debate) { create(:debate, title: "Controversial topic") }
let!(:comment) { create(:comment, commentable: debate, user: user) }
scenario "Send email on comment reply" do
reply_to(comment, with: "It will be done next week")
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 "It will be done next week"
expect(email).to have_link "Controversial topic"
expect(email).to have_body_text "To unsubscribe from these emails, visit"
expect(email).to have_link "Notifications", href: edit_subscriptions_url(
host: Mailer.default_url_options[:host],
token: "commenter_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, username: "John")
receiver = create(:user, :level_two, username: "Paul", subscriptions_token: "receiver_token")
login_as(sender)
visit user_path(receiver)
click_link "Send private message"
expect(page).to have_content "Send private message to Paul"
fill_in "direct_message_title", with: "Hey!"
fill_in "direct_message_body", with: "How are you doing?"
click_button "Send message"
expect(page).to have_content "You message has been sent successfully."
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 "Hey!"
expect(email).to have_body_text "How are you doing?"
expect(email).to have_link "Reply to John", href: user_url(
sender,
host: Mailer.default_url_options[:host]
)
expect(email).to have_link "Notifications", href: edit_subscriptions_url(
host: Mailer.default_url_options[:host],
token: "receiver_token"
)
end
scenario "Sender email" do
sender = create(:user, :level_two)
receiver = create(:user, :level_two, username: "Keith")
login_as(sender)
visit user_path(receiver)
click_link "Send private message"
expect(page).to have_content "Send private message to Keith"
fill_in "direct_message_title", with: "Hey!"
fill_in "direct_message_body", with: "How are you doing?"
click_button "Send message"
expect(page).to have_content "You message has been sent successfully."
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 "Hey!"
expect(email).to have_body_text "How are you doing?"
expect(email).to have_body_text "You have sent a new private message to <strong>Keith</strong>"
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
user = create(:user, email_on_comment_reply: true, subscriptions_token: "user_token")
poll = create(:poll, author: create(:user), name: "Important questions")
comment = create(:comment, commentable: poll, author: user)
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 poll_path(poll)
expect(email).to have_body_text "Important questions"
expect(email).to have_body_text "To unsubscribe from these emails, visit"
expect(email).to have_link "Notifications", href: edit_subscriptions_url(
host: Mailer.default_url_options[:host],
token: "user_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