diff --git a/app/models/open_food_web/calculator/weight.rb b/app/models/open_food_web/calculator/weight.rb index f927988886..049f4ad15f 100644 --- a/app/models/open_food_web/calculator/weight.rb +++ b/app/models/open_food_web/calculator/weight.rb @@ -8,8 +8,22 @@ module OpenFoodWeb end def compute(object) - total_weight = object.line_items.inject(0) { |sum, li| sum + ((li.variant.andand.weight || 0) * li.quantity) } + line_items = line_items_for object + total_weight = line_items.sum { |li| ((li.variant.andand.weight || 0) * li.quantity) } total_weight * self.preferred_per_kg end + + + private + + def line_items_for(object) + if 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 diff --git a/spec/models/calculator/weight_spec.rb b/spec/models/calculator/weight_spec.rb index acd8480d12..3b71a0787b 100644 --- a/spec/models/calculator/weight_spec.rb +++ b/spec/models/calculator/weight_spec.rb @@ -15,4 +15,13 @@ describe OpenFoodWeb::Calculator::Weight do subject.set_preference(:per_kg, 10) subject.compute(order).should == (10*1 + 20*3) * 10 end + + it "computes shipping cost for a line item" do + variant = double(:variant, :weight => 10) + + line_item = double(:line_item, :variant => variant, :quantity => 2) + + subject.set_preference(:per_kg, 10) + subject.compute(line_item).should == 10*2 * 10 + end end