otwarchive-symphonyarchive/spec/mailers/user_mailer_spec.rb
2026-03-11 22:22:11 +00:00

1354 lines
45 KiB
Ruby

require "spec_helper"
describe UserMailer do
describe "#change_email" do
let(:login) { "changer" }
let(:new_email) { "new@example.com" }
let(:user) { create(:user, login: login) }
subject(:email) { UserMailer.change_email(user.id, "old@example.com", new_email) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Email change request"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content(">#{login}</b>,")
expect(email).to have_html_part_content("If you made this request, check your email at <a")
expect(email).to have_html_part_content("#{new_email}</a> within #{ArchiveConfig.DAYS_UNTIL_RESET_PASSWORD_LINK_EXPIRES} days to confirm your email change")
expect(email).to have_html_part_content("don't understand why you received this email, please <a")
expect(email).to have_html_part_content(">contact Policy & Abuse</a>.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{login},")
expect(email).to have_text_part_content("If you made this request, check your email at #{new_email} within #{ArchiveConfig.DAYS_UNTIL_RESET_PASSWORD_LINK_EXPIRES} days to confirm your email change")
expect(email).to have_text_part_content("If you don't understand why you received this email, please contact Policy & Abuse")
end
end
end
describe "#change_username" do
let(:old_username) { "olduser" }
let(:new_username) { "newuser" }
let(:user) { create(:user, login: new_username, renamed_at: Time.zone.parse("2025-01-01 00:00:00")) }
subject(:email) { UserMailer.change_username(user, old_username) }
before do
allow(ArchiveConfig).to receive(:USER_RENAME_LIMIT_DAYS).and_return(5)
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Your username has been changed"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi,")
expect(email).to have_html_part_content(">#{old_username}</b> has been changed to <b style=\"color:#990000\">#{new_username}</b>")
expect(email).to have_html_part_content("can only be changed once every 5 days")
expect(email).to have_html_part_content("You will be able to change your username again on Mon, 06 Jan 2025 00:00:00 +0000")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi,")
expect(email).to have_text_part_content("#{old_username} has been changed to #{new_username}")
expect(email).to have_text_part_content("can only be changed once every 5 days")
expect(email).to have_text_part_content("You will be able to change your username again on Mon, 06 Jan 2025 00:00:00 +0000")
end
end
end
describe "creatorship_request" do
include ActiveJob::TestHelper
def queue_adapter_for_test
ActiveJob::QueueAdapters::TestAdapter.new
end
subject(:email) { UserMailer.creatorship_request(work_creatorship.id, author.id) }
let(:author) { create(:user) }
let(:second_author) { create(:user) }
let(:work) { create(:work, authors: [author.default_pseud, second_author.default_pseud]) }
let(:work_creatorship) { Creatorship.find_by(creation_id: work.id, pseud_id: second_author.default_pseud.id) }
context "when the creation is unavailable" do
before { work_creatorship.creation.delete }
include_examples "it retries and fails on", ActionView::Template::Error
end
context "when the pseud being invited is unavailable" do
before { work_creatorship.pseud.delete }
include_examples "it retries and fails on", NoMethodError
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] You've received a request to be a co-creator"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("to be listed as a co-creator")
expect(email).to have_html_part_content(" page.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("to be listed as a co-creator")
expect(email).to have_text_part_content("You can accept or reject this request on your Co-Creator Requests page:")
end
end
end
describe "#creatorship_notification" do
include ActiveJob::TestHelper
def queue_adapter_for_test
ActiveJob::QueueAdapters::TestAdapter.new
end
subject(:email) { UserMailer.creatorship_notification(chapter_creatorship.id, author.id) }
let(:author) { create(:user) }
let(:second_author) { create(:user) }
let(:chapter) { create(:chapter, authors: [author.default_pseud, second_author.default_pseud]) }
let(:chapter_creatorship) { chapter.creatorships.last }
context "when the creation is unavailable" do
before { chapter_creatorship.creation.delete }
include_examples "it retries and fails on", ActionView::Template::Error
end
context "when the pseud being invited is unavailable" do
before { chapter_creatorship.pseud.delete }
include_examples "it retries and fails on", NoMethodError
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] You've been added as a co-creator"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("to be listed as a creator")
expect(email).to have_html_part_content("remove yourself as creator.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("to be listed as a creator")
expect(email).to have_text_part_content("remove yourself as creator:")
end
end
end
describe "creatorship_notification_archivist" do
include ActiveJob::TestHelper
def queue_adapter_for_test
ActiveJob::QueueAdapters::TestAdapter.new
end
subject(:email) { UserMailer.creatorship_notification_archivist(work_creatorship.id, author.id) }
let(:author) { create(:user) }
let(:second_author) { create(:user) }
let(:work) { create(:work, authors: [author.default_pseud, second_author.default_pseud]) }
let(:work_creatorship) { Creatorship.find_by(creation_id: work.id, pseud_id: second_author.default_pseud.id) }
context "when the creation is unavailable" do
before { work_creatorship.creation.delete }
include_examples "it retries and fails on", ActionView::Template::Error
end
context "when the pseud being invited is unavailable" do
before { work_creatorship.pseud.delete }
include_examples "it retries and fails on", NoMethodError
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] An archivist has added you as a co-creator"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("to be listed as a creator")
expect(email).to have_html_part_content("remove yourself as creator.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("to be listed as a creator")
expect(email).to have_text_part_content("remove yourself as creator:")
end
end
end
describe "claim_notification" do
title = "Façade"
title2 = Faker::Book.title
subject(:email) { UserMailer.claim_notification(author.id, [work.id, work2.id]) }
let(:author) { create(:user) }
let(:work) { create(:work, title: title, authors: [author.pseuds.first]) }
let(:work2) { create(:work, title: title2, authors: [author.pseuds.first]) }
# Shared content tests for both email types
shared_examples_for "a claim notification" do
it "contains the text for a claim email" do
expect(part).to include("You're receiving this e-mail because you had works in a fanworks archive that has been imported")
expect(part).to include("The Open Doors team")
end
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Works uploaded"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it_behaves_like "a claim notification" do
let(:part) { email.html_part.decoded }
end
it "lists the first imported work" do
expect(email).to have_html_part_content(title)
end
it "lists the second imported work" do
expect(email).to have_html_part_content(title2)
end
it "only has style_to links in the HTML body" do
expect(email.html_part.decoded).not_to have_xpath("//a[not(@style)]")
end
end
describe "text version" do
it_behaves_like "a claim notification" do
let(:part) { email.text_part.decoded }
end
it "lists the second imported work with a leading hyphen" do
expect(email).to have_text_part_content("- \"#{title2}\"")
end
it "displays titles with non-ASCII characters" do
expect(email).to have_text_part_content(title)
end
end
end
describe "invitation_to_claim" do
title = Faker::Book.title
title2 = Faker::Book.title
subject(:email) { UserMailer.invitation_to_claim(invitation.id, archivist.login) }
let(:archivist) { create(:user) }
let(:external_author) { create(:external_author) }
let(:external_author_name) do
create(:external_author_name,
external_author_id: external_author.id,
name: "External Author")
end
let(:invitation) do
create(:invitation, external_author_id: external_author.id)
end
let(:work) { create(:work, title: title) }
let(:work2) { create(:work, title: title2) }
let!(:work_external_creatorship) do
create(:external_creatorship,
creation_id: work.id,
external_author_name_id: external_author_name.id)
end
let!(:work2_external_creatorship) do
create(:external_creatorship,
creation_id: work2.id,
external_author_name_id: external_author_name.id)
end
# Shared content tests for both email types
shared_examples_for "an invitation to claim content" do
it "contains the text for an invitation claim email" do
expect(part).to include("You're receiving this e-mail because an archive has recently been imported by")
expect(part).to include("The Open Doors team")
end
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Invitation to claim works"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it_behaves_like "an invitation to claim content" do
let(:part) { email.html_part.decoded }
end
it "lists the first imported work in an unordered list in the HTML body" do
expect(email.html_part.decoded).to have_xpath("//ul/li", text: title)
end
it "lists the second imported work in an unordered list in the HTML body" do
expect(email.html_part.decoded).to have_xpath("//ul/li", text: title2)
end
it "only has style_to links in the HTML body" do
expect(email.html_part.decoded).not_to have_xpath("//a[not(@style)]")
end
end
describe "text version" do
it_behaves_like "an invitation to claim content" do
let(:part) { email.text_part.decoded }
end
it "lists the first imported work as plain text" do
expect(email.text_part.decoded).not_to have_xpath("//ul/li", text: title)
end
it "lists the second imported work with a leading hyphen" do
expect(email).to have_text_part_content("- \"#{title2}\"")
end
end
end
describe "invitation" do
context "when sent by a user" do
subject(:email) { UserMailer.invitation(invitation.id) }
let(:user) { create(:user) }
let(:invitation) { create(:invitation, creator: user) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Invitation"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("follow this link to sign up</a>")
expect(email).to have_html_part_content("has invited you")
expect(email).to have_html_part_content("Organization for Transformative Works</a>, which works to protect fan rights and preserve fanworks.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("like to join us, please follow this link to sign up")
expect(email).to have_text_part_content("has invited you")
expect(email).to have_text_part_content("the Organization for Transformative Works (https://www.transformativeworks.org), which works to protect fan rights and preserve fanworks")
end
end
end
context "when sent from the queue or by an admin" do
subject(:email) { UserMailer.invitation(invitation.id) }
let(:invitation) { create(:invitation) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Invitation"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("follow this link to sign up")
expect(email).to have_html_part_content("been invited")
expect(email).to have_html_part_content("Organization for Transformative Works</a>, which works to protect fan rights and preserve fanworks.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("like to join us, please follow this link to sign up")
expect(email).to have_text_part_content("been invited")
expect(email).to have_text_part_content("the Organization for Transformative Works (https://www.transformativeworks.org), which works to protect fan rights and preserve fanworks")
end
end
end
end
describe "challenge_assignment_notification" do
subject(:email) { UserMailer.challenge_assignment_notification(collection.id, otheruser.id, open_assignment.id) }
let!(:gift_exchange) { create(:gift_exchange) }
let!(:collection) { create(:collection, challenge: gift_exchange, challenge_type: "GiftExchange") }
let!(:otheruser) { create(:user) }
let!(:offer) { create(:challenge_signup, collection: collection, pseud: otheruser.default_pseud) }
let!(:open_assignment) { create(:challenge_assignment, collection: collection, offer_signup: offer, sent_at: Time.current) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] Your assignment!"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("You have been assigned the following request")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("You have been assigned the following request")
end
end
end
describe "invite_request_declined" do
subject(:email) { UserMailer.invite_request_declined(user.id, total, reason) }
let(:user) { create(:user) }
let(:total) { 2 }
let(:reason) { "You smell" }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Additional invitation request declined"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("We regret to inform you that your request for 2 new invitations cannot be fulfilled at this time")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("We regret to inform you that your request for 2 new invitations cannot be fulfilled at this time")
end
end
end
describe "signup_notification" do
subject(:email) { UserMailer.signup_notification(user.id) }
let(:user) { create(:user, :unconfirmed) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Activate your account"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Once your account is up and running, you can post your fanworks, set up email")
expect(email).to have_html_part_content("follow this link to activate your account</a>.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Once your account is up and running, you can post your fanworks, set up email")
expect(email).to have_text_part_content("follow this link to activate your account:")
end
end
end
describe "invite_increase_notification" do
let!(:user) { create(:user) }
context "when 1 invitation is issued" do
subject(:email) { UserMailer.invite_increase_notification(user.id, count) }
let(:count) { 1 }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
expect(email.subject).to eq("[#{ArchiveConfig.APP_SHORT_NAME}] New invitations")
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("you have #{count} new invitation, which")
expect(email).to have_html_part_content("your invitations page</a>.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("you have #{count} new invitation, which")
expect(email).to have_text_part_content("your invitations page (")
end
end
end
context "when multiple invitations are issued" do
subject(:email) { UserMailer.invite_increase_notification(user.id, count) }
let(:count) { 5 }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
expect(email.subject).to eq("[#{ArchiveConfig.APP_SHORT_NAME}] New invitations")
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("you have #{count} new invitations, which")
expect(email).to have_html_part_content("your invitations page</a>.")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("you have #{count} new invitations, which")
expect(email).to have_text_part_content("your invitations page (")
end
end
end
end
describe "batch_subscription_notification" do
include ActiveJob::TestHelper
def queue_adapter_for_test
ActiveJob::QueueAdapters::TestAdapter.new
end
subject(:email) { UserMailer.batch_subscription_notification(subscription.id, ["Work_#{work.id}", "Chapter_#{chapter.id}"].to_json) }
let(:work) { create(:work, summary: "<p>Paragraph <u>one</u>.</p><p>Paragraph 2.</p>") }
let(:chapter) { create(:chapter, work: work, summary: "<p><b>Another</b> HTML summary.</p>") }
let(:subscription) { create(:subscription, subscribable: work) }
context "when the user is unavailable" do
before { subscription.user.delete }
include_examples "it retries and fails on", NoMethodError
end
context "when the user's preferences are unavailable" do
before { subscription.user.preference.delete }
include_examples "it retries and fails on", NoMethodError
end
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] #{subscription.subject_text(work)} and 1 more"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("new work")
expect(email).to have_html_part_content("new chapter of")
end
it "includes HTML from the work summary" do
expect(email).to have_html_part_content("<p>Paragraph <u>one</u>.</p>")
expect(email).to have_html_part_content("<p>Paragraph 2.</p>")
end
it "includes HTML from the chapter summary" do
expect(email).to have_html_part_content("<p><b>Another</b> HTML summary.</p>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("new work")
expect(email).to have_text_part_content("new chapter of #{work.title}")
end
it "reformats HTML from the work summary" do
expect(email).to have_text_part_content("Paragraph _one_.")
expect(email).to have_text_part_content("Paragraph 2.")
end
it "reformats HTML from the chapter summary" do
expect(email).to have_text_part_content("*Another* HTML summary.")
end
end
end
describe "admin_hidden_work_notification" do
subject(:email) { UserMailer.admin_hidden_work_notification([work.id], user.id) }
let(:user) { create(:user) }
let(:work) { create(:work, authors: [user.pseuds.first]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Your work has been hidden by the Policy & Abuse committee"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
expect(email).to have_html_part_content("> has been hidden")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
expect(email).to have_text_part_content(") has been hidden")
end
end
end
describe "abuse_report" do
let(:report) { create(:abuse_report) }
let(:email) { UserMailer.abuse_report(report.id) }
it "has the correct subject" do
expect(email).to have_subject "[#{ArchiveConfig.APP_SHORT_NAME}] Abuse - #{report.summary}"
end
it "delivers to the user who filed the report" do
expect(email).to deliver_to(report.email)
end
it_behaves_like "an email with a valid sender"
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "contains the comment and the URL reported" do
expect(email).to have_html_part_content(report.comment)
expect(email).to have_html_part_content(report.url)
end
end
describe "text version" do
it "contains the comment and the URL reported" do
expect(email).to have_text_part_content(report.comment)
expect(email).to have_text_part_content(report.url)
end
end
describe "translation" do
it "formats the date rightfully in English" do
travel_to "2022-03-14 13:27:09 +0000" do
expect(email).to have_html_part_content("Sent at Mon, 14 Mar 2022 13:27:09 +0000.")
expect(email).to have_text_part_content("Sent at Mon, 14 Mar 2022 13:27:09 +0000.")
end
end
it "formats the date rightfully in French" do
I18n.with_locale("fr") do
travel_to "2022-03-14 13:27:09 +0000" do
expect(email).to have_html_part_content("Envoyé le 14 mars 2022 13h 27min 09s.")
expect(email).to have_text_part_content("Envoyé le 14 mars 2022 13h 27min 09s.")
end
end
end
end
end
describe "feedback" do
context "when username is present" do
subject(:email) { UserMailer.feedback(feedback.id) }
let(:feedback) { create(:feedback) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Support - #{feedback.summary}"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi!")
expect(email).to have_html_part_content(">The AO3 Support team</b>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi!")
expect(email).to have_text_part_content("The AO3 Support team")
end
end
end
context "when username is not present" do
subject(:email) { UserMailer.feedback(feedback.id) }
let(:feedback) { create(:feedback, username: "A. Name") }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Support - #{feedback.summary}"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi, <b")
expect(email).to have_html_part_content("#{feedback.username}</b>")
expect(email).to have_html_part_content(">The AO3 Support team</b>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi, #{feedback.username}!")
expect(email).to have_text_part_content("The AO3 Support team")
end
end
end
end
describe "admin_spam_work_notification" do
subject(:email) { UserMailer.admin_spam_work_notification(work.id, user.id) }
let(:user) { create(:user) }
let(:work) { create(:work, authors: [user.pseuds.first]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Your work was hidden as spam"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
expect(email).to have_html_part_content("> has been flagged by our automated system")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
expect(email).to have_text_part_content(") has been flagged by our automated system")
end
end
end
describe "invited_to_collection_notification" do
subject(:email) { UserMailer.invited_to_collection_notification(user.id, work.id, collection.id) }
let(:collection) { create(:collection) }
let(:user) { create(:user) }
let(:work) { create(:work, authors: [user.pseuds.first]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] Request to include work in a collection"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
end
end
end
describe "#archivist_added_to_collection_notification" do
subject(:email) do
UserMailer.archivist_added_to_collection_notification(user.id, work.id, collection.id)
end
let(:collection) { create(:collection) }
let(:user) { create(:user) }
let(:work) { create(:work, authors: [user.pseuds.first]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] An Open Doors archivist has added your work to a collection"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
expect(email).to have_html_part_content(collection.title)
expect(email).to have_html_part_content(work.title)
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
expect(email).to have_text_part_content(collection.title)
expect(email).to have_text_part_content(work.title)
end
end
end
describe "recipient_notification" do
context "when collection is present" do
subject(:email) { UserMailer.recipient_notification(user.id, work.id, collection.id) }
let(:user) { create(:user) }
let(:work) { create(:work, fandom_string: "Fandom 1, Fandom 2", character_string: "A, B") }
let(:collection) { create(:collection) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] A gift work for you from #{collection.title}"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi, <b")
expect(email).to have_html_part_content("#{user.login}</b>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi, #{user.login}!")
end
end
end
context "when no collection is present" do
subject(:email) { UserMailer.recipient_notification(user.id, work.id) }
let(:user) { create(:user) }
let(:work) { create(:work) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] A gift work for you"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi, <b")
expect(email).to have_html_part_content("#{user.login}</b>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi, #{user.login}")
end
end
end
end
describe "potential_match_generation_notification" do
subject(:email) { UserMailer.potential_match_generation_notification(collection.id, "test@example.com") }
let(:collection) { create(:collection) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] Potential assignment generation complete"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("potential assignments for your gift exchange <")
expect(email).to have_html_part_content("on its <")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("potential assignments for your gift exchange \"#{collection.title}\"")
expect(email).to have_text_part_content("on its Matching page:")
end
end
end
describe "potential_match_generation_notification_collection_email" do
subject(:email) { UserMailer.potential_match_generation_notification(collection.id, collection.collection_email) }
let(:collection) { create(:collection) }
it_behaves_like "an email with a valid sender"
describe "HTML version" do
it "has the correct footer content" do
expect(email).to have_html_part_content("your email address has been listed as the collection email")
end
end
describe "text version" do
it "has the correct footer content" do
expect(email).to have_text_part_content("your email address has been listed as the collection email")
end
end
end
describe "invalid_signup_notification" do
subject(:email) { UserMailer.invalid_signup_notification(collection.id, [signup.id], "test@example.com") }
let(:collection) { create(:collection) }
let(:signup) { create(:challenge_signup) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] Invalid sign-ups found"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("invalid sign-ups in your gift exchange <")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("invalid sign-ups in your gift exchange \"#{collection.title}\"")
end
end
end
describe "invalid_signup_notification_collection_email" do
subject(:email) { UserMailer.invalid_signup_notification(collection.id, [signup.id], collection.collection_email) }
let(:collection) { create(:collection) }
let(:signup) { create(:challenge_signup) }
it_behaves_like "an email with a valid sender"
describe "HTML version" do
it "has the correct footer content" do
expect(email).to have_html_part_content("your email address has been listed as the collection email")
end
end
describe "text version" do
it "has the correct footer content" do
expect(email).to have_text_part_content("your email address has been listed as the collection email")
end
end
end
describe "collection_notification" do
subject(:email) { UserMailer.collection_notification(collection.id, subject_text, message_text, "test@example.com") }
let(:collection) { create(:collection) }
let(:subject_text) { Faker::Hipster.sentence }
let(:message_text) { Faker::Hipster.paragraph }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}][#{collection.title}] #{subject_text}"
expect(email.subject).to eq(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
it_behaves_like "a translated email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("your collection <")
expect(email).to have_html_part_content("#{message_text}</blockquote>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("your collection \"#{collection.title}\"")
expect(email).to have_text_part_content(message_text)
end
end
end
describe "prompter_notification" do
context "when collection is present" do
subject(:email) { UserMailer.prompter_notification(work.id, collection.id) }
let(:collection) { create(:collection) }
let(:claim) { create(:challenge_claim, request_signup: create(:prompt_meme_signup)) }
let(:work) { create(:work, challenge_claims: [claim]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] A response to your prompt"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("A response to your prompt")
expect(email).to have_html_part_content("#{collection.title}</a>")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("A response to your prompt")
expect(email).to have_text_part_content("\"#{collection.title}\" collection (#{collection_url(collection)})")
end
end
end
context "when no collection is present" do
subject(:email) { UserMailer.prompter_notification(work.id) }
let(:claim) { create(:challenge_claim, request_signup: create(:prompt_meme_signup)) }
let(:work) { create(:work, challenge_claims: [claim]) }
# Test the headers
it_behaves_like "an email with a valid sender"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] A response to your prompt"
expect(email).to have_subject(subject)
end
# Test both body contents
it_behaves_like "a multipart email"
describe "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("posted at the Archive")
expect(email).not_to have_html_part_content("collection")
end
end
describe "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("posted at the Archive")
expect(email).not_to have_text_part_content("collection")
end
end
end
end
describe "delete_work_notification" do
subject(:email) { UserMailer.delete_work_notification(user, work, user) }
let(:user) { create(:user) }
let(:work) { create(:work) }
it_behaves_like "an email with a valid sender"
it_behaves_like "a translated email"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Your work has been deleted"
expect(email).to have_subject(subject)
end
it "has the correct attachments" do
filename = work.title.gsub(/\s/, "_")
expect(email.attachments.length).to eq(2)
expect(email.attachments).to contain_exactly(
an_object_having_attributes(filename: "#{filename}.html"),
an_object_having_attributes(filename: "#{filename}.txt")
)
end
context "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
expect(email).to have_html_part_content("was deleted at your request")
end
end
context "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
expect(email).to have_text_part_content("Your work \"#{work.title}\" was deleted at your request")
end
end
context "when work has posted and draft chapters" do
let!(:draft_chapter) { create(:chapter, :draft, work: work, position: 2) }
it_behaves_like "an email with a deleted work with draft chapters attached"
end
context "when work has only draft chapters" do
before do
work.chapters.first.update_column(:posted, false)
end
it_behaves_like "an email with a deleted work with draft chapters attached"
end
end
describe "admin_deleted_work_notification" do
subject(:email) { UserMailer.admin_deleted_work_notification(user, work) }
let(:user) { create(:user) }
let(:work) { create(:work) }
it_behaves_like "an email with a valid sender"
it_behaves_like "a translated email"
it "has the correct subject line" do
subject = "[#{ArchiveConfig.APP_SHORT_NAME}] Your work has been deleted by an admin"
expect(email).to have_subject(subject)
end
it "has the correct attachments" do
filename = work.title.gsub(/\s/, "_")
expect(email.attachments.length).to eq(2)
expect(email.attachments).to contain_exactly(
an_object_having_attributes(filename: "#{filename}.html"),
an_object_having_attributes(filename: "#{filename}.txt")
)
end
context "HTML version" do
it "has the correct content" do
expect(email).to have_html_part_content("Hi <b")
expect(email).to have_html_part_content("#{user.login}</b>,")
expect(email).to have_html_part_content("was deleted from the Archive by a site admin")
end
end
context "text version" do
it "has the correct content" do
expect(email).to have_text_part_content("Hi #{user.login},")
expect(email).to have_text_part_content("Your work \"#{work.title}\" was deleted from the Archive by a site admin")
end
end
context "when work has posted and draft chapters" do
let!(:draft_chapter) { create(:chapter, :draft, work: work, position: 2) }
it_behaves_like "an email with a deleted work with draft chapters attached"
end
context "when work has only draft chapters" do
before do
work.chapters.first.update_column(:posted, false)
end
it_behaves_like "an email with a deleted work with draft chapters attached"
end
end
end