As mentioned in commits likea586ba806,a7664ad81,006128da5,b41fbfa52andc480cdd91, 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.
388 lines
15 KiB
Ruby
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
|