summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/jobs/solidus_subscriptions/process_installment_job.rb2
-rw-r--r--db/migrate/20210323165714_update_promotion_rule_names.rb22
-rw-r--r--lib/generators/solidus_subscriptions/install/templates/initializer.rb7
-rw-r--r--lib/solidus_subscriptions/configuration.rb2
-rw-r--r--spec/jobs/solidus_subscriptions/process_installment_job_spec.rb12
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