From 565e8f737146a51b160a3d00c2abd07bc932ca2d Mon Sep 17 00:00:00 2001 From: Sean Date: Wed, 7 Apr 2021 09:29:59 -0500 Subject: Reload order during finalize action If you decorate the subscription generator to change the order in any way (for instance, to associate the order to the subscription), that change is not persisted in the rest of the finalize action, as the order has already been loaded by that point. This can cause massive headaches with validations, so to fix it I've added a reload method before super, so we can ensure that the order is up-to-date before continuing. This also means that subscription_line_items interval is nil, since activating the subscription sets it to nil. So in the spec we're fetching the interval from the subscription instead. --- .../solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb | 2 ++ .../spree/order/finalize_creates_subscriptions_spec.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb b/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb index 568e5a8..3f83b82 100644 --- a/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb +++ b/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb @@ -13,6 +13,8 @@ module SolidusSubscriptions SolidusSubscriptions::SubscriptionGenerator.activate(line_items) end + reload + super end end diff --git a/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb b/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb index 121afbf..0ca34d9 100644 --- a/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb +++ b/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb @@ -8,7 +8,7 @@ RSpec.describe SolidusSubscriptions::Spree::Order::FinalizeCreatesSubscriptions let(:order) { create :order, :with_subscription_line_items } let(:subscription_line_item) { order.subscription_line_items.last } - let(:expected_actionable_date) { Time.zone.today + subscription_line_item.interval } + let(:expected_actionable_date) { Time.zone.today + subscription_line_item.subscription.interval } around { |e| Timecop.freeze { e.run } } -- cgit v1.2.3