From d18fec71255fb55efdf6b40c0ad70a5c3eef1ce9 Mon Sep 17 00:00:00 2001 From: Luis Ramos Date: Wed, 1 Jul 2020 16:00:05 +0100 Subject: [PATCH] Move Base splitter from main app models to order management engine services --- app/models/spree/stock/splitter/base.rb | 31 --------------- config/application.rb | 2 +- .../order_management/stock/basic_splitter.rb | 29 ++++++++++++++ .../stock/basic_splitter_spec.rb | 37 ++++++++++++++++++ spec/config/application_spec.rb | 4 +- spec/models/spree/stock/splitter/base_spec.rb | 39 ------------------- 6 files changed, 69 insertions(+), 73 deletions(-) delete mode 100644 app/models/spree/stock/splitter/base.rb create mode 100644 engines/order_management/app/services/order_management/stock/basic_splitter.rb create mode 100644 engines/order_management/spec/services/order_management/stock/basic_splitter_spec.rb delete mode 100644 spec/models/spree/stock/splitter/base_spec.rb diff --git a/app/models/spree/stock/splitter/base.rb b/app/models/spree/stock/splitter/base.rb deleted file mode 100644 index ba2f8b9de9..0000000000 --- a/app/models/spree/stock/splitter/base.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module Spree - module Stock - module Splitter - class Base - attr_reader :packer, :next_splitter - - def initialize(packer, next_splitter = nil) - @packer = packer - @next_splitter = next_splitter - end - delegate :stock_location, :order, to: :packer - - def split(packages) - return_next(packages) - end - - private - - def return_next(packages) - next_splitter ? next_splitter.split(packages) : packages - end - - def build_package(contents = []) - @packer.package_factory.new(stock_location, order, contents) - end - end - end - end -end diff --git a/config/application.rb b/config/application.rb index d48b5d2b8b..419638b236 100644 --- a/config/application.rb +++ b/config/application.rb @@ -83,7 +83,7 @@ module Openfoodnetwork # we must use this splitter and no other initializer "spree.register.stock_splitters" do |app| app.config.spree.stock_splitters = [ - Spree::Stock::Splitter::Base + OrderManagement::Stock::BasicSplitter ] end diff --git a/engines/order_management/app/services/order_management/stock/basic_splitter.rb b/engines/order_management/app/services/order_management/stock/basic_splitter.rb new file mode 100644 index 0000000000..eacbf05704 --- /dev/null +++ b/engines/order_management/app/services/order_management/stock/basic_splitter.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module OrderManagement + module Stock + class BasicSplitter + attr_reader :packer, :next_splitter + + def initialize(packer, next_splitter = nil) + @packer = packer + @next_splitter = next_splitter + end + delegate :stock_location, :order, to: :packer + + def split(packages) + return_next(packages) + end + + private + + def return_next(packages) + next_splitter ? next_splitter.split(packages) : packages + end + + def build_package(contents = []) + @packer.package_factory.new(stock_location, order, contents) + end + end + end +end diff --git a/engines/order_management/spec/services/order_management/stock/basic_splitter_spec.rb b/engines/order_management/spec/services/order_management/stock/basic_splitter_spec.rb new file mode 100644 index 0000000000..9cd68834b8 --- /dev/null +++ b/engines/order_management/spec/services/order_management/stock/basic_splitter_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'spec_helper' + +module OrderManagement + module Stock + describe BasicSplitter do + let(:packer) { build(:stock_packer) } + + it 'continues to splitter chain' do + splitter1 = BasicSplitter.new(packer) + splitter2 = BasicSplitter.new(packer, splitter1) + packages = [] + + splitter1.should_receive(:split).with(packages) + splitter2.split(packages) + end + + it 'builds package using package factory' do + # Basic extension of Base splitter used to test build_package method + class ::RealSplitter < BasicSplitter + def split(_packages) + build_package + end + end + + # Custom package used to test setting package factory + class ::CustomPackage + def initialize(stock_location, order, splitters); end + end + allow(Spree::Config).to receive(:package_factory) { CustomPackage } + + expect(::RealSplitter.new(packer).split(nil).class).to eq CustomPackage + end + end + end +end diff --git a/spec/config/application_spec.rb b/spec/config/application_spec.rb index 126325a4f1..40c8d1c302 100644 --- a/spec/config/application_spec.rb +++ b/spec/config/application_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Openfoodnetwork::Application, 'configuration' do let(:config) { described_class.config } - it "sets Spree::Stock::Splitter::Base as the only stock splitter" do - expect(config.spree.stock_splitters).to eq [Spree::Stock::Splitter::Base] + it "sets OrderManagement::Stock::BasicSplitter as the only stock splitter" do + expect(config.spree.stock_splitters).to eq [OrderManagement::Stock::BasicSplitter] end end diff --git a/spec/models/spree/stock/splitter/base_spec.rb b/spec/models/spree/stock/splitter/base_spec.rb deleted file mode 100644 index d1b368494f..0000000000 --- a/spec/models/spree/stock/splitter/base_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -module Spree - module Stock - module Splitter - describe Base do - let(:packer) { build(:stock_packer) } - - it 'continues to splitter chain' do - splitter1 = Base.new(packer) - splitter2 = Base.new(packer, splitter1) - packages = [] - - splitter1.should_receive(:split).with(packages) - splitter2.split(packages) - end - - it 'builds package using package factory' do - # Basic extension of Base splitter used to test build_package method - class ::BasicSplitter < Base - def split(_packages) - build_package - end - end - - # Custom package used to test setting package factory - class ::CustomPackage - def initialize(stock_location, order, splitters); end - end - allow(Spree::Config).to receive(:package_factory) { CustomPackage } - - expect(::BasicSplitter.new(packer).split(nil).class).to eq CustomPackage - end - end - end - end -end