diff --git a/app/mailers/request_mailer.rb b/app/mailers/request_mailer.rb index 814916a1e8..570b77c08d 100644 --- a/app/mailers/request_mailer.rb +++ b/app/mailers/request_mailer.rb @@ -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 diff --git a/app/models/request.rb b/app/models/request.rb index 6c4590975b..0e9efa673a 100644 --- a/app/models/request.rb +++ b/app/models/request.rb @@ -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 diff --git a/spec/mailers/request_mailer_spec.rb b/spec/mailers/request_mailer_spec.rb index 4ea835077e..9e203a1bf8 100644 --- a/spec/mailers/request_mailer_spec.rb +++ b/spec/mailers/request_mailer_spec.rb @@ -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, #{request.partner.name}") - 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, #{request.partner.name}") + 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 - diff --git a/spec/models/request_spec.rb b/spec/models/request_spec.rb index e203179deb..247bd7ec57 100644 --- a/spec/models/request_spec.rb +++ b/spec/models/request_spec.rb @@ -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