From 9de9d0c2013c192ee086b94fe47ca6ce99560e77 Mon Sep 17 00:00:00 2001 From: Andrii Baran Date: Wed, 24 Jan 2024 11:35:09 +0200 Subject: [PATCH] Added reply_to_list support --- lib/sendgrid/helpers/mail/mail.rb | 38 +++++++++++++++++++++---- test/sendgrid/helpers/mail/test_mail.rb | 11 +++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/lib/sendgrid/helpers/mail/mail.rb b/lib/sendgrid/helpers/mail/mail.rb index 79321043..3fe9090c 100644 --- a/lib/sendgrid/helpers/mail/mail.rb +++ b/lib/sendgrid/helpers/mail/mail.rb @@ -5,8 +5,8 @@ module SendGrid class Mail attr_accessor :subject, :ip_pool_name, :template_id, :send_at, :batch_id - attr_reader :personalizations, :contents, :attachments, :categories, :sections, :headers, :custom_args - attr_writer :from, :asm, :mail_settings, :tracking_settings, :reply_to + attr_reader :personalizations, :contents, :attachments, :categories, :sections, :headers, :custom_args, :reply_to_list + attr_writer :from, :asm, :mail_settings, :tracking_settings # We allow for all nil values here to create uninitialized Mail objects # (e.g. /use-cases/transactional-templates.md) @@ -28,6 +28,7 @@ def initialize(from_email = nil, subj = nil, to_email = nil, cont = nil) # ruboc @mail_settings = nil @tracking_settings = nil @reply_to = nil + @reply_to_list = [] return if from_email.nil? && subj.nil? && to_email.nil? && cont.nil? @@ -93,6 +94,16 @@ def tracking_settings @tracking_settings.nil? ? nil : @tracking_settings.to_json end + def reply_to=(email) + @reply_to = email + verify_reply_options + end + + def reply_to_list=(emails) + @reply_to_list = emails.uniq(&:email) + verify_reply_options + end + def reply_to @reply_to.nil? ? nil : @reply_to.to_json end @@ -114,9 +125,26 @@ def to_json(*) 'asm' => asm, 'ip_pool_name' => ip_pool_name, 'mail_settings' => mail_settings, - 'tracking_settings' => tracking_settings, - 'reply_to' => reply_to - }.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {} } + 'tracking_settings' => tracking_settings + }.merge(reply_options).delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {} } + end + + private + + def reply_options + if !@reply_to.nil? + { 'reply_to' => reply_to } + elsif !@reply_to_list.size.zero? + 'reply_to_list' => reply_to_list + else + {} + end + end + + def verify_reply_options + if !@reply_to.nil? && !@reply_to_list.size.zero? + raise ArgumentError, 'You can either choose to use "reply_to" field or "reply_to_list" but not both.' + end end end end diff --git a/test/sendgrid/helpers/mail/test_mail.rb b/test/sendgrid/helpers/mail/test_mail.rb index 052960d0..827a96f9 100644 --- a/test/sendgrid/helpers/mail/test_mail.rb +++ b/test/sendgrid/helpers/mail/test_mail.rb @@ -119,6 +119,17 @@ def test_kitchen_sink # rubocop:enable all end + def test_reply_to_options + mail = SendGrid::Mail.new + mail.reply_to = Email.new(email: 'test@example.com') + assert_raises(ArgumentError) { mail.reply_to_list = [Email.new(email: 'test@example.com')] } + assert_equal(mail.to_json, '{}') + mail2 = SendGrid::Mail.new + mail2.reply_to_list = [Email.new(email: 'test@example.com')] + assert_raises(ArgumentError) { mail2.reply_to = Email.new(email: 'test@example.com') } + assert_equal(mail.to_json, '{}') + end + def test_that_personalizations_is_empty_initially mail = SendGrid::Mail.new assert_equal([], mail.personalizations)