summaryrefslogtreecommitdiff
path: root/spec/jobs
diff options
context:
space:
mode:
authorNicolò€ Rebughini <nicolo.rebughini@gmail.com>2021-02-26 10:06:09 +0100
committerNicolò€ Rebughini <nicolo.rebughini@gmail.com>2021-02-26 15:19:34 +0100
commit580fa7b2c62dba52fce7fb87def9eb1254507534 (patch)
tree601a11ab51054b776737e009e9000e86cb5b6d70 /spec/jobs
parentcfcb35e8b1211d7aac66c709610c1cdc707c5db8 (diff)
Move subscription processing to background jobs
This change moves the processing of individual subscriptions to their own isolated jobs. The tasks of these individual jobs will be: - Deactivate/Cancel subscriptions pending one of those operations - Clear any past failed installment if it's configured to do so - Create a new installment for the subscription cycle - Enqueue a job to process any actionable installment for the subscription Given we've moved the concern of queueing the installment processing, that part can be removed safely from the main processor job. The final part of the change also touches the main processor job, whose task is now to collect any actionable subscription and any subscription with an actionable installment to enqueue them for individual processing.
Diffstat (limited to 'spec/jobs')
-rw-r--r--spec/jobs/solidus_subscriptions/process_subscription_job_spec.rb83
1 files changed, 83 insertions, 0 deletions
diff --git a/spec/jobs/solidus_subscriptions/process_subscription_job_spec.rb b/spec/jobs/solidus_subscriptions/process_subscription_job_spec.rb
new file mode 100644
index 0000000..1a3cf6f
--- /dev/null
+++ b/spec/jobs/solidus_subscriptions/process_subscription_job_spec.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+RSpec.describe SolidusSubscriptions::ProcessSubscriptionJob do
+ context 'when clear_past_installments is enabled' do
+ it 'voids the actionable date of the unfulfilled installments' do
+ stub_config(clear_past_installments: true)
+ subscription = create(:subscription)
+ unfulfilled_installment = create(:installment, :failed, subscription: subscription)
+
+ described_class.perform_now(subscription)
+
+ expect(unfulfilled_installment.reload.actionable_date).to eq(nil)
+ end
+ end
+
+ context 'when the subscription is actionable' do
+ it 'resets the successive_skip_count' do
+ subscription = create(:subscription, :actionable, successive_skip_count: 3)
+
+ described_class.perform_now(subscription)
+
+ expect(subscription.reload.successive_skip_count).to eq(0)
+ end
+
+ it 'creates a new installment' do
+ subscription = create(:subscription, :actionable)
+
+ described_class.perform_now(subscription)
+
+ expect(subscription.installments.count).to eq(1)
+ end
+
+ it 'advances the actionable date' do
+ subscription = create(:subscription, :actionable)
+ subscription.update_columns(interval_length: 1, interval_units: 'week')
+ old_actionable_date = subscription.reload.actionable_date
+
+ described_class.perform_now(subscription)
+
+ expect(subscription.reload.actionable_date.to_date).to eq((old_actionable_date + 1.week).to_date)
+ end
+ end
+
+ context 'when the subscription is pending cancellation' do
+ it 'cancels the subscription' do
+ subscription = create(
+ :subscription,
+ :actionable,
+ :pending_cancellation,
+ )
+ described_class.perform_now(subscription)
+
+ expect(subscription.reload.state).to eq('canceled')
+ end
+ end
+
+ context 'when the subscription is pending of deactivation' do
+ it 'deactivates the subscription' do
+ subscription = create(
+ :subscription,
+ :actionable,
+ interval_units: 'week',
+ interval_length: 2,
+ end_date: 3.days.from_now,
+ )
+ described_class.perform_now(subscription)
+
+ expect(subscription.reload.state).to eq('inactive')
+ end
+ end
+
+ it 'schedules all the subscription actionable installments for processing' do
+ subscription = create(:subscription, :actionable)
+ unfulfilled_installment = create(:installment, :failed, subscription: subscription)
+
+ described_class.perform_now(subscription)
+
+ new_installment = subscription.reload.installments.last
+ [unfulfilled_installment, new_installment].each do |installment|
+ expect(SolidusSubscriptions::ProcessInstallmentJob).to have_been_enqueued.with(installment)
+ end
+ end
+end