diff options
author | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-11-27 17:55:00 +0100 |
---|---|---|
committer | Alessandro Desantis <desa.alessandro@gmail.com> | 2021-01-30 15:23:41 +0100 |
commit | 784c1f07c61964c1a05549bffb0a709763bcf2d6 (patch) | |
tree | b0f8523e29ef717d36c8ec338cfda11dbc091cf8 | |
parent | 2836765c00abc1ba76793ad88c07a3d89a44d672 (diff) |
Pass one installment at a time to dispatcher classes
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, ) |