From bee5f991d101bb85e0ab19bf68de45aec62102e1 Mon Sep 17 00:00:00 2001 From: May Miller-Ricci Date: Thu, 21 Feb 2019 11:55:43 -0800 Subject: [PATCH] Merges the response in to the Email returned from deliver_now if the response from the adapter's deliver function conforms to our norm of returning a status_code, headers, and body --- lib/bamboo/email.ex | 6 ++++-- lib/bamboo/mailer.ex | 12 +++++++++--- test/lib/bamboo/mailer_test.exs | 24 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/bamboo/email.ex b/lib/bamboo/email.ex index 5c4669f8..9782009d 100644 --- a/lib/bamboo/email.ex +++ b/lib/bamboo/email.ex @@ -75,7 +75,8 @@ defmodule Bamboo.Email do text_body: nil | String.t(), headers: %{String.t() => String.t()}, assigns: %{atom => any}, - private: %{atom => any} + private: %{atom => any}, + response: nil | %{atom => any} } defstruct from: nil, @@ -88,7 +89,8 @@ defmodule Bamboo.Email do headers: %{}, attachments: [], assigns: %{}, - private: %{} + private: %{}, + response: nil alias Bamboo.{Email, Attachment} diff --git a/lib/bamboo/mailer.ex b/lib/bamboo/mailer.ex index bbfdb4b6..1a97c20c 100644 --- a/lib/bamboo/mailer.ex +++ b/lib/bamboo/mailer.ex @@ -118,12 +118,12 @@ defmodule Bamboo.Mailer do if email.to == [] && email.cc == [] && email.bcc == [] do debug_unsent(email) + email else debug_sent(email, adapter) - adapter.deliver(email, config) + response = adapter.deliver(email, config) + maybe_merge_response(email, response) end - - email end @doc false @@ -140,6 +140,12 @@ defmodule Bamboo.Mailer do email end + defp maybe_merge_response(email, %{status_code: _, headers: _, body: _} = response) do + %{email | response: response} + end + + defp maybe_merge_response(email, _), do: email + defp debug_sent(email, adapter) do Logger.debug(fn -> """ diff --git a/test/lib/bamboo/mailer_test.exs b/test/lib/bamboo/mailer_test.exs index 70019201..f971a134 100644 --- a/test/lib/bamboo/mailer_test.exs +++ b/test/lib/bamboo/mailer_test.exs @@ -12,6 +12,14 @@ defmodule Bamboo.MailerTest do def supports_attachments?, do: true end + defmodule ResponseAdapter do + def deliver(_email, _config) do + send(:mailer_test, %{status_code: 202, headers: [%{}], body: ""}) + end + + def handle_config(config), do: config + end + defmodule CustomConfigAdapter do def deliver(email, config) do send(:mailer_test, {:deliver, email, config}) @@ -54,6 +62,14 @@ defmodule Bamboo.MailerTest do use Bamboo.Mailer, otp_app: :bamboo end + @response_config adapter: ResponseAdapter, foo: :bar + + Application.put_env(:bamboo, __MODULE__.ResponseAdapterMailer, @response_config) + + defmodule ResponseAdapterMailer do + use Bamboo.Mailer, otp_app: :bamboo + end + setup do Process.register(self(), :mailer_test) :ok @@ -125,6 +141,14 @@ defmodule Bamboo.MailerTest do assert config == config_with_default_strategy end + test "deliver_now/1 returns the email with the response if there is a conforming one" do + email = new_email(to: "foo@bar.com") + + %Email{response: response} = ResponseAdapterMailer.deliver_now(email) + + assert %{body: _, headers: _, status_code: _} = response + end + test "deliver_now/1 with no from address" do assert_raise Bamboo.EmptyFromAddressError, fn -> FooMailer.deliver_now(new_email(from: nil))