Skip to content

Commit e986c3c

Browse files
committed
Support mailers with args and kwargs
Closes #564 and closes #565
1 parent 05c1aca commit e986c3c

4 files changed

Lines changed: 85 additions & 2 deletions

File tree

docs/delivery_methods/email.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ deliver_by :email do |config|
88
config.method = :receipt
99
config.params = ->{ params }
1010
config.args = ->{ [1, 2, 3] }
11+
config.kwargs = ->{ {body: "Hey there", subject: "Thanks for joining"} }
1112

1213
# Enqueues a separate job for sending the email using deliver_later.
1314
# Deliveries already happen in jobs so this is typically unnecessary.
@@ -31,6 +32,12 @@ end
3132

3233
- `args` - _Optional_
3334

35+
The arguments for the `method` if it uses **positional arguments** (eg: `def hello(a, b, c=1)`)
36+
37+
- `kwargs` - _Optional_
38+
39+
The arguments for the `method` if it uses **keyword arguments** (eg: `def hello(a:, b:, c: 1)`)
40+
3441
- `enqueue: false` - _Optional_
3542

3643
Use `deliver_later` to queue email delivery with ActiveJob. This is `false` by default as each delivery method is already a separate job.

lib/noticed/delivery_methods/email.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ def deliver
77
mailer = fetch_constant(:mailer)
88
email = evaluate_option(:method)
99
args = evaluate_option(:args) || []
10-
mail = mailer.with(params).public_send(email, *args)
10+
kwargs = evaluate_option(:kwargs) || {}
11+
mail = mailer.with(params).public_send(email, *args, **kwargs)
12+
1113
(!!evaluate_option(:enqueue)) ? mail.deliver_later : mail.deliver_now
1214
end
1315

test/delivery_methods/email_test.rb

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class EmailTest < ActiveSupport::TestCase
88
@notification = noticed_notifications(:one)
99
end
1010

11-
test "sends email" do
11+
test "sends email (with args)" do
1212
set_config(
1313
mailer: "UserMailer",
1414
method: "new_comment",
@@ -21,6 +21,76 @@ class EmailTest < ActiveSupport::TestCase
2121
end
2222
end
2323

24+
test "sends email (with kwargs)" do
25+
set_config(
26+
mailer: "UserMailer",
27+
method: "greeting",
28+
params: -> { {foo: :bar} },
29+
kwargs: -> { {body: "Custom"} }
30+
)
31+
32+
assert_emails(1) do
33+
@delivery_method.deliver
34+
end
35+
end
36+
37+
test "sends email (with kwargs, replacing default argument)" do
38+
set_config(
39+
mailer: "UserMailer",
40+
method: "greeting",
41+
params: -> { {foo: :bar} },
42+
kwargs: -> { {body: "Custom", subject: "Testing"} }
43+
)
44+
45+
assert_emails(1) do
46+
@delivery_method.deliver
47+
end
48+
end
49+
50+
test "raises the underlying ArgumentError if kwargs are missing" do
51+
set_config(
52+
mailer: "UserMailer",
53+
method: "greeting",
54+
params: -> { {foo: :bar} },
55+
kwargs: -> { {baz: 123} }
56+
)
57+
58+
error = assert_raises ArgumentError do
59+
@delivery_method.deliver
60+
end
61+
62+
assert_equal "missing keyword: :body", error.message
63+
end
64+
65+
test "raises the underlying ArgumentError if unknown kwargs are given" do
66+
set_config(
67+
mailer: "UserMailer",
68+
method: "greeting",
69+
params: -> { {foo: :bar} },
70+
kwargs: -> { {body: "Test", baz: 123} }
71+
)
72+
73+
error = assert_raises ArgumentError do
74+
@delivery_method.deliver
75+
end
76+
77+
assert_equal "unknown keyword: :baz", error.message
78+
end
79+
80+
test "accepts both args and kwargs" do
81+
set_config(
82+
mailer: "UserMailer",
83+
method: "greeting",
84+
params: -> { {foo: :bar} },
85+
args: -> { ["hey"] },
86+
kwargs: -> { {body: "Test"} }
87+
)
88+
89+
assert_emails(1) do
90+
@delivery_method.deliver
91+
end
92+
end
93+
2494
test "enqueues email" do
2595
set_config(
2696
mailer: "UserMailer",

test/dummy/app/mailers/user_mailer.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ def new_comment(*args)
33
mail(body: "new comment")
44
end
55

6+
def greeting(message = "message", body:, subject: "Hello")
7+
mail(body: body, subject: subject)
8+
end
9+
610
def receipt
711
mail(body: "receipt")
812
end

0 commit comments

Comments
 (0)