diff options
author | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-10-05 13:55:55 +0200 |
---|---|---|
committer | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-10-05 13:55:55 +0200 |
commit | 91ab2cc5a068d3dce01ec20b256d9bd540e4d055 (patch) | |
tree | e7520929521efc4e93abb42516d504da3d1761d1 | |
parent | fa5876cca9cabd3cf78ae16809a19f3ebab4bfb9 (diff) |
Track additional events for subscription updates
3 files changed, 91 insertions, 19 deletions
diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb index e8aff4c..0c41604 100644 --- a/app/models/solidus_subscriptions/subscription.rb +++ b/app/models/solidus_subscriptions/subscription.rb @@ -33,6 +33,7 @@ module SolidusSubscriptions before_validation :set_payment_method after_create :emit_event_for_creation before_update :update_actionable_date_if_interval_changed + after_update :emit_events_for_update # Find all subscriptions that are "actionable"; that is, ones that have an # actionable_date in the past and are not invalid or canceled. @@ -294,5 +295,28 @@ module SolidusSubscriptions subscription: self, ) end + + def emit_events_for_update + if previous_changes.key?('interval_length') || previous_changes.key?('interval_units') + ::Spree::Event.fire( + 'solidus_subscriptions.subscription_frequency_changed', + subscription: self, + ) + end + + if previous_changes.key?('shipping_address_id') + ::Spree::Event.fire( + 'solidus_subscriptions.subscription_shipping_address_changed', + subscription: self, + ) + end + + if previous_changes.key?('billing_address_id') + ::Spree::Event.fire( + 'solidus_subscriptions.subscription_billing_address_changed', + subscription: self, + ) + end + end end end diff --git a/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb b/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb index 1a6ec7c..93b5ba5 100644 --- a/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb +++ b/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb @@ -9,6 +9,9 @@ module SolidusSubscriptions event_action :track_subscription_canceled, event_name: 'solidus_subscriptions.subscription_canceled' event_action :track_subscription_ended, event_name: 'solidus_subscriptions.subscription_ended' event_action :track_subscription_repopulated, event_name: 'solidus_subscriptions.subscription_repopulated' + event_action :track_subscription_shipping_address_changed, event_name: 'solidus_subscriptions.subscription_shipping_address_changed' + event_action :track_subscription_billing_address_changed, event_name: 'solidus_subscriptions.subscription_billing_address_changed' + event_action :track_subscription_frequency_changed, event_name: 'solidus_subscriptions.subscription_frequency_changed' def track_subscription_created(event) event.payload.fetch(:subscription).events.create!( @@ -44,5 +47,26 @@ module SolidusSubscriptions details: event.payload.fetch(:subscription).as_json, ) end + + def track_subscription_shipping_address_changed(event) + event.payload.fetch(:subscription).events.create!( + event_type: 'subscription_shipping_address_changed', + details: event.payload.fetch(:subscription).as_json, + ) + end + + def track_subscription_billing_address_changed(event) + event.payload.fetch(:subscription).events.create!( + event_type: 'subscription_billing_address_changed', + details: event.payload.fetch(:subscription).as_json, + ) + end + + def track_subscription_frequency_changed(event) + event.payload.fetch(:subscription).events.create!( + event_type: 'subscription_frequency_changed', + details: event.payload.fetch(:subscription).as_json, + ) + end end end diff --git a/spec/models/solidus_subscriptions/subscription_spec.rb b/spec/models/solidus_subscriptions/subscription_spec.rb index 54a1cba..800c713 100644 --- a/spec/models/solidus_subscriptions/subscription_spec.rb +++ b/spec/models/solidus_subscriptions/subscription_spec.rb @@ -7,32 +7,56 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do it { is_expected.to validate_numericality_of(:skip_count).is_greater_than_or_equal_to(0) } it { is_expected.to validate_numericality_of(:successive_skip_count).is_greater_than_or_equal_to(0) } - it { is_expected.to accept_nested_attributes_for :line_items } + it { is_expected.to accept_nested_attributes_for(:line_items) } - describe '#save' do - context 'when the subscription is new' do - it 'tracks a subscription_created event' do - subscription = build(:subscription) + describe 'creating a subscription' do + it 'tracks the creation' do + stub_const('Spree::Event', class_spy(Spree::Event)) - subscription.save! + subscription = create(:subscription) - expect(subscription.events.last).to have_attributes( - event_type: 'subscription_created', - details: a_hash_including('id' => subscription.id), - ) - end + expect(Spree::Event).to have_received(:fire).with( + 'solidus_subscriptions.subscription_created', + subscription: subscription, + ) end + end - context 'when the subscription is persisted' do - it 'does not track an event' do - subscription = create(:subscription) + describe 'updating a subscription' do + it 'tracks interval changes' do + stub_const('Spree::Event', class_spy(Spree::Event)) + subscription = create(:subscription) - subscription.end_date = Time.zone.tomorrow + subscription.update!(interval_length: subscription.interval_length + 1) - expect { - subscription.save! - }.not_to change(subscription.events, :count) - end + expect(Spree::Event).to have_received(:fire).with( + 'solidus_subscriptions.subscription_frequency_changed', + subscription: subscription, + ) + end + + it 'tracks shipping address changes' do + stub_const('Spree::Event', class_spy(Spree::Event)) + subscription = create(:subscription) + + subscription.update!(shipping_address: create(:address)) + + expect(Spree::Event).to have_received(:fire).with( + 'solidus_subscriptions.subscription_shipping_address_changed', + subscription: subscription, + ) + end + + it 'tracks billing address changes' do + stub_const('Spree::Event', class_spy(Spree::Event)) + subscription = create(:subscription) + + subscription.update!(billing_address: create(:address)) + + expect(Spree::Event).to have_received(:fire).with( + 'solidus_subscriptions.subscription_billing_address_changed', + subscription: subscription, + ) end end |