Skip to content

Commit

Permalink
Raise if all recipients are nil
Browse files Browse the repository at this point in the history
See comment:
#40 (comment)
  • Loading branch information
paulcsmith committed Feb 11, 2016
1 parent c88e345 commit 4500b19
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 10 deletions.
13 changes: 13 additions & 0 deletions lib/bamboo.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,18 @@ defmodule Bamboo do
end
end

defmodule NilRecipientsError do
defexception [:message]

def exception(email) do
message = """
All recipients were set to nil. Must specify at least one recipient.
Full email - #{inspect email, limit: :infinity}
"""
%NilRecipientsError{message: message}
end
end

def start(_type, _args), do: Bamboo.SentEmail.start_link
end
23 changes: 19 additions & 4 deletions lib/bamboo/mailer.ex
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,18 @@ defmodule Bamboo.Mailer do

@doc false
def deliver(adapter, email, config) do
email = email |> Bamboo.Mailer.normalize_addresses
email = email |> validate_and_normalize

debug(email)
adapter.deliver(email, config)
unless email.to == [] && email.cc == [] && email.bcc == [] do
debug(email)
adapter.deliver(email, config)
end
email
end

@doc false
def deliver_later(adapter, email, config) do
email = email |> Bamboo.Mailer.normalize_addresses
email = email |> validate_and_normalize

debug(email)
adapter.deliver_later(email, config)
Expand All @@ -94,6 +97,18 @@ defmodule Bamboo.Mailer do
"""
end

defp validate_and_normalize(email) do
email |> validate_recipients |> normalize_addresses
end

defp validate_recipients(email) do
if email.to == nil && email.cc == nil && email.bcc == nil do
raise Bamboo.NilRecipientsError, email
else
email
end
end

@doc """
Wraps to, cc and bcc addresses in a list and normalizes email addresses.
Expand Down
2 changes: 1 addition & 1 deletion test/lib/bamboo/local_adapter_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ defmodule Bamboo.LocalAdapterTest do
end

defp new_normalized_email(attrs) do
attrs = attrs |> Keyword.put(:from, "foo@bar.com")
attrs = Keyword.merge([from: "foo@bar.com", to: "foo@bar.com"], attrs)
new_email(attrs) |> Bamboo.Mailer.normalize_addresses
end
end
43 changes: 40 additions & 3 deletions test/lib/bamboo/mailer_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@ defmodule Bamboo.MailerTest do
end

test "deliver/1 calls the adapter with the email and config" do
FooMailer.deliver(new_email)
email = new_email(to: "foo@bar.com")

returned_email = FooMailer.deliver(email)

assert returned_email == email
assert_received {:deliver, %Bamboo.Email{}, @mailer_config}
end

Expand All @@ -41,6 +44,34 @@ defmodule Bamboo.MailerTest do
end
end

test "deliver/1 with empty lists for recipients does not deliver email" do
new_email(to: [], cc: [], bcc: []) |> FooMailer.deliver(nil_recipients: :allowed)
refute_received {:deliver, _, @mailer_config}

new_email(to: [], cc: nil, bcc: nil) |> FooMailer.deliver
refute_received {:deliver, _, @mailer_config}

new_email(to: nil, cc: [], bcc: nil) |> FooMailer.deliver
refute_received {:deliver, _, @mailer_config}

new_email(to: nil, cc: nil, bcc: []) |> FooMailer.deliver
refute_received {:deliver, _, @mailer_config}
end

test "deliver_later/1 with empty lists for recipients does not deliver email" do
new_email(to: [], cc: [], bcc: []) |> FooMailer.deliver_later
refute_received {:deliver, _, @mailer_config}

new_email(to: [], cc: nil, bcc: nil) |> FooMailer.deliver_later
refute_received {:deliver, _, @mailer_config}

new_email(to: nil, cc: [], bcc: nil) |> FooMailer.deliver_later
refute_received {:deliver, _, @mailer_config}

new_email(to: nil, cc: nil, bcc: []) |> FooMailer.deliver_later
refute_received {:deliver, _, @mailer_config}
end

test "deliver_later/1 calls deliver_later on the adapter" do
email = new_email

Expand Down Expand Up @@ -102,7 +133,13 @@ defmodule Bamboo.MailerTest do
end
end

test "raises an error if a map is passed in an not a Bamboo.EmailAddress" do
test "raises if all receipients are nil" do
assert_raise Bamboo.NilRecipientsError, fn ->
new_email(to: nil, cc: nil, bcc: nil) |> FooMailer.deliver
end
end

test "raises if a map is passed in instead of a Bamboo.EmailAddress" do
email = new_email(from: %{foo: :bar})

assert_raise ArgumentError, fn ->
Expand All @@ -111,7 +148,7 @@ defmodule Bamboo.MailerTest do
end

defp new_email(attrs \\ []) do
attrs = Keyword.merge([from: "foo@bar.com"], attrs)
attrs = Keyword.merge([from: "foo@bar.com", to: "foo@bar.com"], attrs)
Email.new_email(attrs)
end
end
2 changes: 1 addition & 1 deletion test/lib/bamboo/mandrill_adapter_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ defmodule Bamboo.MandrillAdapterTest do
end

defp new_email(attrs \\ []) do
attrs = Keyword.merge([from: "foo@bar.com"], attrs)
attrs = Keyword.merge([from: "foo@bar.com", to: []], attrs)
Email.new_email(attrs)
end
end
2 changes: 1 addition & 1 deletion test/lib/bamboo/test_adapter_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ defmodule Bamboo.TestAdapterTest do
end

defp new_normalized_email(attrs \\ []) do
[from: "foo@bar.com"]
[from: "foo@bar.com", to: ["foo@bar.com"]]
|> Keyword.merge(attrs)
|> new_email
|> Bamboo.Mailer.normalize_addresses
Expand Down

0 comments on commit 4500b19

Please sign in to comment.