From 0a155da2734424a3843a738562dc031f947b9072 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 25 Jun 2019 11:13:56 +0100 Subject: [PATCH 1/3] Avoid `undefined method 'order'` errors when removing lineitems from basket --- app/models/spree/calculator_decorator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/spree/calculator_decorator.rb b/app/models/spree/calculator_decorator.rb index 33c32c901e..32f397ad39 100644 --- a/app/models/spree/calculator_decorator.rb +++ b/app/models/spree/calculator_decorator.rb @@ -9,7 +9,7 @@ module Spree [object] elsif object.respond_to? :line_items object.line_items - elsif object.order.present? + elsif object.respond_to? :order object.order.line_items else [object] From f19a6f0dec520dcbbb31619b3015bff800db105f Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 25 Jun 2019 12:19:16 +0100 Subject: [PATCH 2/3] Add tests for class_eval on Spree::Calculator private method #line_items_for --- spec/models/spree/calculator_spec.rb | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 spec/models/spree/calculator_spec.rb diff --git a/spec/models/spree/calculator_spec.rb b/spec/models/spree/calculator_spec.rb new file mode 100644 index 0000000000..5caf4dca72 --- /dev/null +++ b/spec/models/spree/calculator_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' + +module Spree + describe Calculator do + let(:calculator) { Spree::Calculator.new } + let!(:enterprise) { create(:enterprise) } + let!(:order) { create(:order) } + let!(:line_item) { create(:line_item, order: order) } + let!(:line_item2) { create(:line_item, order: order) } + + before do + order.line_items << line_item + order.line_items << line_item2 + end + + describe "#line_items_for" do + it "returns the line item if given a line item" do + result = calculator.__send__(:line_items_for, line_item) + + expect(result).to eq [line_item] + end + + it "returns line items if given an order" do + result = calculator.__send__(:line_items_for, order) + + expect(result).to eq [line_item, line_item2] + end + + it "returns the original object if given anything else" do + result = calculator.__send__(:line_items_for, enterprise) + + expect(result).to eq [enterprise] + end + end + end +end From 5100ad6b51f5026bd6fe07d6c176dd439dc9771d Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 25 Jun 2019 15:33:42 +0100 Subject: [PATCH 3/3] Improve #line_items_for logic and add more tests --- app/models/spree/calculator_decorator.rb | 2 +- spec/models/spree/calculator_spec.rb | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/models/spree/calculator_decorator.rb b/app/models/spree/calculator_decorator.rb index 32f397ad39..5d130d86aa 100644 --- a/app/models/spree/calculator_decorator.rb +++ b/app/models/spree/calculator_decorator.rb @@ -9,7 +9,7 @@ module Spree [object] elsif object.respond_to? :line_items object.line_items - elsif object.respond_to? :order + elsif object.respond_to?(:order) && object.order.present? object.order.line_items else [object] diff --git a/spec/models/spree/calculator_spec.rb b/spec/models/spree/calculator_spec.rb index 5caf4dca72..2aa8c5d0a8 100644 --- a/spec/models/spree/calculator_spec.rb +++ b/spec/models/spree/calculator_spec.rb @@ -5,12 +5,14 @@ module Spree let(:calculator) { Spree::Calculator.new } let!(:enterprise) { create(:enterprise) } let!(:order) { create(:order) } + let!(:shipment) { create(:shipment) } let!(:line_item) { create(:line_item, order: order) } let!(:line_item2) { create(:line_item, order: order) } before do order.line_items << line_item order.line_items << line_item2 + order.shipments = [shipment] end describe "#line_items_for" do @@ -20,12 +22,18 @@ module Spree expect(result).to eq [line_item] end - it "returns line items if given an order" do + it "returns line items if given an object with line items" do result = calculator.__send__(:line_items_for, order) expect(result).to eq [line_item, line_item2] end + it "returns line items if given an object with an order" do + result = calculator.__send__(:line_items_for, shipment) + + expect(result).to eq [line_item, line_item2] + end + it "returns the original object if given anything else" do result = calculator.__send__(:line_items_for, enterprise)