summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Desantis <desa.alessandro@gmail.com>2020-12-14 17:04:47 +0100
committerGitHub <noreply@github.com>2020-12-14 17:04:47 +0100
commit982e340b73a63089907a3e68ebd7395f16892fa2 (patch)
treee737b463dfcba8f726e21b9c3e3465f6a2b4f96f
parentd4743d79536be77bcf1fa0fb5ff055ba6145396a (diff)
parent595891ac6a7f6641b04f5cd4e1ecaa21c0ed7eb6 (diff)
Merge pull request #178 from seand7565/fix_subscription_cancel
Update cancel method on subscription to respect minimum date
-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