diff options
author | Brendan Deere <brendan@stembolt.com> | 2016-10-03 11:24:10 -0700 |
---|---|---|
committer | Brendan Deere <brendan@stembolt.com> | 2016-10-04 13:15:14 -0700 |
commit | e00c9c5ffa8ece1720bd8f8c7b8de8f6322c1388 (patch) | |
tree | 781564560a2827011fad67e886acf55ef4e4e3ad | |
parent | 16924ab31d2aa6f899b72db887af38e28d47aedf (diff) |
Processor cancels subs
If the processor processed a subscription in the pending_cancellation
state, it cancels the subscription after creating one last installment
for it
4 files changed, 20 insertions, 2 deletions
diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb index ca16560..4511714 100644 --- a/app/models/solidus_subscriptions/subscription.rb +++ b/app/models/solidus_subscriptions/subscription.rb @@ -73,6 +73,7 @@ module SolidusSubscriptions # :pending_cancellation state instead of being canceled. Susbcriptions # pending cancellation will still be processed. def can_be_canceled? + return true if actionable_date.nil? (actionable_date - Config.minimum_cancellation_notice).future? end diff --git a/lib/solidus_subscriptions/processor.rb b/lib/solidus_subscriptions/processor.rb index f95e16f..4c4894e 100644 --- a/lib/solidus_subscriptions/processor.rb +++ b/lib/solidus_subscriptions/processor.rb @@ -83,6 +83,7 @@ module SolidusSubscriptions subscriptions_by_id.fetch(user.id, []).map do |sub| ActiveRecord::Base.transaction do sub.advance_actionable_date + sub.cancel! if sub.pending_cancellation? sub.installments.create! end end diff --git a/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb b/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb index 92ecb77..e4f3cdc 100644 --- a/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb @@ -23,6 +23,11 @@ FactoryGirl.define do actionable_date { Time.zone.now.tomorrow } end + trait(:pending_cancellation) do + actionable + state { 'pending_cancellation' } + end + trait(:canceled) { state 'canceled' } trait(:inactive) { state 'inactive' } end diff --git a/spec/lib/solidus_subscriptions/processor_spec.rb b/spec/lib/solidus_subscriptions/processor_spec.rb index fdf1d51..475dda9 100644 --- a/spec/lib/solidus_subscriptions/processor_spec.rb +++ b/spec/lib/solidus_subscriptions/processor_spec.rb @@ -7,6 +7,10 @@ RSpec.describe SolidusSubscriptions::Processor, :checkout do end let!(:actionable_subscriptions) { create_list(:subscription, 2, :actionable, user: user) } + let!(:pending_cancellation_subscriptions) do + create_list(:subscription, 2, :pending_cancellation, user: user) + end + let!(:future_subscriptions) { create_list(:subscription, 2, :not_actionable) } let!(:canceled_subscriptions) { create_list(:subscription, 2, :canceled) } let!(:inactive) { create_list(:subscription, 2, :inactive) } @@ -27,7 +31,8 @@ RSpec.describe SolidusSubscriptions::Processor, :checkout do shared_examples 'a subscription order' do let(:order_variant_ids) { Spree::Order.last.variant_ids } let(:expected_ids) do - subs_ids = actionable_subscriptions.map { |s| s.line_item.subscribable_id } + subs = actionable_subscriptions + pending_cancellation_subscriptions + subs_ids = subs.map { |s| s.line_item.subscribable_id } inst_ids = failed_installments.map { |i| i.subscription.line_item.subscribable_id } subs_ids + inst_ids @@ -52,11 +57,17 @@ RSpec.describe SolidusSubscriptions::Processor, :checkout do to change { subscription.reload.actionable_date }. from(current_date).to(expected_date) end + + it 'cancels subscriptions pending cancellation' do + subs = pending_cancellation_subscriptions.first + expect { subject }. + to change { subs.reload.state }. + from('pending_cancellation').to('canceled') + end end describe '.run' do subject { described_class.run } - it_behaves_like 'a subscription order' end |