Fix bug on calculator_decorator line_items_for where input is line_item with an nil order. Adapted line_items_for so that weight_calculator.line_items_for could be removed.

This commit is contained in:
luisramos0
2018-11-17 12:43:55 +00:00
parent 046ba14da4
commit 38ff99717a
7 changed files with 21 additions and 32 deletions

View File

@@ -12,19 +12,5 @@ module Calculator
total_weight = line_items.sum { |li| ((li.variant.andand.weight || 0) * li.quantity) }
total_weight * preferred_per_kg
end
private
def line_items_for(object)
if object.respond_to? :order
object.order.line_items
elsif object.respond_to? :line_items
object.line_items
elsif object.respond_to?(:variant) && object.respond_to?(:quantity)
[object]
else
raise "Unknown object type: #{object.inspect}"
end
end
end
end

View File

@@ -1,18 +1,20 @@
module Spree
Calculator.class_eval do
private
# Given an object which might be an Order or a LineItem (amongst
# others), return a collection of line items.
def line_items_for(object)
if object.respond_to? :line_items
if object.is_a?(Spree::LineItem)
[object]
elsif object.respond_to? :line_items
object.line_items
elsif object.order.present?
object.order.line_items
else
[object]
end
end
end
end

View File

@@ -1,3 +1,4 @@
require 'spec_helper'
require 'open_food_network/enterprise_fee_calculator'
module OpenFoodNetwork

View File

@@ -2,13 +2,13 @@ require 'spec_helper'
describe Calculator::Weight do
it "computes shipping cost for an order by total weight" do
variant1 = double(:variant, weight: 10)
variant2 = double(:variant, weight: 20)
variant3 = double(:variant, weight: nil)
variant1 = build(:variant, weight: 10)
variant2 = build(:variant, weight: 20)
variant3 = build(:variant, weight: nil)
line_item1 = double(:line_item, variant: variant1, quantity: 1)
line_item2 = double(:line_item, variant: variant2, quantity: 3)
line_item3 = double(:line_item, variant: variant3, quantity: 5)
line_item1 = build(:line_item, variant: variant1, quantity: 1)
line_item2 = build(:line_item, variant: variant2, quantity: 3)
line_item3 = build(:line_item, variant: variant3, quantity: 5)
order = double(:order, line_items: [line_item1, line_item2, line_item3])
@@ -17,20 +17,20 @@ describe Calculator::Weight do
end
it "computes shipping cost for a line item" do
variant = double(:variant, weight: 10)
variant = build(:variant, weight: 10)
line_item = double(:line_item, variant: variant, quantity: 2)
line_item = build(:line_item, variant: variant, quantity: 2)
subject.set_preference(:per_kg, 10)
expect(subject.compute(line_item)).to eq(10 * 2 * 10)
end
it "computes shipping cost for an object with an order" do
variant1 = double(:variant, weight: 10)
variant2 = double(:variant, weight: 5)
variant1 = build(:variant, weight: 10)
variant2 = build(:variant, weight: 5)
line_item1 = double(:line_item, variant: variant1, quantity: 1)
line_item2 = double(:line_item, variant: variant2, quantity: 2)
line_item1 = build(:line_item, variant: variant1, quantity: 1)
line_item2 = build(:line_item, variant: variant2, quantity: 2)
order = double(:order, line_items: [line_item1, line_item2])
object_with_order = double(:object_with_order, order: order)

View File

@@ -2,7 +2,7 @@ require 'spec_helper'
describe Spree::Calculator::FlatPercentItemTotal do
let(:calculator) { Spree::Calculator::FlatPercentItemTotal.new }
let(:line_item) { instance_double(Spree::LineItem, amount: 10) }
let(:line_item) { build(:line_item, price: 10, quantity: 1) }
before { calculator.stub :preferred_flat_percent => 10 }

View File

@@ -1,7 +1,7 @@
require 'spec_helper'
describe Spree::Calculator::FlexiRate do
let(:line_item) { instance_double(Spree::LineItem, amount: 10, quantity: quantity) }
let(:line_item) { build(:line_item, quantity: quantity) }
let(:calculator) do
Spree::Calculator::FlexiRate.new(
preferred_first_item: 2,

View File

@@ -3,7 +3,7 @@ require 'spec_helper'
describe Spree::Calculator::PerItem do
let(:calculator) { Spree::Calculator::PerItem.new(preferred_amount: 10) }
let(:shipping_calculable) { double(:calculable) }
let(:line_item) { double(:line_item, quantity: 5, product: double(:product)) }
let(:line_item) { build(:line_item, quantity: 5) }
it "correctly calculates on a single line item object" do
calculator.stub(calculable: shipping_calculable)