diff --git a/app/forms/standing_order_form.rb b/app/forms/standing_order_form.rb index a28872aed5..23851e3f19 100644 --- a/app/forms/standing_order_form.rb +++ b/app/forms/standing_order_form.rb @@ -48,6 +48,7 @@ class StandingOrderForm future_and_undated_orders.each(&:save) raise ActiveRecord::Rollback unless standing_order.save + true end end diff --git a/app/models/proxy_order.rb b/app/models/proxy_order.rb index 09132b8a38..0b92419743 100644 --- a/app/models/proxy_order.rb +++ b/app/models/proxy_order.rb @@ -5,13 +5,13 @@ class ProxyOrder < ActiveRecord::Base delegate :number, :completed_at, :total, to: :order, allow_nil: true - scope :closed, -> { joins(order: :order_cycle).merge(OrderCycle.closed) } - scope :not_closed, -> { joins(order: :order_cycle).merge(OrderCycle.not_closed) } + scope :closed, -> { joins(:order_cycle).merge(OrderCycle.closed) } + scope :not_closed, -> { joins(:order_cycle).merge(OrderCycle.not_closed) } scope :not_canceled, where('proxy_orders.canceled_at IS NULL') def state return 'canceled' if canceled? - order.state + order ? order.state : 'cart' end def canceled? @@ -22,7 +22,7 @@ class ProxyOrder < ActiveRecord::Base return false unless order_cycle.orders_close_at.andand > Time.zone.now transaction do self.update_column(:canceled_at, Time.zone.now) - order.send('cancel') + order.send('cancel') if order true end end @@ -31,7 +31,7 @@ class ProxyOrder < ActiveRecord::Base return false unless order_cycle.orders_close_at.andand > Time.zone.now transaction do self.update_column(:canceled_at, nil) - order.send('resume') + order.send('resume') if order true end end diff --git a/spec/controllers/admin/proxy_orders_controller_spec.rb b/spec/controllers/admin/proxy_orders_controller_spec.rb index 2d90227594..3b711c93b9 100644 --- a/spec/controllers/admin/proxy_orders_controller_spec.rb +++ b/spec/controllers/admin/proxy_orders_controller_spec.rb @@ -70,7 +70,7 @@ describe Admin::ProxyOrdersController, type: :controller do let!(:shipping_method) { create(:shipping_method) } let!(:standing_order) { create(:standing_order, shop: shop, with_items: true) } let!(:proxy_order) { create(:proxy_order, standing_order: standing_order, order_cycle: order_cycle) } - let(:order) { proxy_order.order } + let(:order) { proxy_order.initialise_order! } before do # Processing order to completion diff --git a/spec/features/admin/standing_orders_spec.rb b/spec/features/admin/standing_orders_spec.rb index 3ebe750471..9b6a10e83a 100644 --- a/spec/features/admin/standing_orders_spec.rb +++ b/spec/features/admin/standing_orders_spec.rb @@ -13,9 +13,9 @@ feature 'Standing Orders' do before { quick_login_as user } context 'listing standing orders' do - let!(:standing_order) { create(:standing_order, shop: shop, with_items: true, with_orders: true) } - let!(:standing_order2) { create(:standing_order, shop: shop2, with_items: true, with_orders: true) } - let!(:standing_order_unmanaged) { create(:standing_order, shop: shop_unmanaged, with_items: true, with_orders: true) } + let!(:standing_order) { create(:standing_order, shop: shop, with_items: true, with_proxy_orders: true) } + let!(:standing_order2) { create(:standing_order, shop: shop2, with_items: true, with_proxy_orders: true) } + let!(:standing_order_unmanaged) { create(:standing_order, shop: shop_unmanaged, with_items: true, with_proxy_orders: true) } it "passes the smoke test" do visit spree.admin_path diff --git a/spec/jobs/standing_order_confirm_job_spec.rb b/spec/jobs/standing_order_confirm_job_spec.rb index dadd13bfc1..2e2095de91 100644 --- a/spec/jobs/standing_order_confirm_job_spec.rb +++ b/spec/jobs/standing_order_confirm_job_spec.rb @@ -28,7 +28,7 @@ describe StandingOrderConfirmJob do describe "processing an order" do let(:proxy_order) { create(:proxy_order, standing_order: standing_order1) } - let(:order) { proxy_order.order } + let(:order) { proxy_order.initialise_order! } before do while !order.completed? do break unless order.next! end diff --git a/spec/jobs/standing_order_placement_job_spec.rb b/spec/jobs/standing_order_placement_job_spec.rb index 43f3d985ca..9d820a7edf 100644 --- a/spec/jobs/standing_order_placement_job_spec.rb +++ b/spec/jobs/standing_order_placement_job_spec.rb @@ -67,9 +67,9 @@ describe StandingOrderPlacementJob do end describe "processing a standing order order" do - let(:standing_order) { create(:standing_order, with_orders: true, with_items: true) } - let(:proxy_order) { standing_order.proxy_orders.first } - let!(:order) { proxy_order.order } + let(:standing_order) { create(:standing_order, with_items: true) } + let(:proxy_order) { create(:proxy_order, standing_order: standing_order) } + let!(:order) { proxy_order.initialise_order! } let(:changes) { {} } let!(:job) { StandingOrderPlacementJob.new(proxy_order.order_cycle) } diff --git a/spec/models/proxy_order_spec.rb b/spec/models/proxy_order_spec.rb index 3eaf679753..daccc4ca3f 100644 --- a/spec/models/proxy_order_spec.rb +++ b/spec/models/proxy_order_spec.rb @@ -6,11 +6,20 @@ describe ProxyOrder, type: :model do let(:standing_order) { create(:standing_order) } context "when the order cycle is not yet closed" do + let(:proxy_order) { create(:proxy_order, standing_order: standing_order, order: order, order_cycle: order_cycle) } before { order_cycle.update_attributes(orders_open_at: 1.day.ago, orders_close_at: 3.days.from_now) } + context "and an order has not been initialised" do + let(:order) { nil } + + it "returns true and sets canceled_at to the current time" do + expect(proxy_order.cancel).to be true + expect(proxy_order.reload.canceled_at).to be_within(5.seconds).of Time.now + end + end + context "and the order has already been completed" do let(:order) { create(:completed_order_with_totals) } - let(:proxy_order) { create(:proxy_order, standing_order: standing_order, order: order, order_cycle: order_cycle) } it "returns true and sets canceled_at to the current time, and cancels the order" do expect(proxy_order.cancel).to be true @@ -21,7 +30,6 @@ describe ProxyOrder, type: :model do context "and the order has not already been completed" do let(:order) { create(:order) } - let(:proxy_order) { create(:proxy_order, standing_order: standing_order, order: order, order_cycle: order_cycle) } it "returns true and sets canceled_at to the current time" do expect(proxy_order.cancel).to be true @@ -32,15 +40,26 @@ describe ProxyOrder, type: :model do end context "when the order cycle is already closed" do - let(:order) { create(:order) } let(:proxy_order) { create(:proxy_order, standing_order: standing_order, order: order, order_cycle: order_cycle) } - before { order_cycle.update_attributes(orders_open_at: 3.days.ago, orders_close_at: 1.minute.ago) } - it "returns false and does nothing" do - expect(proxy_order.cancel).to be false - expect(proxy_order.reload.canceled_at).to be nil - expect(order.reload.state).to eq 'cart' + context "and an order has not been initialised" do + let(:order) { nil } + + it "returns false and does nothing" do + expect(proxy_order.cancel).to be false + expect(proxy_order.reload.canceled_at).to be nil + end + end + + context "and an order has been initialised" do + let(:order) { create(:order) } + + it "returns false and does nothing" do + expect(proxy_order.cancel).to be false + expect(proxy_order.reload.canceled_at).to be nil + expect(order.reload.state).to eq 'cart' + end end end end @@ -48,20 +67,23 @@ describe ProxyOrder, type: :model do describe "resume" do let!(:payment_method) { create(:payment_method) } let(:order) { create(:order_with_totals, shipping_method: create(:shipping_method)) } - let(:proxy_order) { create(:proxy_order, order: order) } + let(:proxy_order) { create(:proxy_order, order: order, canceled_at: Time.zone.now) } let(:order_cycle) { proxy_order.order_cycle} - - before do - # Processing order to completion - while !order.completed? do break unless order.next! end - proxy_order.update_attribute(:canceled_at, Time.zone.now) - end - context "when the order cycle is not yet closed" do before { order_cycle.update_attributes(orders_open_at: 1.day.ago, orders_close_at: 3.days.from_now) } + context "and the order has not been initialised" do + let(:order) { nil } + + it "returns true and clears canceled_at" do + expect(proxy_order.resume).to be true + expect(proxy_order.reload.canceled_at).to be nil + end + end + context "and the order has already been cancelled" do + before { while !order.completed? do break unless order.next! end } before { order.cancel } it "returns true, clears canceled_at and resumes the order" do @@ -72,6 +94,8 @@ describe ProxyOrder, type: :model do end context "and the order has not been cancelled" do + before { while !order.completed? do break unless order.next! end } + it "returns true and clears canceled_at" do expect(proxy_order.resume).to be true expect(proxy_order.reload.canceled_at).to be nil @@ -83,7 +107,17 @@ describe ProxyOrder, type: :model do context "when the order cycle is already closed" do before { order_cycle.update_attributes(orders_open_at: 3.days.ago, orders_close_at: 1.minute.ago) } + context "and the order has not been initialised" do + let(:order) { nil } + + it "returns false and does nothing" do + expect(proxy_order.resume).to eq false + expect(proxy_order.reload.canceled_at).to be_within(5.seconds).of Time.now + end + end + context "and the order has been cancelled" do + before { while !order.completed? do break unless order.next! end } before { order.cancel } it "returns false and does nothing" do @@ -94,6 +128,8 @@ describe ProxyOrder, type: :model do end context "and the order has not been cancelled" do + before { while !order.completed? do break unless order.next! end } + it "returns false and does nothing" do expect(proxy_order.resume).to eq false expect(proxy_order.reload.canceled_at).to be_within(5.seconds).of Time.now