Updated

spec/mailers / petition_mailer_spec.rb

F
755 lines of codes
0 methods
N/A complexity/method
43 churn
1624.6 complexity
811 duplications
require "rails_helper" RSpec.describe PetitionMailer, type: :mailer do let :creator do FactoryBot.create(:validated_signature, name: "Barry Butler", email: "bazbutler@gmail.com", creator: true) end let :petition do FactoryBot.create(:pending_petition, creator: creator, action: "Allow organic vegetable vans to use red diesel", background: "Add vans to permitted users of red diesel", additional_details: "To promote organic vegetables" ) end let(:pending_signature) { FactoryBot.create(:pending_signature, petition: petition) } let(:validated_signature) { FactoryBot.create(:validated_signature, petition: petition) } let(:subject_prefix) { "HM Government & Parliament Petitions" } describe "notifying creator that moderation is delayed" do let! :petition do FactoryBot.create(:sponsored_petition, creator: creator, action: "Allow organic vegetable vans to use red diesel", background: "Add vans to permitted users of red diesel", additional_details: "To promote organic vegetables" ) end let(:subject) { "Moderation of your petition is delayed" } let(:body) { "Sorry, but moderation of your petition is delayed for reasons." } let(:mail) { PetitionMailer.notify_creator_that_moderation_is_delayed(creator, subject, body) } it "is sent to the right address" do
  1. describe(notifying creator that moderation is delayed)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject("Moderation of your petition is delayed") end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the change" do expect(mail).to have_body_text("Sorry, but moderation of your petition is delayed for reasons.") end end describe "notifying creator of publication" do let(:mail) { PetitionMailer.notify_creator_that_petition_is_published(creator) } before do petition.publish end it "is sent to the right address" do
  1. describe(notifying creator of publication)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject('We published your petition “Allow organic vegetable vans to use red diesel”') end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the publication" do expect(mail).to have_body_text("We published the petition you created") end end describe "notifying sponsor of publication" do let(:mail) { PetitionMailer.notify_sponsor_that_petition_is_published(sponsor) } let(:sponsor) do FactoryBot.create(:validated_signature, name: "Laura Palmer", email: "laura@red-room.example.com", petition: petition ) end before do petition.publish end it "is sent to the right address" do
  1. describe(notifying sponsor of publication)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[laura@red-room.example.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject('We published the petition “Allow organic vegetable vans to use red diesel” that you supported') end it "is addressed to the sponsor" do expect(mail).to have_body_text("Dear Laura Palmer,") end it "informs the sponsor of the publication" do expect(mail).to have_body_text("We published the petition you supported") end end describe "notifying creator of rejection" do let(:mail) { PetitionMailer.notify_creator_that_petition_was_rejected(creator) } context "when rejecting for normal reasons" do
  1. Similar code found in 2 nodes Locations: 0 1
before do petition.reject(code: "duplicate") end it "is sent to the right address" do
  1. describe(notifying creator of rejection)::context(when rejecting for normal reasons)::it#is sent to the right address has a flog score of 30
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject('We rejected your petition “Allow organic vegetable vans to use red diesel”') end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the rejection" do expect(mail).to have_body_text("We rejected the petition you created") end end context "when there are further details" do
  1. Identical code found in 2 nodes Locations: 0 1
before do petition.reject(code: "irrelevant", details: "Please stop trolling us" ) end it "includes those details in the email" do expect(mail).to have_body_text("Please stop trolling us") end end context "when rejecting for reason that cause the petition to be hidden" do
  1. Identical code found in 2 nodes Locations: 0 1
before do petition.reject(code: "offensive") end it "doesn't include a link to the petition" do expect(mail).not_to have_body_text("Click this link to see the rejected petition") end end end describe "notifying sponsor of rejection" do let(:mail) { PetitionMailer.notify_sponsor_that_petition_was_rejected(sponsor) } let(:sponsor) do FactoryBot.create(:validated_signature, name: "Laura Palmer", email: "laura@red-room.example.com", petition: petition ) end context "when rejecting for normal reasons" do
  1. Similar code found in 2 nodes Locations: 0 1
before do petition.reject(code: "duplicate") end it "is sent to the right address" do
  1. describe(notifying sponsor of rejection)::context(when rejecting for normal reasons)::it#is sent to the right address has a flog score of 30
expect(mail.to).to eq(%w[laura@red-room.example.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject('We rejected the petition “Allow organic vegetable vans to use red diesel” that you supported') end it "is addressed to the sponsor" do expect(mail).to have_body_text("Dear Laura Palmer,") end it "informs the sponsor of the publication" do expect(mail).to have_body_text("We rejected the petition you supported") end end context "when there are further details" do
  1. Identical code found in 2 nodes Locations: 0 1
before do petition.reject(code: "irrelevant", details: "Please stop trolling us" ) end it "includes those details in the email" do expect(mail).to have_body_text("Please stop trolling us") end end context "when rejecting for reason that cause the petition to be hidden" do
  1. Identical code found in 2 nodes Locations: 0 1
before do petition.reject(code: "offensive") end it "doesn't include a link to the petition" do expect(mail).not_to have_body_text("Click this link to see the rejected petition") end end end describe "notifying creator of closing date change" do let(:mail) { PetitionMailer.notify_creator_of_closing_date_change(creator) } before do petition.publish allow(Parliament).to receive(:dissolution_at).and_return(2.weeks.from_now) end it "is sent to the right address" do
  1. describe(notifying creator of closing date change)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject("We’re closing your petition early") end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the change" do expect(mail).to have_body_text("the closing date for your petition has changed") end end describe "notifying creator of their sponsored petition being stopped" do
  1. Similar code found in 2 nodes Locations: 0 1
let! :petition do FactoryBot.create(:sponsored_petition, creator: creator, action: "Allow organic vegetable vans to use red diesel", background: "Add vans to permitted users of red diesel", additional_details: "To promote organic vegetables" ) end let(:mail) { PetitionMailer.notify_creator_of_sponsored_petition_being_stopped(creator) } it "is sent to the right address" do
  1. describe(notifying creator of their sponsored petition being stopped)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject("We’ve stopped your petition early") end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the change" do expect(mail).to have_body_text("We’re very sorry that we didn’t have time to check your petition before this happened") end end describe "notifying creator of their validated petition being stopped" do
  1. Similar code found in 2 nodes Locations: 0 1
let! :petition do FactoryBot.create(:validated_petition, creator: creator, action: "Allow organic vegetable vans to use red diesel", background: "Add vans to permitted users of red diesel", additional_details: "To promote organic vegetables" ) end let(:mail) { PetitionMailer.notify_creator_of_validated_petition_being_stopped(creator) } it "is sent to the right address" do
  1. describe(notifying creator of their validated petition being stopped)::it#is sent to the right address has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "has an appropriate subject heading" do expect(mail).to have_subject("We’ve stopped your petition early") end it "is addressed to the creator" do expect(mail).to have_body_text("Dear Barry Butler,") end it "informs the creator of the change" do expect(mail).to have_body_text("We’re very sorry that you didn’t have time to collect your five signatures before this happened") end end describe "gathering sponsors for petition" do subject(:mail) { described_class.gather_sponsors_for_petition(petition) } it "has the correct subject" do expect(mail).to have_subject(%{Action required: Petition “Allow organic vegetable vans to use red diesel”}) end it "has the addresses the creator by name" do expect(mail).to have_body_text("Dear Barry Butler,") end it "sends it only to the petition creator" do
  1. describe(gathering sponsors for petition)::it#sends it only to the petition creator has a flog score of 28
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "includes a link to pass on to potential sponsors to have them support the petition" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/petitions/#{petition.id}/sponsors/new\?token=#{petition.sponsor_token}]) end it "includes the petition action" do expect(mail).to have_body_text(%r[Allow organic vegetable vans to use red diesel]) end it "includes the petition background" do expect(mail).to have_body_text(%r[Add vans to permitted users of red diesel]) end it "includes the petition additional details" do expect(mail).to have_body_text(%r[To promote organic vegetables]) end it "includes information about moderation" do expect(mail).to have_body_text(%r[Once you’ve gained the required number of supporters]) end context "during Christmas" do
  1. Similar code found in 2 nodes Locations: 0 1
before do allow(Holiday).to receive(:christmas?).and_return(true) end it "includes information about delayed moderation" do expect(mail).to have_body_text(%r[but over the Christmas period it will take us a little longer]) end end context "during Easter" do
  1. Similar code found in 2 nodes Locations: 0 1
before do allow(Holiday).to receive(:easter?).and_return(true) end it "includes information about delayed moderation" do expect(mail).to have_body_text(%r[but over the Easter period it will take us a little longer]) end end context "when there's isn't a moderation delay" do
  1. Similar code found in 2 nodes Locations: 0 1
let(:scope) { double(Petition) } before do allow(Petition).to receive(:in_moderation).and_return(scope) allow(scope).to receive(:count).and_return(499) end it "doesn't include information about delayed moderation" do expect(mail).not_to have_body_text(%r[however we have a very large number to check]) end end context "when there's a moderation delay" do
  1. Similar code found in 2 nodes Locations: 0 1
let(:scope) { double(Petition) } before do allow(Petition).to receive(:in_moderation).and_return(scope) allow(scope).to receive(:count).and_return(500) end it "includes information about delayed moderation" do expect(mail).to have_body_text(%r[however we have a very large number to check]) end end context "when a BCC address is passed" do subject(:mail) { described_class.gather_sponsors_for_petition(petition, Site.feedback_email) } it "adds the BCC address to the email" do expect(mail).to bcc_to("petitionscommittee@parliament.uk") end end end describe "notifying signature of debate outcome" do context "when the signature is the creator" do let(:signature) { petition.creator } subject(:mail) { described_class.notify_creator_of_debate_outcome(petition, signature) } shared_examples_for "a debate outcome email" do it "addresses the signatory by name" do expect(mail).to have_body_text("Dear Barry Butler,") end it "sends it only to the creator" do
  1. describe(notifying signature of debate outcome)::context(when the signature is the creator)::shared_examples_for(a debate outcome email)::it#sends it only to the creator has a flog score of 31
expect(mail.to).to eq(%w[bazbutler@gmail.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "includes a link to the petition page" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/petitions/#{petition.id}]) end it "includes the petition action" do expect(mail).to have_body_text(%r[Allow organic vegetable vans to use red diesel]) end it "includes an unsubscribe link" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe\?token=#{signature.unsubscribe_token}]) end it "has a List-Unsubscribe header" do expect(mail).to have_header("List-Unsubscribe", "<https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe?token=#{signature.unsubscribe_token}>") end end shared_examples_for "a positive debate outcome email" do it "has the correct subject" do expect(mail).to have_subject("Parliament debated “Allow organic vegetable vans to use red diesel”") end it "has the positive message in the body" do expect(mail).to have_body_text("Parliament debated your petition") end end shared_examples_for "a negative debate outcome email" do it "has the correct subject" do expect(mail).to have_subject('Parliament didn’t debate “Allow organic vegetable vans to use red diesel”') end it "has the negative message in the body" do expect(mail).to have_body_text("The Petitions Committee decided not to debate your petition") end end context "when the debate outcome is positive" do
  1. Identical code found in 2 nodes Locations: 0 1
context "when the debate outcome is not filled out" do before do FactoryBot.create(:debate_outcome, petition: petition) end it_behaves_like "a debate outcome email" it_behaves_like "a positive debate outcome email" end context "when the debate outcome is filled out" do before do FactoryBot.create(:debate_outcome, debated_on: "2015-09-24", overview: "Discussion of the 2015 Christmas Adjournment", transcript_url: "http://www.publications.parliament.uk/pa/cm201509/cmhansrd/cm20150924/debtext/20150924-0003.htm#2015092449#000001", video_url: "http://parliamentlive.tv/event/index/20150924000001", debate_pack_url: "http://researchbriefings.parliament.uk/ResearchBriefing/Summary/CDP-2015-0001", petition: petition ) end it_behaves_like "a debate outcome email" it_behaves_like "a positive debate outcome email" it "includes the debate outcome overview" do expect(mail).to have_body_text(%r[Discussion of the 2015 Christmas Adjournment]) end it "includes a link to the transcript of the debate" do expect(mail).to have_body_text(%r[http://www.publications.parliament.uk/pa/cm201509/cmhansrd/cm20150924/debtext/20150924-0003.htm#2015092449#000001]) end it "includes a link to the video of the debate" do expect(mail).to have_body_text(%r[http://parliamentlive.tv/event/index/20150924000001]) end end end context "when the debate outcome is negative" do
  1. Identical code found in 2 nodes Locations: 0 1
context "when the debate outcome is not filled out" do before do FactoryBot.create(:debate_outcome, debated: false, petition: petition) end it_behaves_like "a debate outcome email" it_behaves_like "a negative debate outcome email" end context "when the debate outcome is filled out" do before do FactoryBot.create(:debate_outcome, debated: false, overview: "Discussion of the 2015 Christmas Adjournment", petition: petition ) end it_behaves_like "a debate outcome email" it_behaves_like "a negative debate outcome email" it "includes the debate outcome overview" do expect(mail).to have_body_text(%r[Discussion of the 2015 Christmas Adjournment]) end end end end context "when the signature is not the creator" do let(:signature) { FactoryBot.create(:validated_signature, petition: petition, name: "Laura Palmer", email: "laura@red-room.example.com") } subject(:mail) { described_class.notify_signer_of_debate_outcome(petition, signature) } shared_examples_for "a debate outcome email" do it "addresses the signatory by name" do expect(mail).to have_body_text("Dear Laura Palmer,") end it "sends it only to the signatory" do
  1. describe(notifying signature of debate outcome)::context(when the signature is not the creator)::shared_examples_for(a debate outcome email)::it#sends it only to the signatory has a flog score of 31
expect(mail.to).to eq(%w[laura@red-room.example.com]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "includes a link to the petition page" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/petitions/#{petition.id}]) end it "includes the petition action" do expect(mail).to have_body_text(%r[Allow organic vegetable vans to use red diesel]) end it "includes an unsubscribe link" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe\?token=#{signature.unsubscribe_token}]) end it "has a List-Unsubscribe header" do expect(mail).to have_header("List-Unsubscribe", "<https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe?token=#{signature.unsubscribe_token}>") end end shared_examples_for "a positive debate outcome email" do it "has the correct subject" do expect(mail).to have_subject("Parliament debated “Allow organic vegetable vans to use red diesel”") end it "has the positive message in the body" do expect(mail).to have_body_text("Parliament debated the petition you signed") end end shared_examples_for "a negative debate outcome email" do it "has the correct subject" do expect(mail).to have_subject("Parliament didn’t debate “Allow organic vegetable vans to use red diesel”") end it "has the negative message in the body" do expect(mail).to have_body_text("The Petitions Committee decided not to debate the petition you signed") end end context "when the debate outcome is positive" do
  1. Identical code found in 2 nodes Locations: 0 1
context "when the debate outcome is not filled out" do before do FactoryBot.create(:debate_outcome, petition: petition) end it_behaves_like "a debate outcome email" it_behaves_like "a positive debate outcome email" end context "when the debate outcome is filled out" do before do FactoryBot.create(:debate_outcome, debated_on: "2015-09-24", overview: "Discussion of the 2015 Christmas Adjournment", transcript_url: "http://www.publications.parliament.uk/pa/cm201509/cmhansrd/cm20150924/debtext/20150924-0003.htm#2015092449#000001", video_url: "http://parliamentlive.tv/event/index/20150924000001", debate_pack_url: "http://researchbriefings.parliament.uk/ResearchBriefing/Summary/CDP-2015-0001", petition: petition ) end it_behaves_like "a debate outcome email" it_behaves_like "a positive debate outcome email" it "includes the debate outcome overview" do expect(mail).to have_body_text(%r[Discussion of the 2015 Christmas Adjournment]) end it "includes a link to the transcript of the debate" do expect(mail).to have_body_text(%r[http://www.publications.parliament.uk/pa/cm201509/cmhansrd/cm20150924/debtext/20150924-0003.htm#2015092449#000001]) end it "includes a link to the video of the debate" do expect(mail).to have_body_text(%r[http://parliamentlive.tv/event/index/20150924000001]) end end end context "when the debate outcome is negative" do
  1. Identical code found in 2 nodes Locations: 0 1
context "when the debate outcome is not filled out" do before do FactoryBot.create(:debate_outcome, debated: false, petition: petition) end it_behaves_like "a debate outcome email" it_behaves_like "a negative debate outcome email" end context "when the debate outcome is filled out" do before do FactoryBot.create(:debate_outcome, debated: false, overview: "Discussion of the 2015 Christmas Adjournment", petition: petition ) end it_behaves_like "a debate outcome email" it_behaves_like "a negative debate outcome email" it "includes the debate outcome overview" do expect(mail).to have_body_text(%r[Discussion of the 2015 Christmas Adjournment]) end end end end end describe "notifying signature of debate scheduled" do let(:petition) { FactoryBot.create(:open_petition, :scheduled_for_debate, creator_attributes: { name: "Bob Jones", email: "bob@jones.com" }, action: "Allow organic vegetable vans to use red diesel") }
  1. Identical code found in 2 nodes Locations: 0 1
shared_examples_for "a debate scheduled email" do it "addresses the signatory by name" do expect(mail).to have_body_text("Dear #{signature.name},") end it "sends it only to the signatory" do
  1. describe(notifying signature of debate scheduled)::shared_examples_for(a debate scheduled email)::it#sends it only to the signatory has a flog score of 34
expect(mail.to).to eq([signature.email]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "includes a link to the petition page" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/petitions/#{petition.id}]) end it "includes an unsubscribe link" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe\?token=#{signature.unsubscribe_token}]) end it "has a List-Unsubscribe header" do expect(mail).to have_header("List-Unsubscribe", "<https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe?token=#{signature.unsubscribe_token}>") end end context "when the signature is the creator" do let(:signature) { petition.creator } subject(:mail) { described_class.notify_creator_of_debate_scheduled(petition, signature) } it_behaves_like "a debate scheduled email" it "has the correct subject" do expect(mail).to have_subject("Parliament will debate “Allow organic vegetable vans to use red diesel”") end it "identifies them as the creator" do expect(mail).to have_body_text(%[Parliament is going to debate your petition]) end end context "when the signature is not the creator" do let(:signature) { FactoryBot.create(:validated_signature, petition: petition, name: "Laura Palmer", email: "laura@red-room.example.com") } subject(:mail) { described_class.notify_signer_of_debate_scheduled(petition, signature) } it_behaves_like "a debate scheduled email" it "has the correct subject" do expect(mail).to have_subject("Parliament will debate “Allow organic vegetable vans to use red diesel”") end it "identifies them as a ordinary signature" do expect(mail).to have_body_text(%[Parliament is going to debate the petition you signed]) end end end describe "emailing a signature" do let(:petition) { FactoryBot.create(:open_petition, :scheduled_for_debate, creator_attributes: { name: "Bob Jones", email: "bob@jones.com" }, action: "Allow organic vegetable vans to use red diesel") }
  1. Identical code found in 2 nodes Locations: 0 1
let(:email) { FactoryBot.create(:petition_email, petition: petition, subject: "This is a message from the committee", body: "Message body from the petition committee") } shared_examples_for "a petition email" do
  1. Similar code found in 2 nodes Locations: 0 1
it "has the correct subject" do expect(mail).to have_subject("This is a message from the committee") end it "addresses the signatory by name" do expect(mail).to have_body_text("Dear #{signature.name},") end it "sends it only to the signatory" do
  1. describe(emailing a signature)::shared_examples_for(a petition email)::it#sends it only to the signatory has a flog score of 34
expect(mail.to).to eq([signature.email]) expect(mail.cc).to be_blank expect(mail.bcc).to be_blank end it "includes a link to the petition page" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/petitions/#{petition.id}]) end it "includes an unsubscribe link" do expect(mail).to have_body_text(%r[https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe\?token=#{signature.unsubscribe_token}]) end it "has a List-Unsubscribe header" do expect(mail).to have_header("List-Unsubscribe", "<https://petition.parliament.uk/signatures/#{signature.id}/unsubscribe?token=#{signature.unsubscribe_token}>") end it "includes the message body" do expect(mail).to have_body_text(%r[Message body from the petition committee]) end end context "when the signature is the creator" do let(:signature) { petition.creator } subject(:mail) { described_class.email_creator(petition, signature, email) } it_behaves_like "a petition email" it "identifies them as the creator" do expect(mail).to have_body_text(%[You recently created the petition]) end end context "when the signature is not the creator" do let(:signature) { FactoryBot.create(:validated_signature, petition: petition, name: "Laura Palmer", email: "laura@red-room.example.com") } subject(:mail) { described_class.email_signer(petition, signature, email) } it_behaves_like "a petition email" it "identifies them as a ordinary signature" do expect(mail).to have_body_text(%[You recently signed the petition]) end end end end