From 314ccc2f276452579508508cae6698ce4ed698f5 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 27 Apr 2017 14:39:36 +1000 Subject: [PATCH] Ensuring that #items_bought_by_user doesn't return items from cancelled orders --- app/models/order_cycle.rb | 13 ++++--------- spec/models/order_cycle_spec.rb | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index 4c23a8703f..64fcce4baf 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -251,16 +251,11 @@ class OrderCycle < ActiveRecord::Base end def items_bought_by_user(user, distributor) - orders = Spree::Order.complete.where(user_id: user, distributor_id: distributor, order_cycle_id: self) - items = [] - orders.each do |o| - items += o.line_items - end + # The Spree::Order.complete scope only checks for completed_at date, does not ensure state is "complete" + orders = Spree::Order.complete.where(state: "complete", user_id: user, distributor_id: distributor, order_cycle_id: self) + items = orders.map(&:line_items).flatten scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor) - items.each do |li| - scoper.scope(li.variant) - end - items + items.each { |li| scoper.scope(li.variant) } end private diff --git a/spec/models/order_cycle_spec.rb b/spec/models/order_cycle_spec.rb index ca2c8260cf..8715e1ef5c 100644 --- a/spec/models/order_cycle_spec.rb +++ b/spec/models/order_cycle_spec.rb @@ -505,4 +505,22 @@ describe OrderCycle do OrderCycle.earliest_closing_times[e2.id].should == time2 end end + + describe "finding all line items sold by to a user by a given shop" do + let(:shop) { create(:enterprise) } + let(:user) { create(:user) } + let(:oc) { create(:order_cycle) } + let!(:order1) { create(:completed_order_with_totals, distributor: shop, user: user, order_cycle: oc) } + let!(:order2) { create(:completed_order_with_totals, distributor: create(:enterprise), user: user, order_cycle: oc) } + let!(:order3) { create(:completed_order_with_totals, distributor: shop, user: create(:user), order_cycle: oc) } + let!(:order4) { create(:completed_order_with_totals, distributor: shop, user: user, order_cycle: create(:order_cycle)) } + let!(:order5) { create(:completed_order_with_totals, distributor: shop, user: user, order_cycle: oc) } + + before { order5.cancel } + + it "only returns items from non-cancelled orders in the OC, placed by the user at the shop" do + items = oc.items_bought_by_user(user, shop) + expect(items).to eq order1.reload.line_items + end + end end