Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/mailers/request_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ def request_cancel_partner_notification(request_id:)
end
@formatted_requested_items.sort_by! { |rt| rt[:name] }

recipients = [@partner.email, @request.requester.email].uniq

mail(
to: @partner.email,
to: recipients,
subject: "Your essentials request (##{@request.id}) has been canceled."
)
end
Expand Down
6 changes: 4 additions & 2 deletions app/models/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ def total_items
end

def requester
# Despite the field being called "partner_user_id", it can refer to both a partner user or an organization admin
partner_user_id ? partner_user : partner
# Despite the field being called "partner_user_id", it can refer to both a partner user or an organization admin.
# Keyed off the association rather than the id: User is default-scoped to kept records, so a discarded
# user leaves partner_user_id set while partner_user resolves to nil.
partner_user || partner
end

def request_type_label
Expand Down
53 changes: 39 additions & 14 deletions spec/mailers/request_mailer_spec.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,47 @@
RSpec.describe RequestMailer, type: :mailer do
describe "#request_cancel_partner_notification" do
subject { described_class.request_cancel_partner_notification(request_id: request.id) }
let(:request) { create(:request) }

it "renders the body with correct text with partner information" do
html = html_body(subject)
expect(html).to include("Hello there, <strong>#{request.partner.name}</strong>")
expect(html).to include("One of your essentials requests (##{request.id}) have been canceled.")
text = text_body(subject)
expect(text).to include("Hello there, #{request.partner.name}")
expect(text).to include("One of your essentials requests (##{request.id}) have been canceled.")

let(:partner) { create(:partner, email: "partner@example.com") }

context "when the request was sent by a partner user" do
let(:partner_user) { create(:partner_user, email: "requester@example.com", partner: partner) }
let(:request) { create(:request, partner: partner, partner_user: partner_user) }

it "renders the body with correct text with partner information" do
html = html_body(subject)
expect(html).to include("Hello there, <strong>#{request.partner.name}</strong>")
expect(html).to include("One of your essentials requests (##{request.id}) have been canceled.")
text = text_body(subject)
expect(text).to include("Hello there, #{request.partner.name}")
expect(text).to include("One of your essentials requests (##{request.id}) have been canceled.")
end

it "is sent to both the partner and the request sender with the correct subject line" do
expect(subject.to).to match_array(["partner@example.com", "requester@example.com"])
expect(subject.from).to eq(['no-reply@humanessentials.app'])
expect(subject.subject).to eq("Your essentials request (##{request.id}) has been canceled.")
end
end

context "when the request has no partner user" do
let(:request) { create(:request, partner: partner, partner_user: nil) }

it "is sent only to the partner main email" do
expect(subject.to).to eq(["partner@example.com"])
end
end

it "should be sent to the partner main email with the correct subject line" do
expect(subject.to).to eq([request.partner.email])
expect(subject.from).to eq(['no-reply@humanessentials.app'])
expect(subject.subject).to eq("Your essentials request (##{request.id}) has been canceled.")
context "when the partner user who sent the request has since been discarded" do
let(:partner_user) { create(:partner_user, email: "requester@example.com", partner: partner) }
let(:request) { create(:request, partner: partner, partner_user: partner_user) }

it "is still sent to the partner main email" do
request
partner_user.discard

expect(subject.to).to eq(["partner@example.com"])
end
end
end
end

32 changes: 32 additions & 0 deletions spec/models/request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,38 @@
end
end

describe "requester" do
let(:partner) { create(:partner) }

context "when a partner user submitted the request" do
let(:partner_user) { create(:partner_user, partner: partner) }

it "returns the partner user" do
request = create(:request, partner: partner, partner_user: partner_user)
expect(request.requester).to eq(partner_user)
end
end

context "when no partner user is recorded" do
it "returns the partner" do
request = create(:request, partner: partner, partner_user: nil)
expect(request.requester).to eq(partner)
end
end

context "when the partner user has since been discarded" do
let(:partner_user) { create(:partner_user, partner: partner) }

it "falls back to the partner" do
request = create(:request, partner: partner, partner_user: partner_user)
partner_user.discard

expect(request.reload.partner_user_id).to eq(partner_user.id)
expect(request.requester).to eq(partner)
end
end
end

describe "versioning" do
it { is_expected.to be_versioned }
end
Expand Down
Loading