Skip to content

Commit 5c847a1

Browse files
committed
Refactor MergeableOrdersFinder
Changes the MergeableOrdersFinder interface to accept a single `context:` parameter instead of individual `user:`, `store:`, and `current_order:` parameters. Changes include: - Update MergeableOrdersFinder to extract user/store/order from context - Modify set_current_order to pass `context: self` to finder - Update documentation examples to reflect new context-based interface - Refactor specs to use context doubles with spree_current_user - Add frontend_viewable filter to maintain existing behavior Signed-off-by: Thukten Singye <[email protected]>
1 parent c9fdc95 commit 5c847a1

File tree

4 files changed

+25
-32
lines changed

4 files changed

+25
-32
lines changed

core/app/helpers/spree/core/controller_helpers/order.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,7 @@ def associate_user
4242
end
4343

4444
def set_current_order
45-
Spree::Config.mergeable_orders_finder_class.new(
46-
user: spree_current_user,
47-
store: current_store,
48-
current_order: current_order
49-
).call.find_each do |order|
45+
Spree::Config.mergeable_orders_finder_class.new(context: self).call.find_each do |order|
5046
current_order.merge!(order, spree_current_user)
5147
end
5248
end

core/app/models/spree/mergeable_orders_finder.rb

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ module Spree
88
#
99
# @example Custom finder for recent orders only
1010
# class RecentOrdersFinder
11-
# def initialize(user:, store:, current_order:)
12-
# @user = user
13-
# @store = store
14-
# @current_order = current_order
11+
# def initialize(context:)
12+
# @user = context.spree_current_user
13+
# @store = context.current_store
14+
# @current_order = context.current_order
1515
# end
1616
#
1717
# def call
@@ -23,21 +23,20 @@ module Spree
2323
#
2424
# Spree::Config.mergeable_orders_finder_class = RecentOrdersFinder
2525
class MergeableOrdersFinder
26-
# @param user [Spree::User] the user whose orders to find
27-
# @param store [Spree::Store] the current store
28-
# @param current_order [Spree::Order] the current session order
29-
def initialize(user:, store:, current_order:)
30-
@user = user
31-
@store = store
32-
@current_order = current_order
26+
# @param context [Object] an object that responds to spree_current_user,
27+
# current_store, and current_order (typically a controller)
28+
def initialize(context:)
29+
@user = context.spree_current_user
30+
@store = context.current_store
31+
@current_order = context.current_order
3332
end
3433

3534
# Returns orders that should be merged into the current order
3635
#
3736
# @return [ActiveRecord::Relation<Spree::Order>] incomplete orders from the
3837
# same store
3938
def call
40-
@user.orders.by_store(@store).incomplete.where.not(id: @current_order.id)
39+
@user.orders.by_store(@store).incomplete.where(frontend_viewable: true).where.not(id: @current_order.id)
4140
end
4241
end
4342
end

core/spec/models/spree/mergeable_orders_finder_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ module Spree
77
let(:user) { create(:user) }
88
let(:store) { create(:store) }
99
let(:current_order) { create(:order, user: user, store: store) }
10-
let(:subject) { Spree::MergeableOrdersFinder.new(user: user, store: store, current_order: current_order) }
10+
let(:context) { double('context', spree_current_user: user, current_store: store, current_order: current_order) }
11+
let(:subject) { Spree::MergeableOrdersFinder.new(context: context) }
1112

1213
describe '#call' do
1314
let!(:incomplete_order1) { create(:order, user: user, store: store, state: 'cart') }

core/spec/models/spree/order_spec.rb

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -427,30 +427,27 @@ def merge!(other_order, user = nil)
427427
let(:user) { create(:user) }
428428
let(:store) { create(:store) }
429429
let(:current_order) { create(:order, user: user, store: store) }
430-
431-
before do
432-
class TestMergeableOrdersFinder
433-
def initialize(user:, store:, current_order:)
434-
@user = user
435-
@store = store
436-
@current_order = current_order
430+
let(:context) { double('context', spree_current_user: user, current_store: store, current_order: current_order) }
431+
let(:test_mergeable_orders_finder_class) do
432+
Class.new do
433+
def initialize(context:)
434+
@user = context.spree_current_user
435+
@store = context.current_store
436+
@current_order = context.current_order
437437
end
438438

439439
def call
440440
@user.orders.by_store(@store).where.not(id: @current_order.id).where('created_at > ?', 7.days.ago)
441441
end
442442
end
443-
Spree::Config.mergeable_orders_finder_class = TestMergeableOrdersFinder
444443
end
445444

446-
subject(:finder) do
447-
Spree::Config.mergeable_orders_finder_class.new(
448-
user: user,
449-
store: store,
450-
current_order: current_order
451-
)
445+
before do
446+
stub_spree_preferences(mergeable_orders_finder_class: test_mergeable_orders_finder_class)
452447
end
453448

449+
subject(:finder) { Spree::Config.mergeable_orders_finder_class.new(context: context) }
450+
454451
it 'uses the configured mergeable orders finder' do
455452
old_order = create(:order, user: user, store: store, created_at: 8.days.ago)
456453
recent_order = create(:order, user: user, store: store, created_at: 3.days.ago)

0 commit comments

Comments
 (0)