@@ -248,6 +248,79 @@ class MailDelivery::EmailTest < ActiveSupport::TestCase
248248 assert_not MailDelivery ::Email . exists? ( email . id )
249249 end
250250
251+ test "broadcast suppression does NOT block transactional email (invoice)" do
252+ member = members ( :john )
253+ suppress_email ( "john@doe.com" , stream_id : "broadcast" , reason : "ManualSuppression" , origin : "Customer" )
254+
255+ delivery = MailDelivery . deliver! (
256+ member : member , mailable : invoices ( :other_closed ) , action : "created" )
257+
258+ email = delivery . emails . find_by ( email : "john@doe.com" )
259+ assert email . present? , "Email record should have been created"
260+ assert email . deliverable? , "Broadcast suppression should not block transactional email"
261+ assert_empty email . email_suppression_ids
262+ end
263+
264+ test "broadcast suppression DOES block newsletter email" do
265+ member = members ( :john )
266+ suppress_email ( "john@doe.com" , stream_id : "broadcast" , reason : "ManualSuppression" , origin : "Customer" )
267+
268+ delivery = MailDelivery . deliver! (
269+ member : member , mailable : newsletters ( :simple ) , action : "newsletter" )
270+
271+ email = delivery . emails . find_by ( email : "john@doe.com" )
272+ assert email . present? , "Email record should have been created"
273+ assert_not email . deliverable? , "Broadcast suppression should block newsletter"
274+ assert_not_empty email . email_suppression_ids
275+ end
276+
277+ test "outbound suppression blocks transactional email" do
278+ member = members ( :john )
279+ member . update! ( emails : "john@doe.com, jojo@old.com" )
280+ suppress_email ( "jojo@old.com" , stream_id : "outbound" )
281+
282+ delivery = MailDelivery . deliver! (
283+ member : member , mailable : invoices ( :other_closed ) , action : "created" )
284+
285+ # jojo@old.com should not even be a recipient (filtered by active_emails)
286+ assert_nil delivery . emails . find_by ( email : "jojo@old.com" )
287+ # john@doe.com should be deliverable
288+ email = delivery . emails . find_by ( email : "john@doe.com" )
289+ assert email . present?
290+ assert email . deliverable?
291+ end
292+
293+ test "outbound suppression DOES block transactional email deliverable?" do
294+ member = members ( :john )
295+ suppress_email ( "john@doe.com" , stream_id : "outbound" )
296+
297+ delivery = MailDelivery . deliver! (
298+ member : member , mailable : invoices ( :other_closed ) , action : "created" ,
299+ recipients : [ "john@doe.com" ] )
300+
301+ email = delivery . emails . find_by ( email : "john@doe.com" )
302+ assert email . present?
303+ assert_not email . deliverable? , "Outbound suppression should block transactional email"
304+ assert_not_empty email . email_suppression_ids
305+ end
306+
307+ test "both broadcast and outbound suppressions block newsletter email" do
308+ member = members ( :john )
309+ member . update! ( emails : "john@doe.com, jojo@old.com" )
310+ suppress_email ( "john@doe.com" , stream_id : "broadcast" , reason : "ManualSuppression" , origin : "Customer" )
311+ suppress_email ( "jojo@old.com" , stream_id : "outbound" )
312+
313+ delivery = MailDelivery . deliver! (
314+ member : member , mailable : newsletters ( :simple ) , action : "newsletter" ,
315+ recipients : [ "john@doe.com" , "jojo@old.com" ] )
316+
317+ email_broadcast = delivery . emails . find_by ( email : "john@doe.com" )
318+ assert_not email_broadcast . deliverable? , "Broadcast suppression should block newsletter"
319+
320+ email_outbound = delivery . emails . find_by ( email : "jojo@old.com" )
321+ assert_not email_outbound . deliverable? , "Outbound suppression should block newsletter"
322+ end
323+
251324 test "process! handles InvalidEmailRequestError by creating InvalidAddress suppression" do
252325 member = members ( :john )
253326 delivery = MailDelivery . deliver! (
0 commit comments