diff options
5 files changed, 44 insertions, 1 deletions
diff --git a/app/jobs/solidus_subscriptions/process_installment_job.rb b/app/jobs/solidus_subscriptions/process_installment_job.rb index 127c787..53270e5 100644 --- a/app/jobs/solidus_subscriptions/process_installment_job.rb +++ b/app/jobs/solidus_subscriptions/process_installment_job.rb @@ -6,6 +6,8 @@ module SolidusSubscriptions def perform(installment) Checkout.new(installment).process + rescue StandardError => e + SolidusSubscriptions.configuration.processing_error_handler&.call(e) end end end diff --git a/db/migrate/20210323165714_update_promotion_rule_names.rb b/db/migrate/20210323165714_update_promotion_rule_names.rb new file mode 100644 index 0000000..f6ee6c2 --- /dev/null +++ b/db/migrate/20210323165714_update_promotion_rule_names.rb @@ -0,0 +1,22 @@ +class UpdatePromotionRuleNames < ActiveRecord::Migration[5.2] + TYPE_RENAMES = { + 'SolidusSubscriptions::SubscriptionPromotionRule' => 'SolidusSubscriptions::Promotion::Rules::SubscriptionCreationOrder', + 'SolidusSubscriptions::SubscriptionOrderPromotionRule' => 'SolidusSubscriptions::Promotion::Rules::SubscriptionInstallmentOrder', + }.freeze + + def change + reversible do |dir| + dir.up do + TYPE_RENAMES.each do |old_type, new_type| + Spree::PromotionRule.where(type: old_type).update(type: new_type) + end + end + + dir.down do + TYPE_RENAMES.each do |old_type, new_type| + Spree::PromotionRule.where(type: new_type).update(type: old_type) + end + end + end + end +end diff --git a/lib/generators/solidus_subscriptions/install/templates/initializer.rb b/lib/generators/solidus_subscriptions/install/templates/initializer.rb index 31e44b5..3632f08 100644 --- a/lib/generators/solidus_subscriptions/install/templates/initializer.rb +++ b/lib/generators/solidus_subscriptions/install/templates/initializer.rb @@ -26,6 +26,13 @@ SolidusSubscriptions.configure do |config| # failure cancel the subscription. # config.maximum_reprocessing_time = nil + # This custom error handler is called when a ProcessInstallmentJob `#perform` method fails. + # The rescued error can be managed as required via a Proc, such as one which logs the error + # on an error tracking system. + # Though not recommended due to the retry mechanisms built into this gem, the error can be + # re-raised if the default retry behaviour is required in ActiveJob. + # config.processing_error_handler = nil + # ========================================= Dispatchers ========================================== # # These dispatchers are pluggable. If you override any handlers, it is highly encouraged that you diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb index 536aad3..cbaec5c 100644 --- a/lib/solidus_subscriptions/configuration.rb +++ b/lib/solidus_subscriptions/configuration.rb @@ -4,7 +4,7 @@ module SolidusSubscriptions class Configuration attr_accessor( :maximum_total_skips, :maximum_reprocessing_time, :churn_buster_account_id, - :churn_buster_api_key, :clear_past_installments, + :churn_buster_api_key, :clear_past_installments, :processing_error_handler, ) attr_writer( diff --git a/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb b/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb index 01df9d4..658e252 100644 --- a/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb +++ b/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb @@ -10,4 +10,16 @@ RSpec.describe SolidusSubscriptions::ProcessInstallmentJob do expect(checkout).to have_received(:process) end + + context 'when handling #perform errors' do + it 'swallows error when a proc is not configured' do + expect { described_class.perform_now(nil) }.not_to raise_error(StandardError) + end + + it 'runs proc when a proc is configured' do + stub_config(processing_error_handler: proc { |e| raise e } ) + + expect { described_class.perform_now(nil) }.to raise_error(StandardError) + end + end end |