summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Desantis <desa.alessandro@gmail.com>2020-10-05 16:42:03 +0200
committerGitHub <noreply@github.com>2020-10-05 16:42:03 +0200
commit26c3495544dd8a534bbe410279b70b42dba310c8 (patch)
treee7520929521efc4e93abb42516d504da3d1761d1
parentfa5876cca9cabd3cf78ae16809a19f3ebab4bfb9 (diff)
parent91ab2cc5a068d3dce01ec20b256d9bd540e4d055 (diff)
Merge pull request #156 from solidusio-contrib/aldesantis/additional-events
Track additional events for subscription updates
-rw-r--r--app/models/solidus_subscriptions/subscription.rb24
-rw-r--r--app/subscribers/solidus_subscriptions/event_storage_subscriber.rb24
-rw-r--r--spec/models/solidus_subscriptions/subscription_spec.rb62
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