From 64206bc35b813c8be7b048a4f02838b4a78cb32f Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Sun, 11 Dec 2016 15:23:08 +1100 Subject: [PATCH] ProxyOrders belong to order cycles --- app/forms/standing_order_form.rb | 21 ++++++----- app/jobs/standing_order_sync_job.rb | 4 +- app/models/proxy_order.rb | 5 ++- ...5939_add_order_cycle_id_to_proxy_orders.rb | 20 ++++++++++ db/schema.rb | 3 ++ .../admin/proxy_orders_controller_spec.rb | 13 ++++--- .../admin/standing_orders_controller_spec.rb | 5 +-- spec/factories.rb | 10 +++++ spec/features/admin/standing_orders_spec.rb | 6 +-- spec/forms/standing_order_form_spec.rb | 22 +++++------ spec/jobs/standing_order_confirm_job_spec.rb | 26 ++++++------- .../jobs/standing_order_placement_job_spec.rb | 35 ++++++++---------- spec/jobs/standing_order_sync_job_spec.rb | 10 ++--- spec/models/proxy_order_spec.rb | 37 ++++++++----------- spec/models/standing_order_spec.rb | 6 +-- 15 files changed, 123 insertions(+), 100 deletions(-) create mode 100644 db/migrate/20161210235939_add_order_cycle_id_to_proxy_orders.rb diff --git a/app/forms/standing_order_form.rb b/app/forms/standing_order_form.rb index 2caf3a5f9b..aeb530c8e3 100644 --- a/app/forms/standing_order_form.rb +++ b/app/forms/standing_order_form.rb @@ -21,8 +21,8 @@ class StandingOrderForm validate_price_estimates standing_order.assign_attributes(params) - initialise_orders! - remove_obsolete_orders! + initialise_proxy_orders! + remove_obsolete_proxy_orders! orders.update_all(customer_id: customer_id, email: customer.andand.email, distributor_id: shop_id) @@ -80,6 +80,7 @@ class StandingOrderForm order.update_distribution_charge! create_payment_for(order) + order.save order end @@ -103,24 +104,24 @@ class StandingOrderForm end end - def initialise_orders! + def initialise_proxy_orders! uninitialised_order_cycle_ids.each do |order_cycle_id| - orders << create_order_for(order_cycle_id) + proxy_orders << ProxyOrder.new(standing_order: standing_order, order_cycle_id: order_cycle_id, order: create_order_for(order_cycle_id)) end end def uninitialised_order_cycle_ids - not_closed_in_range_order_cycles.pluck(:id) - orders.map(&:order_cycle_id) + not_closed_in_range_order_cycles.pluck(:id) - proxy_orders.map(&:order_cycle_id) end - def remove_obsolete_orders! - proxy_orders.where(order_id: obsolete_orders).destroy_all + def remove_obsolete_proxy_orders! + obsolete_proxy_orders.destroy_all end - def obsolete_orders + def obsolete_proxy_orders in_range_order_cycle_ids = in_range_order_cycles.pluck(:id) - return orders unless in_range_order_cycle_ids.any? - orders.where('order_cycle_id NOT IN (?)', in_range_order_cycle_ids) + return proxy_orders unless in_range_order_cycle_ids.any? + proxy_orders.where('order_cycle_id NOT IN (?)', in_range_order_cycle_ids) end def not_closed_in_range_order_cycles diff --git a/app/jobs/standing_order_sync_job.rb b/app/jobs/standing_order_sync_job.rb index c599c103cd..2666ca0713 100644 --- a/app/jobs/standing_order_sync_job.rb +++ b/app/jobs/standing_order_sync_job.rb @@ -8,8 +8,8 @@ class StandingOrderSyncJob def perform standing_orders.each do |standing_order| form = StandingOrderForm.new(standing_order) - form.send(:initialise_orders!) - form.send(:remove_obsolete_orders!) + form.send(:initialise_proxy_orders!) + form.send(:remove_obsolete_proxy_orders!) end end diff --git a/app/models/proxy_order.rb b/app/models/proxy_order.rb index 36aa4993ae..8d42f28c82 100644 --- a/app/models/proxy_order.rb +++ b/app/models/proxy_order.rb @@ -1,6 +1,7 @@ class ProxyOrder < ActiveRecord::Base belongs_to :order, class_name: 'Spree::Order', dependent: :destroy belongs_to :standing_order + belongs_to :order_cycle delegate :number, :order_cycle_id, :completed_at, :total, to: :order @@ -18,7 +19,7 @@ class ProxyOrder < ActiveRecord::Base end def cancel - return false unless order.order_cycle.andand.orders_close_at.andand > Time.zone.now + 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') @@ -27,7 +28,7 @@ class ProxyOrder < ActiveRecord::Base end def resume - return false unless order.order_cycle.orders_close_at > Time.zone.now + return false unless order_cycle.orders_close_at.andand > Time.zone.now transaction do self.update_column(:canceled_at, nil) order.send('resume') diff --git a/db/migrate/20161210235939_add_order_cycle_id_to_proxy_orders.rb b/db/migrate/20161210235939_add_order_cycle_id_to_proxy_orders.rb new file mode 100644 index 0000000000..fd18937ea0 --- /dev/null +++ b/db/migrate/20161210235939_add_order_cycle_id_to_proxy_orders.rb @@ -0,0 +1,20 @@ +class AddOrderCycleIdToProxyOrders < ActiveRecord::Migration + def up + add_column :proxy_orders, :order_cycle_id, :integer + + ProxyOrder.find_each do |proxy_order| + order_cycle_id = proxy_order.order.order_cycle_id + proxy_order.update_attribute(:order_cycle_id, order_cycle_id) + end + + change_column :proxy_orders, :order_cycle_id, :integer, null: false + add_index :proxy_orders, [:order_cycle_id, :standing_order_id], unique: true + add_foreign_key :proxy_orders, :order_cycles + end + + def down + remove_foreign_key :proxy_orders, :order_cycles + remove_index :proxy_orders, :order_cycle_id + remove_column :proxy_orders, :order_cycle_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 74fa534a7d..39c850d0a2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -355,8 +355,10 @@ ActiveRecord::Schema.define(:version => 20170921065259) do t.datetime "canceled_at" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false + t.integer "order_cycle_id", :null => false end + add_index "proxy_orders", ["order_cycle_id", "standing_order_id"], :name => "index_proxy_orders_on_order_cycle_id_and_standing_order_id", :unique => true add_index "proxy_orders", ["order_id"], :name => "index_proxy_orders_on_order_id", :unique => true add_index "proxy_orders", ["standing_order_id"], :name => "index_proxy_orders_on_standing_order_id" @@ -1253,6 +1255,7 @@ ActiveRecord::Schema.define(:version => 20170921065259) do add_foreign_key "product_distributions", "enterprises", name: "product_distributions_distributor_id_fk", column: "distributor_id" add_foreign_key "product_distributions", "spree_products", name: "product_distributions_product_id_fk", column: "product_id" + add_foreign_key "proxy_orders", "order_cycles", name: "proxy_orders_order_cycle_id_fk" add_foreign_key "proxy_orders", "spree_orders", name: "order_id_fk", column: "order_id" add_foreign_key "proxy_orders", "standing_orders", name: "standing_order_id_fk" diff --git a/spec/controllers/admin/proxy_orders_controller_spec.rb b/spec/controllers/admin/proxy_orders_controller_spec.rb index 9556297611..d6a0c6522a 100644 --- a/spec/controllers/admin/proxy_orders_controller_spec.rb +++ b/spec/controllers/admin/proxy_orders_controller_spec.rb @@ -7,9 +7,8 @@ describe Admin::ProxyOrdersController, type: :controller do let!(:user) { create(:user, enterprise_limit: 10) } let!(:shop) { create(:distributor_enterprise) } let!(:order_cycle) { create(:simple_order_cycle, orders_close_at: 1.day.from_now) } - let!(:order) { create(:order, order_cycle: order_cycle) } - let!(:standing_order) { create(:standing_order_with_items, shop: shop, orders: [order]) } - let!(:proxy_order) { standing_order.proxy_orders.first } + let!(:standing_order) { create(:standing_order_with_items, shop: shop) } + let!(:proxy_order) { create(:proxy_order, standing_order: standing_order, order_cycle: order_cycle) } before do allow(controller).to receive(:spree_current_user) { user } @@ -68,12 +67,14 @@ describe Admin::ProxyOrdersController, type: :controller do let!(:shop) { create(:distributor_enterprise) } let!(:order_cycle) { create(:simple_order_cycle, orders_close_at: 1.day.from_now) } let!(:payment_method) { create(:payment_method) } - let!(:order) { create(:order, shipping_method: create(:shipping_method), order_cycle: order_cycle) } - let!(:standing_order) { create(:standing_order_with_items, shop: shop, orders: [order]) } - let!(:proxy_order) { standing_order.proxy_orders.first } + let!(:shipping_method) { create(:shipping_method) } + let!(:standing_order) { create(:standing_order_with_items, shop: shop) } + let!(:proxy_order) { create(:proxy_order, standing_order: standing_order, order_cycle: order_cycle) } + let(:order) { proxy_order.order } before do # Processing order to completion + order.update_attribute(:shipping_method_id, shipping_method.id) while !order.completed? do break unless order.next! end proxy_order.update_attribute(:canceled_at, Time.zone.now) order.cancel diff --git a/spec/controllers/admin/standing_orders_controller_spec.rb b/spec/controllers/admin/standing_orders_controller_spec.rb index 18e17b1f30..6d665f565f 100644 --- a/spec/controllers/admin/standing_orders_controller_spec.rb +++ b/spec/controllers/admin/standing_orders_controller_spec.rb @@ -377,9 +377,8 @@ describe Admin::StandingOrdersController, type: :controller do let!(:user) { create(:user, enterprise_limit: 10) } let!(:shop) { create(:distributor_enterprise) } let!(:order_cycle) { create(:simple_order_cycle, orders_close_at: 1.day.from_now) } - let!(:order) { create(:order, order_cycle: order_cycle) } - let!(:standing_order) { create(:standing_order_with_items, shop: shop, orders: [order]) } - let!(:proxy_order) { standing_order.proxy_orders.first } + let!(:standing_order) { create(:standing_order_with_items, shop: shop) } + let!(:proxy_order) { create(:proxy_order, standing_order: standing_order, order_cycle: order_cycle) } before do allow(controller).to receive(:spree_current_user) { user } diff --git a/spec/factories.rb b/spec/factories.rb index 2977c2ada6..3296913a9b 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -166,6 +166,16 @@ FactoryGirl.define do quantity 1 end + factory :proxy_order, :class => ProxyOrder do + standing_order + order + order_cycle + after(:create) do |proxy_order, proxy| + proxy_order.order.order_cycle = proxy_order.order_cycle + proxy_order.order.save! + end + end + factory :variant_override, :class => VariantOverride do price 77.77 count_on_hand 11111 diff --git a/spec/features/admin/standing_orders_spec.rb b/spec/features/admin/standing_orders_spec.rb index 525a72d5a8..c9fa35ab0a 100644 --- a/spec/features/admin/standing_orders_spec.rb +++ b/spec/features/admin/standing_orders_spec.rb @@ -19,9 +19,9 @@ feature 'Standing Orders' do before do # initialise standing orders - StandingOrderForm.new(standing_order).send(:initialise_orders!) - StandingOrderForm.new(standing_order2).send(:initialise_orders!) - StandingOrderForm.new(standing_order_unmanaged).send(:initialise_orders!) + StandingOrderForm.new(standing_order).send(:initialise_proxy_orders!) + StandingOrderForm.new(standing_order2).send(:initialise_proxy_orders!) + StandingOrderForm.new(standing_order_unmanaged).send(:initialise_proxy_orders!) end it "passes the smoke test" do diff --git a/spec/forms/standing_order_form_spec.rb b/spec/forms/standing_order_form_spec.rb index 0819cfcde9..ad5a304214 100644 --- a/spec/forms/standing_order_form_spec.rb +++ b/spec/forms/standing_order_form_spec.rb @@ -96,7 +96,7 @@ describe StandingOrderForm do let(:form) { StandingOrderForm.new(standing_order, params) } before do - form.send(:initialise_orders!) + form.send(:initialise_proxy_orders!) form.save end @@ -116,12 +116,12 @@ describe StandingOrderForm do let(:form) { StandingOrderForm.new(standing_order, params) } context "when the shipping method on an order is the same as the standing order" do - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "updates the shipping_method on the order and on shipments" do expect(order.shipments.first.shipping_method).to eq shipping_method form.save - expect(order.shipping_method).to eq new_shipping_method + expect(order.reload.shipping_method).to eq new_shipping_method expect(order.shipments.first.shipping_method).to eq new_shipping_method end end @@ -130,7 +130,7 @@ describe StandingOrderForm do let(:changed_shipping_method) { create(:shipping_method) } before do - form.send(:initialise_orders!) + form.send(:initialise_proxy_orders!) # Updating the shipping method on a shipment updates the shipping method on the order, # and vice-versa via logic in Spree's shipments controller. So updating both here mimics that # behaviour. @@ -155,7 +155,7 @@ describe StandingOrderForm do let(:form) { StandingOrderForm.new(standing_order, params) } context "when the payment method on an order is the same as the standing order" do - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "voids existing payments and creates a new payment with the relevant payment method" do expect(order.payments.reload.first.payment_method).to eq payment_method @@ -173,7 +173,7 @@ describe StandingOrderForm do let(:changed_payment_method) { create(:payment_method) } before do - form.send(:initialise_orders!) + form.send(:initialise_proxy_orders!) order.payments.first.update_attribute(:payment_method_id, changed_payment_method.id) form.save end @@ -191,7 +191,7 @@ describe StandingOrderForm do let(:params) { { begins_at: 1.year.from_now, ends_at: 2.years.from_now } } let(:form) { StandingOrderForm.new(standing_order, params) } - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "removes orders outside the newly specified date range" do expect(standing_order.reload.orders.count).to be 1 @@ -213,7 +213,7 @@ describe StandingOrderForm do context "when quantity is less than available stock" do let(:params) { { standing_line_items_attributes: [ { id: sli.id, quantity: 2} ] } } let(:form) { StandingOrderForm.new(standing_order, params) } - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "updates the line_item quantities and totals on all orders" do expect(standing_order.orders.first.reload.total.to_f).to eq 59.97 @@ -227,7 +227,7 @@ describe StandingOrderForm do context "when quantity is greater than available stock" do let(:params) { { standing_line_items_attributes: [ { id: sli.id, quantity: 3} ] } } let(:form) { StandingOrderForm.new(standing_order, params) } - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "updates the line_item quantities and totals on all orders" do expect(standing_order.orders.first.reload.total.to_f).to eq 59.97 @@ -248,7 +248,7 @@ describe StandingOrderForm do before do order_cycle.variants << variant - form.send(:initialise_orders!) + form.send(:initialise_proxy_orders!) end it "add the line item and updates the total on all orders" do @@ -267,7 +267,7 @@ describe StandingOrderForm do let(:params) { { standing_line_items_attributes: [ { id: sli.id, _destroy: true } ] } } let(:form) { StandingOrderForm.new(standing_order, params) } - before { form.send(:initialise_orders!) } + before { form.send(:initialise_proxy_orders!) } it "removes the line item and updates totals on all orders" do expect(standing_order.orders.first.reload.total.to_f).to eq 59.97 diff --git a/spec/jobs/standing_order_confirm_job_spec.rb b/spec/jobs/standing_order_confirm_job_spec.rb index aa40138c8f..0543fbcc60 100644 --- a/spec/jobs/standing_order_confirm_job_spec.rb +++ b/spec/jobs/standing_order_confirm_job_spec.rb @@ -9,17 +9,15 @@ describe StandingOrderConfirmJob do let!(:job) { StandingOrderConfirmJob.new(order_cycle1) } describe "finding standing_order orders for the specified order cycle" do - let(:order1) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches - let(:order2) { create(:order, order_cycle: order_cycle1, completed_at: 5.minutes.ago) } # Complete + Not-Linked + OC Matches - let(:order3) { create(:order, order_cycle: order_cycle2, completed_at: 5.minutes.ago) } # Complete + Linked + OC Mismatch - let(:order4) { create(:order, order_cycle: order_cycle1, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches + Cancelled - let(:order5) { create(:order, order_cycle: order_cycle1, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches - let(:cancelled_proxy_order) { standing_order1.proxy_orders.find_by_order_id(order4.id) } - - before do - standing_order1.orders = [order1, order3, order4, order5] - cancelled_proxy_order.update_attribute(:canceled_at, 1.minute.ago) - end + let(:order1) { create(:order) } # Incomplete + Linked + OC Matches + let(:order2) { create(:order, completed_at: 5.minutes.ago) } # Complete + Not-Linked + OC Matches + let(:order3) { create(:order, completed_at: 5.minutes.ago) } # Complete + Linked + OC Mismatch + let(:order4) { create(:order, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches + Cancelled + let(:order5) { create(:order, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches + let!(:proxy_order1) { create(:proxy_order, order_cycle: order_cycle1, standing_order: standing_order1, order: order1) } + let!(:proxy_order3) { create(:proxy_order, order_cycle: order_cycle2, standing_order: standing_order1, order: order3) } + let!(:proxy_order4) { create(:proxy_order, order_cycle: order_cycle1, standing_order: standing_order1, order: order4, canceled_at: 1.minute.ago) } + let!(:proxy_order5) { create(:proxy_order, order_cycle: order_cycle1, standing_order: standing_order1, order: order5) } it "only returns incomplete orders in the relevant order cycle that are linked to a standing order" do orders = job.send(:orders) @@ -28,13 +26,13 @@ describe StandingOrderConfirmJob do end end - describe "processing a standing order order" do + describe "processing an order" do let(:order) { standing_order1.orders.first } before do form = StandingOrderForm.new(standing_order1) - form.send(:initialise_orders!) - while !standing_order1.orders.first.completed? do break unless order.next! end + form.send(:initialise_proxy_orders!) + while !order.completed? do break unless order.next! end allow(job).to receive(:send_confirm_email).and_call_original Spree::MailMethod.create!( environment: Rails.env, diff --git a/spec/jobs/standing_order_placement_job_spec.rb b/spec/jobs/standing_order_placement_job_spec.rb index 7ce041af70..cf507c0e57 100644 --- a/spec/jobs/standing_order_placement_job_spec.rb +++ b/spec/jobs/standing_order_placement_job_spec.rb @@ -14,30 +14,27 @@ describe StandingOrderPlacementJob do let!(:job) { StandingOrderPlacementJob.new(order_cycle1) } describe "finding standing_order orders for the specified order cycle" do - let(:order1) { create(:order, order_cycle: order_cycle1, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches - let(:order2) { create(:order, order_cycle: order_cycle1) } # Incomplete + Not-Linked + OC Matches - let(:order3) { create(:order, order_cycle: order_cycle2) } # Incomplete + Linked + OC Mismatch - let(:order4) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Paused - let(:order5) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Cancelled - let(:order6) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Yet To Begin - let(:order7) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches + Ended - let(:order8) { create(:order, order_cycle: order_cycle1) } # Incomplete + Linked + OC Matches - - before do - standing_order1.orders = [order1, order3, order8] - standing_order2.orders = [order4] - standing_order3.orders = [order5] - standing_order4.orders = [order6] - standing_order5.orders = [order7] - end + let(:order1) { create(:order, completed_at: 5.minutes.ago) } # Complete + Linked + OC Matches + let(:order2) { create(:order) } # Incomplete + Not-Linked + OC Matches + let(:order3) { create(:order) } # Incomplete + Linked + OC Mismatch + let(:order4) { create(:order) } # Incomplete + Linked + OC Matches + Paused + let(:order5) { create(:order) } # Incomplete + Linked + OC Matches + Cancelled + let(:order6) { create(:order) } # Incomplete + Linked + OC Matches + Yet To Begin + let(:order7) { create(:order) } # Incomplete + Linked + OC Matches + Ended + let(:order8) { create(:order) } # Incomplete + Linked + OC Matches + let!(:proxy_order1) { create(:proxy_order, standing_order: standing_order1, order: order1, order_cycle: order_cycle1) } + let!(:proxy_order3) { create(:proxy_order, standing_order: standing_order1, order: order3, order_cycle: order_cycle2) } + let!(:proxy_order4) { create(:proxy_order, standing_order: standing_order2, order: order4, order_cycle: order_cycle1) } + let!(:proxy_order5) { create(:proxy_order, standing_order: standing_order3, order: order5, order_cycle: order_cycle1) } + let!(:proxy_order6) { create(:proxy_order, standing_order: standing_order4, order: order6, order_cycle: order_cycle1) } + let!(:proxy_order7) { create(:proxy_order, standing_order: standing_order5, order: order7, order_cycle: order_cycle1) } + let!(:proxy_order8) { create(:proxy_order, standing_order: standing_order1, order: order8, order_cycle: order_cycle1) } it "only returns incomplete orders in the relevant order cycle that are linked to a standing order" do orders = job.send(:orders) expect(orders).to include order8 expect(orders).to_not include order1, order2, order3, order4, order5, order6, order7 end - - end describe "processing an order containing items with insufficient stock" do @@ -71,7 +68,7 @@ describe StandingOrderPlacementJob do before do form = StandingOrderForm.new(standing_order1) - form.send(:initialise_orders!) + form.send(:initialise_proxy_orders!) expect_any_instance_of(Spree::Payment).to_not receive(:process!) allow(job).to receive(:cap_quantity_and_store_changes) { changes } allow(job).to receive(:send_placement_email).and_call_original diff --git a/spec/jobs/standing_order_sync_job_spec.rb b/spec/jobs/standing_order_sync_job_spec.rb index ee2525343f..bcac9be1fc 100644 --- a/spec/jobs/standing_order_sync_job_spec.rb +++ b/spec/jobs/standing_order_sync_job_spec.rb @@ -31,14 +31,14 @@ describe StandingOrderSyncJob do before do allow(job).to receive(:standing_orders) { [standing_order] } allow(StandingOrderForm).to receive(:new) { form } - allow(form).to receive(:initialise_orders!) - allow(form).to receive(:remove_obsolete_orders!) + allow(form).to receive(:initialise_proxy_orders!) + allow(form).to receive(:remove_obsolete_proxy_orders!) end - it "calls initialize_orders! and remove_obsolete_orders! on each form" do + it "calls initialize_orders! and remove_obsolete_proxy_orders! on each form" do job.perform - expect(form).to have_received(:initialise_orders!).once - expect(form).to have_received(:remove_obsolete_orders!).once + expect(form).to have_received(:initialise_proxy_orders!).once + expect(form).to have_received(:remove_obsolete_proxy_orders!).once end end end diff --git a/spec/models/proxy_order_spec.rb b/spec/models/proxy_order_spec.rb index d194a99a29..23dbfc4281 100644 --- a/spec/models/proxy_order_spec.rb +++ b/spec/models/proxy_order_spec.rb @@ -3,14 +3,14 @@ require 'spec_helper' describe ProxyOrder, type: :model do describe "cancel" do let(:order_cycle) { create(:simple_order_cycle) } - let(:standing_order) { create(:standing_order, orders: [order]) } - let(:proxy_order) { standing_order.proxy_orders.first } + let(:standing_order) { create(:standing_order) } - context "when the order cycle for the order is not yet closed" do + 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 already been completed" do - let(:order) { create(:completed_order_with_totals, order_cycle: order_cycle) } + 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 @@ -20,7 +20,8 @@ describe ProxyOrder, type: :model do end context "and the order has not already been completed" do - let(:order) { create(:order, order_cycle: order_cycle) } + 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 @@ -30,8 +31,9 @@ describe ProxyOrder, type: :model do end end - context "when the order cycle for the order is already closed" do - let(:order) { create(:order, order_cycle: order_cycle) } + 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) } @@ -41,24 +43,15 @@ describe ProxyOrder, type: :model do expect(order.reload.state).to eq 'cart' end end - - context "when the order cycle for the order does not exist" 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 describe "resume" do let(:order_cycle) { create(:simple_order_cycle) } let!(:payment_method) { create(:payment_method) } - let(:order) { create(:order_with_totals, shipping_method: create(:shipping_method), order_cycle: order_cycle) } - let(:standing_order) { create(:standing_order, orders: [order]) } - let(:proxy_order) { standing_order.proxy_orders.first } + let(:standing_order) { create(:standing_order) } + let(:order) { create(:order_with_totals, shipping_method: create(:shipping_method)) } + let(:proxy_order) { create(:proxy_order, standing_order: standing_order, order: order, order_cycle: order_cycle) } + before do # Processing order to completion @@ -66,7 +59,7 @@ describe ProxyOrder, type: :model do proxy_order.update_attribute(:canceled_at, Time.zone.now) end - context "when the order cycle for the order is not yet closed" do + 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 already been cancelled" do @@ -88,7 +81,7 @@ describe ProxyOrder, type: :model do end end - context "when the order cycle for the order is already closed" 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 been cancelled" do diff --git a/spec/models/standing_order_spec.rb b/spec/models/standing_order_spec.rb index 27d577eabe..327546175c 100644 --- a/spec/models/standing_order_spec.rb +++ b/spec/models/standing_order_spec.rb @@ -87,9 +87,9 @@ describe StandingOrder, type: :model do end describe "cancel" do - let!(:standing_order) { create(:standing_order, orders: [create(:order), create(:order)]) } - let!(:proxy_order1) { standing_order.proxy_orders.first } - let!(:proxy_order2) { standing_order.proxy_orders.last } + let!(:standing_order) { create(:standing_order) } + let!(:proxy_order1) { create(:proxy_order, order_cycle: create(:simple_order_cycle)) } + let!(:proxy_order2) { create(:proxy_order, order_cycle: create(:simple_order_cycle)) } before do allow(standing_order).to receive(:proxy_orders) { [proxy_order1, proxy_order2] }