diff options
author | Sean <seand7565@gmail.com> | 2020-12-11 10:58:20 -0600 |
---|---|---|
committer | Sean <seand7565@gmail.com> | 2020-12-14 09:26:57 -0600 |
commit | 595891ac6a7f6641b04f5cd4e1ecaa21c0ed7eb6 (patch) | |
tree | e737b463dfcba8f726e21b9c3e3465f6a2b4f96f | |
parent | d4743d79536be77bcf1fa0fb5ff055ba6145396a (diff) |
Update cancel method on subscription to respect minimum date
Previously, the cancel method would check if the minimum
cancellation date minus the current day is in the future before
cancelling.
However, that adds one day to whatever minimum cancellation date
that you set - if you set one day, you would expect the user not
to be able to cancel on the day that the subscription ships, but
because the method checks if the date is in the future, the user
can't cancel the day of, or the day before.
This checks if the date is in the future OR if it's today, which
removes the added day from the minimum_cancellation_notice.
Also this sets the default to 0.days, as 1.day is pretty arbitrary
Lastly, this locks canonical-rails down to 0.2.9, because Solidus
still uses the `whitelisted_attributes` method, which was renamed
in 0.2.10
-rw-r--r-- | Gemfile | 2 | ||||
-rw-r--r-- | README.md | 12 | ||||
-rw-r--r-- | app/models/solidus_subscriptions/subscription.rb | 3 | ||||
-rw-r--r-- | lib/solidus_subscriptions/configuration.rb | 2 | ||||
-rw-r--r-- | spec/models/solidus_subscriptions/subscription_spec.rb | 16 |
5 files changed, 33 insertions, 2 deletions
@@ -14,6 +14,8 @@ gem 'rails', '>0.a' # Provides basic authentication functionality for testing parts of your engine gem 'solidus_auth_devise' +gem 'canonical-rails', '0.2.9' + case ENV['DB'] when 'mysql' gem 'mysql2' @@ -130,6 +130,18 @@ SolidusSubscriptions.configure do |config| end ``` +### Minimum cancellation notice + +The minimum cancellation notice is set to 0 days by default - users can cancel their subscription whenever they like. To change this, you can configure the extension like this: + +```ruby +SolidusSubscriptions.configure do |config| + # ... + + config.minimum_cancellation_notice = 10.days +end +``` + ## Development ### Testing the extension diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb index 3028b7f..4168973 100644 --- a/app/models/solidus_subscriptions/subscription.rb +++ b/app/models/solidus_subscriptions/subscription.rb @@ -150,7 +150,8 @@ module SolidusSubscriptions def can_be_canceled? return true if actionable_date.nil? - (actionable_date - SolidusSubscriptions.configuration.minimum_cancellation_notice).future? + cancel_by = actionable_date - SolidusSubscriptions.configuration.minimum_cancellation_notice + cancel_by.future? || cancel_by.today? end def skip(check_skip_limits: true) diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb index f09740b..52c8fd4 100644 --- a/lib/solidus_subscriptions/configuration.rb +++ b/lib/solidus_subscriptions/configuration.rb @@ -43,7 +43,7 @@ module SolidusSubscriptions end def minimum_cancellation_notice - @minimum_cancellation_notice ||= 1.day + @minimum_cancellation_notice ||= 0.days end def processing_queue diff --git a/spec/models/solidus_subscriptions/subscription_spec.rb b/spec/models/solidus_subscriptions/subscription_spec.rb index d7ec367..5d855db 100644 --- a/spec/models/solidus_subscriptions/subscription_spec.rb +++ b/spec/models/solidus_subscriptions/subscription_spec.rb @@ -87,8 +87,13 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do around { |e| Timecop.freeze { e.run } } + before do + allow(SolidusSubscriptions.configuration).to receive(:minimum_cancellation_notice) { minimum_cancellation_notice } + end + context 'the subscription can be canceled' do let(:actionable_date) { 1.month.from_now } + let(:minimum_cancellation_notice) { 1.day } it 'is canceled' do subject @@ -103,6 +108,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context 'the subscription cannot be canceled' do let(:actionable_date) { Date.current } + let(:minimum_cancellation_notice) { 1.day } it 'is pending cancelation' do subject @@ -114,6 +120,16 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do expect(subscription.events.last).to have_attributes(event_type: 'subscription_canceled') end end + + context 'when the minimum cancellation date is 0.days' do + let(:actionable_date) { Date.current } + let(:minimum_cancellation_notice) { 0.days } + + it 'is canceled' do + subject + expect(subscription).to be_canceled + end + end end describe '#skip' do |