summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean <seand7565@gmail.com>2020-12-11 10:58:20 -0600
committerSean <seand7565@gmail.com>2020-12-14 09:26:57 -0600
commit595891ac6a7f6641b04f5cd4e1ecaa21c0ed7eb6 (patch)
treee737b463dfcba8f726e21b9c3e3465f6a2b4f96f
parentd4743d79536be77bcf1fa0fb5ff055ba6145396a (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--Gemfile2
-rw-r--r--README.md12
-rw-r--r--app/models/solidus_subscriptions/subscription.rb3
-rw-r--r--lib/solidus_subscriptions/configuration.rb2
-rw-r--r--spec/models/solidus_subscriptions/subscription_spec.rb16
5 files changed, 33 insertions, 2 deletions
diff --git a/Gemfile b/Gemfile
index 24c83d8..185c420 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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'
diff --git a/README.md b/README.md
index 3d8a3b9..2705c2d 100644
--- a/README.md
+++ b/README.md
@@ -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