From a2abcaf7bd78d6e8f26afeed9851745903953b8f Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Mon, 27 May 2013 13:50:33 +1000 Subject: [PATCH] Push product_compatible_with_current_order and available_distributors_for down to DistributorChangeValidator, add tests --- app/helpers/add_to_cart_helper.rb | 10 +--- .../distributor_change_validator.rb | 14 ++++++ .../distributor_change_validator_spec.rb | 46 ++++++++++++++++++- 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/app/helpers/add_to_cart_helper.rb b/app/helpers/add_to_cart_helper.rb index 445e65d9ae..7fb5604fa1 100644 --- a/app/helpers/add_to_cart_helper.rb +++ b/app/helpers/add_to_cart_helper.rb @@ -4,16 +4,10 @@ module AddToCartHelper end def product_incompatible_with_current_order(order, product) - order.present? && available_distributors_for(order, product).empty? + !DistributorChangeValidator.new(order).product_compatible_with_current_order(product) end def available_distributors_for(order, product) - distributors = Enterprise.distributing_product(product) - - if order && order.distributor - distributors = DistributorChangeValidator.new(order).available_distributors(distributors) - end - - distributors + DistributorChangeValidator.new(order).available_distributors_for(product) end end diff --git a/lib/open_food_web/distributor_change_validator.rb b/lib/open_food_web/distributor_change_validator.rb index cd7ed4bf2f..2a40b5f7f7 100644 --- a/lib/open_food_web/distributor_change_validator.rb +++ b/lib/open_food_web/distributor_change_validator.rb @@ -14,6 +14,20 @@ class DistributorChangeValidator @order.line_items.empty? || (available_distributors(Enterprise.all) || []).include?(distributor) end + def product_compatible_with_current_order(product) + @order.nil? || available_distributors_for(product).present? + end + + def available_distributors_for(product) + distributors = Enterprise.distributing_product(product) + + if @order.andand.line_items.present? + distributors = available_distributors(distributors) + end + + distributors + end + def available_distributors enterprises enterprises.select do |e| (@order.line_item_variants - e.distributed_variants).empty? diff --git a/spec/lib/open_food_web/distributor_change_validator_spec.rb b/spec/lib/open_food_web/distributor_change_validator_spec.rb index 9b6b848483..d958d49eae 100644 --- a/spec/lib/open_food_web/distributor_change_validator_spec.rb +++ b/spec/lib/open_food_web/distributor_change_validator_spec.rb @@ -3,7 +3,8 @@ require 'open_food_web/distributor_change_validator' describe DistributorChangeValidator do let(:order) { double(:order) } let(:subject) { DistributorChangeValidator.new(order) } - + let(:product) { double(:product) } + context "permissions for changing distributor" do it "allows distributor to be changed if line_items is empty" do order.stub(:line_items) { [] } @@ -84,4 +85,47 @@ describe DistributorChangeValidator do subject.available_distributors([]).should == [] end end + + describe "checking product compatibility with current order" do + it "returns true when order is nil" do + subject = DistributorChangeValidator.new(nil) + subject.product_compatible_with_current_order(product).should be_true + end + + it "returns true when there's an distributor that can cover the new product" do + subject.stub(:available_distributors_for).and_return([1]) + subject.product_compatible_with_current_order(product).should be_true + end + + it "returns false when there's no distributor that can cover the new product" do + subject.stub(:available_distributors_for).and_return([]) + subject.product_compatible_with_current_order(product).should be_false + end + end + + describe "finding available distributors for a product" do + it "returns enterprises distributing the product when there's no order" do + subject = DistributorChangeValidator.new(nil) + Enterprise.stub(:distributing_product).and_return([1, 2, 3]) + subject.should_receive(:available_distributors).never + + subject.available_distributors_for(product).should == [1, 2, 3] + end + + it "returns enterprises distributing the product when there's no order items" do + order.stub(:line_items) { [] } + Enterprise.stub(:distributing_product).and_return([1, 2, 3]) + subject.should_receive(:available_distributors).never + + subject.available_distributors_for(product).should == [1, 2, 3] + end + + it "filters by available distributors when there are order items" do + order.stub(:line_items) { [1, 2, 3] } + Enterprise.stub(:distributing_product).and_return([1, 2, 3]) + subject.should_receive(:available_distributors).and_return([2]) + + subject.available_distributors_for(product).should == [2] + end + end end