Sometimes tests were hanging indefinitely. Debugging shows that in some
cases it's due to submitting a form before the AJAX request to get
proposals, debates or investments suggestions is finished, since having
an AJAX and a non-AJAX request at the same time when running the test
sometimes leads to unexpected results.
In our case, we were having many timeouts in Github Actions in the
branches where we use both ActiveStorage and Paperclip to store files
(based on pull request 4598). I can reproduce it in those branches
running the following test ("Should show new image after successful
creation with one uploaded file"), although only when my laptop isn't
plugged (!!):
```
rspec './spec/system/proposals_spec.rb[1:33:1:14]'
```
Since we didn't have a proper way to know the AJAX request had finished,
we're adding a `suggest-success` class to the element showing the
suggestions when that happens. Then in the tests we can look for that
class after filling in the title of a proposal, debate or investments.
Just for clarity's sake, we're also adding the `suggest-loading` class
when the suggestions are loading.
In order not to have expectations everywhere about the suggestions,
we're extracting methods to fill in those titles in the tests. Note we
aren't using these methods in the "edit" actions (suggestions are not
showing when editing) or in tests with the `no_js` tag (since
suggestions only work with JavaScript).
510 lines
19 KiB
Ruby
510 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) }
|
|
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 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(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)}/)
|
|
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"
|
|
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 "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 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
|