summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrendan Deere <brendan@stembolt.com>2016-10-03 11:24:10 -0700
committerBrendan Deere <brendan@stembolt.com>2016-10-04 13:15:14 -0700
commite00c9c5ffa8ece1720bd8f8c7b8de8f6322c1388 (patch)
tree781564560a2827011fad67e886acf55ef4e4e3ad
parent16924ab31d2aa6f899b72db887af38e28d47aedf (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
-rw-r--r--app/models/solidus_subscriptions/subscription.rb1
-rw-r--r--lib/solidus_subscriptions/processor.rb1
-rw-r--r--lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb5
-rw-r--r--spec/lib/solidus_subscriptions/processor_spec.rb15
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