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.
This commit is contained in:
Javi Martín
2025-03-14 00:01:05 +01:00
parent fde5be293d
commit 148ac6dcb4
3 changed files with 157 additions and 148 deletions

View File

@@ -2,6 +2,10 @@ require "rails_helper"
describe Mailer do
describe "#comment" do
before do
allow_any_instance_of(ActionMailer::MessageDelivery).to receive(:deliver_later), &:deliver_now
end
it "sends emails in the user's locale" do
user = create(:user, locale: "es")
proposal = create(:proposal, author: user)
@@ -28,6 +32,159 @@ describe Mailer do
expect(email.subject).to include("commented on your proposal")
end
context "Proposal comments" do
let(:user) { create(:user, email_on_comment: true) }
let(:proposal) { create(:proposal, author: user) }
it "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 unsubscribe from these emails, visit"
expect(email).to have_body_text edit_subscriptions_path(token: proposal.author.subscriptions_token)
expect(email).to have_body_text 'and uncheck "Notify me by email when someone ' \
'comments on my contents"'
end
it "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
it "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 unsubscribe from these emails, visit"
expect(email).to have_body_text edit_subscriptions_path(token: debate.author.subscriptions_token)
expect(email).to have_body_text 'and uncheck "Notify me by email when someone ' \
'comments on my contents"'
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 unsubscribe from these emails, visit"
expect(email).to have_body_text edit_subscriptions_path(token: investment.author.subscriptions_token)
expect(email).to have_body_text 'and uncheck "Notify me by email when someone ' \
'comments on my contents"'
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 unsubscribe from these emails, visit"
expect(email).to have_body_text edit_subscriptions_path(token: topic.author.subscriptions_token)
expect(email).to have_body_text 'and uncheck "Notify me by email when someone ' \
'comments on my contents"'
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 unsubscribe from these emails, visit"
expect(email).to have_body_text edit_subscriptions_path(token: poll.author.subscriptions_token)
expect(email).to have_body_text 'and uncheck "Notify me by email when someone ' \
'comments on my contents"'
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
def comment_on(commentable, user = nil)
user ||= create(:user)
comment = create(:comment, commentable: commentable, user: user)
CommentNotifier.new(comment: comment).process
end
end
describe "#user_invite" do

View File

@@ -1,11 +1,4 @@
module Comments
def comment_on(commentable, user = nil)
user ||= create(:user)
comment = create(:comment, commentable: commentable, user: user)
CommentNotifier.new(comment: comment).process
end
def reply_to(comment, replier: create(:user))
login_as(replier)

View File

@@ -39,147 +39,6 @@ describe "Emails" do
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: proposal.author.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone comments on my contents"')
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: debate.author.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone comments on my contents"')
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: investment.author.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone comments on my contents"')
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: topic.author.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone comments on my contents"')
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 unsubscribe from these emails, visit")
expect(email).to have_body_text(edit_subscriptions_path(token: poll.author.subscriptions_token))
expect(email).to have_body_text('and uncheck "Notify me by email when someone comments on my contents"')
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) }