summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Desantis <desa.alessandro@gmail.com>2020-11-27 17:55:00 +0100
committerAlessandro Desantis <desa.alessandro@gmail.com>2021-01-30 15:23:41 +0100
commit784c1f07c61964c1a05549bffb0a709763bcf2d6 (patch)
treeb0f8523e29ef717d36c8ec338cfda11dbc091cf8
parent2836765c00abc1ba76793ad88c07a3d89a44d672 (diff)
Pass one installment at a time to dispatcher classes
-rw-r--r--.rubocop.yml3
-rw-r--r--app/services/solidus_subscriptions/checkout.rb8
-rw-r--r--app/services/solidus_subscriptions/dispatcher/base.rb13
-rw-r--r--app/services/solidus_subscriptions/dispatcher/failure_dispatcher.rb5
-rw-r--r--app/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb3
-rw-r--r--app/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb9
-rw-r--r--app/services/solidus_subscriptions/dispatcher/success_dispatcher.rb9
-rw-r--r--app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb4
-rw-r--r--spec/services/solidus_subscriptions/checkout_spec.rb2
-rw-r--r--spec/services/solidus_subscriptions/dispatcher/dispatcher_spec.rb11
-rw-r--r--spec/services/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb12
-rw-r--r--spec/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb9
-rw-r--r--spec/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb20
-rw-r--r--spec/services/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb16
-rw-r--r--spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb12
15 files changed, 56 insertions, 80 deletions
diff --git a/.rubocop.yml b/.rubocop.yml
index fcd4bc4..97c9838 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -7,3 +7,6 @@ RSpec/DescribeClass:
Exclude:
- spec/requests/**/*
- spec/features/**/*
+
+Rails/SkipsModelValidations:
+ Enabled: false
diff --git a/app/services/solidus_subscriptions/checkout.rb b/app/services/solidus_subscriptions/checkout.rb
index e348547..83fc35c 100644
--- a/app/services/solidus_subscriptions/checkout.rb
+++ b/app/services/solidus_subscriptions/checkout.rb
@@ -15,15 +15,15 @@ module SolidusSubscriptions
populate_order(order)
finalize_order(order)
- SolidusSubscriptions.configuration.success_dispatcher_class.new([installment], order).dispatch
+ SolidusSubscriptions.configuration.success_dispatcher_class.new(installment, order).dispatch
rescue StateMachines::InvalidTransition
if order.payments.any?(&:failed?)
- SolidusSubscriptions.configuration.payment_failed_dispatcher_class.new([installment], order).dispatch
+ SolidusSubscriptions.configuration.payment_failed_dispatcher_class.new(installment, order).dispatch
else
- SolidusSubscriptions.configuration.failure_dispatcher_class.new([installment], order).dispatch
+ SolidusSubscriptions.configuration.failure_dispatcher_class.new(installment, order).dispatch
end
rescue ::Spree::Order::InsufficientStock
- SolidusSubscriptions.configuration.out_of_stock_dispatcher_class.new([installment], order).dispatch
+ SolidusSubscriptions.configuration.out_of_stock_dispatcher_class.new(installment, order).dispatch
end
order
diff --git a/app/services/solidus_subscriptions/dispatcher/base.rb b/app/services/solidus_subscriptions/dispatcher/base.rb
index 84b8710..30c5034 100644
--- a/app/services/solidus_subscriptions/dispatcher/base.rb
+++ b/app/services/solidus_subscriptions/dispatcher/base.rb
@@ -3,17 +3,10 @@
module SolidusSubscriptions
module Dispatcher
class Base
- attr_reader :installments, :order
+ attr_reader :installment, :order
- # Returns a new instance of this dispatcher.
- #
- # @param installments [Array<SolidusSubscriptions::Installment>] The installments to process
- # with this dispatcher
- # @param order [Spree::Order] The order that was generated as a result of these installments
- #
- # @return [SolidusSubscriptions::Dispatcher]
- def initialize(installments, order = nil)
- @installments = installments
+ def initialize(installment, order)
+ @installment = installment
@order = order
end
diff --git a/app/services/solidus_subscriptions/dispatcher/failure_dispatcher.rb b/app/services/solidus_subscriptions/dispatcher/failure_dispatcher.rb
index 286a4c9..54f8f2b 100644
--- a/app/services/solidus_subscriptions/dispatcher/failure_dispatcher.rb
+++ b/app/services/solidus_subscriptions/dispatcher/failure_dispatcher.rb
@@ -1,15 +1,12 @@
# frozen_string_literal: true
-# Handles failed installments.
module SolidusSubscriptions
module Dispatcher
class FailureDispatcher < Base
def dispatch
order.touch(:completed_at)
order.cancel
- installments.each do |installment|
- installment.failed!(order)
- end
+ installment.failed!(order)
end
end
end
diff --git a/app/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb b/app/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb
index ef79f84..fe3e701 100644
--- a/app/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb
+++ b/app/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher.rb
@@ -1,11 +1,10 @@
# frozen_string_literal: true
-# Handles installments that cannot be processed for lack of stock.
module SolidusSubscriptions
module Dispatcher
class OutOfStockDispatcher < Base
def dispatch
- installments.each(&:out_of_stock)
+ installment.out_of_stock
end
end
end
diff --git a/app/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb b/app/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb
index 74bee88..a56332e 100644
--- a/app/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb
+++ b/app/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb
@@ -1,19 +1,16 @@
# frozen_string_literal: true
-# Handles payment failures for subscription installments.
module SolidusSubscriptions
module Dispatcher
class PaymentFailedDispatcher < Base
def dispatch
order.touch(:completed_at)
order.cancel
- installments.each do |installment|
- installment.payment_failed!(order)
- end
+ installment.payment_failed!(order)
::Spree::Event.fire(
- 'solidus_subscriptions.installments_failed_payment',
- installments: installments,
+ 'solidus_subscriptions.installment_failed_payment',
+ installment: installment,
order: order,
)
end
diff --git a/app/services/solidus_subscriptions/dispatcher/success_dispatcher.rb b/app/services/solidus_subscriptions/dispatcher/success_dispatcher.rb
index 78563a4..0ae71dc 100644
--- a/app/services/solidus_subscriptions/dispatcher/success_dispatcher.rb
+++ b/app/services/solidus_subscriptions/dispatcher/success_dispatcher.rb
@@ -1,17 +1,14 @@
# frozen_string_literal: true
-# Handles installments that are processed successfully.
module SolidusSubscriptions
module Dispatcher
class SuccessDispatcher < Base
def dispatch
- installments.each do |installment|
- installment.success!(order)
- end
+ installment.success!(order)
::Spree::Event.fire(
- 'solidus_subscriptions.installments_succeeded',
- installments: installments,
+ 'solidus_subscriptions.installment_succeeded',
+ installment: installment,
order: order,
)
end
diff --git a/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb b/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb
index aa9dfa4..3454003 100644
--- a/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb
+++ b/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb
@@ -6,8 +6,8 @@ module SolidusSubscriptions
event_action :report_subscription_cancellation, event_name: 'solidus_subscriptions.subscription_canceled'
event_action :report_subscription_ending, event_name: 'solidus_subscriptions.subscription_ended'
- event_action :report_payment_success, event_name: 'solidus_subscriptions.installments_succeeded'
- event_action :report_payment_failure, event_name: 'solidus_subscriptions.installments_failed_payment'
+ event_action :report_payment_success, event_name: 'solidus_subscriptions.installment_succeeded'
+ event_action :report_payment_failure, event_name: 'solidus_subscriptions.installment_failed_payment'
event_action :report_payment_method_change, event_name: 'solidus_subscriptions.subscription_payment_method_changed'
def report_subscription_cancellation(event)
diff --git a/spec/services/solidus_subscriptions/checkout_spec.rb b/spec/services/solidus_subscriptions/checkout_spec.rb
index f35b8c0..2a83d9b 100644
--- a/spec/services/solidus_subscriptions/checkout_spec.rb
+++ b/spec/services/solidus_subscriptions/checkout_spec.rb
@@ -114,7 +114,7 @@ RSpec.describe SolidusSubscriptions::Checkout, :checkout do
def stub_dispatcher(klass, installment)
instance_spy(klass).tap do |dispatcher|
allow(klass).to receive(:new).with(
- [installment],
+ installment,
an_instance_of(Spree::Order)
).and_return(dispatcher)
end
diff --git a/spec/services/solidus_subscriptions/dispatcher/dispatcher_spec.rb b/spec/services/solidus_subscriptions/dispatcher/dispatcher_spec.rb
deleted file mode 100644
index 7590422..0000000
--- a/spec/services/solidus_subscriptions/dispatcher/dispatcher_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-RSpec.describe SolidusSubscriptions::Dispatcher::Base do
- describe '#dispatch' do
- it 'raises a NotImplementedError' do
- dispatcher = described_class.new([])
-
- expect {
- dispatcher.dispatch
- }.to raise_error(NotImplementedError)
- end
- end
-end
diff --git a/spec/services/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb b/spec/services/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb
index 55a883a..f247237 100644
--- a/spec/services/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb
+++ b/spec/services/solidus_subscriptions/dispatcher/failure_dispatcher_spec.rb
@@ -1,13 +1,13 @@
RSpec.describe SolidusSubscriptions::Dispatcher::FailureDispatcher do
describe '#dispatch' do
- it 'marks all the installments as failed' do
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ it 'marks the installment as failed' do
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
- expect(installments).to all(have_received(:failed!).with(order).once)
+ expect(installment).to have_received(:failed!).with(order)
end
it 'cancels the order' do
@@ -15,10 +15,10 @@ RSpec.describe SolidusSubscriptions::Dispatcher::FailureDispatcher do
skip 'Orders in `cart` state cannot be canceled starting from Solidus 2.11.'
end
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
expect(order.state).to eq('canceled')
diff --git a/spec/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb b/spec/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb
index 4ed0a53..abb8343 100644
--- a/spec/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb
+++ b/spec/services/solidus_subscriptions/dispatcher/out_of_stock_dispatcher_spec.rb
@@ -1,12 +1,13 @@
RSpec.describe SolidusSubscriptions::Dispatcher::OutOfStockDispatcher do
describe '#dispatch' do
- it 'marks all the installments as out of stock' do
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ it 'marks the installment as out of stock' do
+ installment = instance_spy(SolidusSubscriptions::Installment)
+ order = build_stubbed(:order)
- dispatcher = described_class.new(installments)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
- expect(installments).to all(have_received(:out_of_stock).once)
+ expect(installment).to have_received(:out_of_stock)
end
end
end
diff --git a/spec/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb b/spec/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb
index 9979448..0a222d4 100644
--- a/spec/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb
+++ b/spec/services/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb
@@ -1,13 +1,13 @@
RSpec.describe SolidusSubscriptions::Dispatcher::PaymentFailedDispatcher do
describe '#dispatch' do
- it 'marks all the installments as payment_failed' do
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ it 'marks the installment as payment_failed' do
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
- expect(installments).to all(have_received(:payment_failed!).with(order).once)
+ expect(installment).to have_received(:payment_failed!).with(order)
end
it 'cancels the order' do
@@ -15,10 +15,10 @@ RSpec.describe SolidusSubscriptions::Dispatcher::PaymentFailedDispatcher do
skip 'Orders in `cart` state cannot be canceled starting from Solidus 2.11.'
end
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
expect(order.state).to eq('canceled')
@@ -26,15 +26,15 @@ RSpec.describe SolidusSubscriptions::Dispatcher::PaymentFailedDispatcher do
it 'fires an installments_failed_payment event' do
stub_const('Spree::Event', class_spy(Spree::Event))
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
expect(Spree::Event).to have_received(:fire).with(
- 'solidus_subscriptions.installments_failed_payment',
- installments: installments,
+ 'solidus_subscriptions.installment_failed_payment',
+ installment: installment,
order: order,
)
end
diff --git a/spec/services/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb b/spec/services/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb
index aa1f72f..6a71800 100644
--- a/spec/services/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb
+++ b/spec/services/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb
@@ -1,26 +1,26 @@
RSpec.describe SolidusSubscriptions::Dispatcher::SuccessDispatcher do
describe '#dispatch' do
- it 'marks all the installments as success' do
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ it 'marks the installment as success' do
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
- expect(installments).to all(have_received(:success!).with(order).once)
+ expect(installment).to have_received(:success!).with(order)
end
it 'fires an installments_succeeded event' do
stub_const('Spree::Event', class_spy(Spree::Event))
- installments = Array.new(2) { instance_spy(SolidusSubscriptions::Installment) }
+ installment = instance_spy(SolidusSubscriptions::Installment)
order = create(:order_with_line_items)
- dispatcher = described_class.new(installments, order)
+ dispatcher = described_class.new(installment, order)
dispatcher.dispatch
expect(Spree::Event).to have_received(:fire).with(
- 'solidus_subscriptions.installments_succeeded',
- installments: installments,
+ 'solidus_subscriptions.installment_succeeded',
+ installment: installment,
order: order,
)
end
diff --git a/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb b/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb
index 572913b..11ada2c 100644
--- a/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb
+++ b/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb
@@ -29,10 +29,10 @@ RSpec.describe SolidusSubscriptions::ChurnBusterSubscriber do
allow(SolidusSubscriptions).to receive(:churn_buster).and_return(churn_buster)
order = build_stubbed(:order)
- installments = build_list(:installment, 2)
+ installment = build_stubbed(:installment)
Spree::Event.fire(
- 'solidus_subscriptions.installments_succeeded',
- installments: installments,
+ 'solidus_subscriptions.installment_succeeded',
+ installment: installment,
order: order,
)
@@ -46,10 +46,10 @@ RSpec.describe SolidusSubscriptions::ChurnBusterSubscriber do
allow(SolidusSubscriptions).to receive(:churn_buster).and_return(churn_buster)
order = build_stubbed(:order)
- installments = build_list(:installment, 2)
+ installment = build_stubbed(:installment)
Spree::Event.fire(
- 'solidus_subscriptions.installments_failed_payment',
- installments: installments,
+ 'solidus_subscriptions.installment_failed_payment',
+ installment: installment,
order: order,
)