From b25e2305fd08aa925fb405b946c7c0c7a8229edb Mon Sep 17 00:00:00 2001 From: simukappu Date: Wed, 14 Aug 2019 00:25:25 +0900 Subject: [PATCH] Rescue and skip error in optional_targets - #103 --- .../apis/notification_api.rb | 9 +++++++-- spec/concerns/apis/notification_api_spec.rb | 18 ++++++++++++++++++ .../lib/custom_optional_targets/raise_error.rb | 14 ++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 spec/rails_app/lib/custom_optional_targets/raise_error.rb diff --git a/lib/activity_notification/apis/notification_api.rb b/lib/activity_notification/apis/notification_api.rb index 55ba5118..1a67c26b 100644 --- a/lib/activity_notification/apis/notification_api.rb +++ b/lib/activity_notification/apis/notification_api.rb @@ -604,8 +604,13 @@ def publish_to_optional_targets(options = {}) notifiable.optional_targets(target.to_resources_name, key).map { |optional_target| optional_target_name = optional_target.to_optional_target_name if optional_target_subscribed?(optional_target_name) - optional_target.notify(self, options[optional_target_name] || {}) - [optional_target_name, true] + begin + optional_target.notify(self, options[optional_target_name] || {}) + [optional_target_name, true] + rescue => e + Rails.logger.error(e) + [optional_target_name, e] + end else [optional_target_name, false] end diff --git a/spec/concerns/apis/notification_api_spec.rb b/spec/concerns/apis/notification_api_spec.rb index 65d0406c..31480117 100644 --- a/spec/concerns/apis/notification_api_spec.rb +++ b/spec/concerns/apis/notification_api_spec.rb @@ -123,6 +123,24 @@ end end end + + context "when some optional targets raise error" do + before do + require 'custom_optional_targets/raise_error' + @optional_target = CustomOptionalTarget::RaiseError.new + @current_optional_target = Comment._optional_targets[:users] + Comment.acts_as_notifiable :users, optional_targets: ->{ [@optional_target] } + end + + after do + Comment._optional_targets[:users] = @current_optional_target + end + + it "generates notifications even if some optional targets raise error" do + notifications = described_class.notify(:users, @comment_2) + expect(notifications.size).to eq(2) + end + end end describe ".notify_later" do diff --git a/spec/rails_app/lib/custom_optional_targets/raise_error.rb b/spec/rails_app/lib/custom_optional_targets/raise_error.rb new file mode 100644 index 00000000..37830222 --- /dev/null +++ b/spec/rails_app/lib/custom_optional_targets/raise_error.rb @@ -0,0 +1,14 @@ +module CustomOptionalTarget + # Optional target implementation to raise error. + class RaiseError < ActivityNotification::OptionalTarget::Base + def initialize_target(options = {}) + @raise_error = options[:raise_error] == false ? false : true + end + + def notify(notification, options = {}) + if @raise_error + raise 'Intentional RuntimeError in CustomOptionalTarget::RaiseError' + end + end + end +end \ No newline at end of file