Skip to content

Commit b82a1ec

Browse files
authored
Introduce assign/2 to set many assigns (#600)
What changed? ============ We introduce `Bamboo.Template.assign/2` to sets many assigns for an email. It accepts a map or a keyword list as an argument. We take inspiration from [Phoenix.LiveView.assign/2][assign/2] [assign/2]: https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#assign/2
1 parent 4724a16 commit b82a1ec

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

lib/bamboo/template.ex

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,25 @@ defmodule Bamboo.Template do
204204
end
205205

206206
@doc """
207-
Sets an assign for the email. These will be available when rendering the email
207+
Sets many assigns for an email. Accepts a map or a keyword list. See
208+
`assign/3` for more.
209+
210+
## Example
211+
212+
new_email()
213+
|> assign(%{user: user})
214+
|> render(:template_name)
215+
216+
new_email()
217+
|> assign(user: user)
218+
|> render(:template_name)
219+
"""
220+
def assign(%{assigns: assigns} = email, attrs) when is_map(attrs) or is_list(attrs) do
221+
%{email | assigns: Enum.into(attrs, assigns)}
222+
end
223+
224+
@doc """
225+
Sets an assign for the email. These will be available when rendering the email.
208226
209227
## Example
210228

test/lib/bamboo/template_test.exs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ defmodule Bamboo.TemplateTest do
6363
|> render(:email_with_assigns)
6464
end
6565

66+
def email_with_many_assigns(user) do
67+
new_email()
68+
|> assign(%{user: user})
69+
|> render(:email_with_assigns)
70+
end
71+
6672
def html_email do
6773
new_email()
6874
|> render("html_email.html")
@@ -130,6 +136,11 @@ defmodule Bamboo.TemplateTest do
130136
email = Email.email_with_already_assigned_user(%{name: name})
131137
assert email.html_body =~ "<strong>#{name}</strong>"
132138
assert email.text_body =~ name
139+
140+
name = "Paul"
141+
email = Email.email_with_many_assigns(%{name: name})
142+
assert email.html_body =~ "<strong>#{name}</strong>"
143+
assert email.text_body =~ name
133144
end
134145

135146
test "render/2 renders html body if template extension is .html" do
@@ -183,4 +194,50 @@ defmodule Bamboo.TemplateTest do
183194
EmailNoView.no_view()
184195
end
185196
end
197+
198+
describe "assign/2" do
199+
test "it accepts a map of assigns" do
200+
email =
201+
Bamboo.Email.new_email()
202+
|> Bamboo.Template.assign(%{name: "Jules"})
203+
204+
assert %{name: "Jules"} = email.assigns
205+
end
206+
207+
test "it accepts a list of assigns" do
208+
email =
209+
Bamboo.Email.new_email()
210+
|> Bamboo.Template.assign(name: "Jules")
211+
212+
assert %{name: "Jules"} = email.assigns
213+
end
214+
215+
test "it overrides any existing assigns with the same keys" do
216+
email =
217+
Bamboo.Email.new_email()
218+
|> Bamboo.Template.assign(name: "James")
219+
|> Bamboo.Template.assign(name: "Jules")
220+
221+
assert %{name: "Jules"} = email.assigns
222+
end
223+
end
224+
225+
describe "assign/3" do
226+
test "sets given assign in list of assigns" do
227+
email =
228+
Bamboo.Email.new_email()
229+
|> Bamboo.Template.assign(:name, "Jules")
230+
231+
assert %{name: "Jules"} = email.assigns
232+
end
233+
234+
test "overrides any assigns already listed" do
235+
email =
236+
Bamboo.Email.new_email()
237+
|> Bamboo.Template.assign(:name, "James")
238+
|> Bamboo.Template.assign(:name, "Jules")
239+
240+
assert %{name: "Jules"} = email.assigns
241+
end
242+
end
186243
end

0 commit comments

Comments
 (0)