From a6f0d8f69a0ec574a2bf643dc629f043a31705a5 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Mon, 16 Mar 2015 12:42:35 +1100 Subject: [PATCH] Show a nice error message instead of 500 error when deleting a referenced order cycle --- app/controllers/admin/order_cycles_controller.rb | 11 +++++++++++ .../admin/order_cycles_controller_spec.rb | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/app/controllers/admin/order_cycles_controller.rb b/app/controllers/admin/order_cycles_controller.rb index 435be5b38e..d705cc720c 100644 --- a/app/controllers/admin/order_cycles_controller.rb +++ b/app/controllers/admin/order_cycles_controller.rb @@ -7,6 +7,8 @@ module Admin before_filter :load_data_for_index, :only => :index before_filter :require_coordinator, only: :new + around_filter :protect_invalid_destroy, only: :destroy + def show respond_to do |format| @@ -106,5 +108,14 @@ module Admin render :set_coordinator end end + + def protect_invalid_destroy + begin + yield + rescue ActiveRecord::InvalidForeignKey + redirect_to main_app.admin_order_cycles_url + flash[:error] = "That order cycle has been selected by a customer and cannot be deleted. To prevent customers from accessing it, please close it instead." + end + end end end diff --git a/spec/controllers/admin/order_cycles_controller_spec.rb b/spec/controllers/admin/order_cycles_controller_spec.rb index 598059b5f4..b58884086c 100644 --- a/spec/controllers/admin/order_cycles_controller_spec.rb +++ b/spec/controllers/admin/order_cycles_controller_spec.rb @@ -56,5 +56,21 @@ module Admin end end end + + describe "destroy" do + let!(:distributor) { create(:distributor_enterprise, owner: distributor_owner) } + + describe "when an order cycle becomes non-deletable, and we attempt to delete it" do + let!(:oc) { create(:simple_order_cycle, coordinator: distributor) } + let!(:order) { create(:order, order_cycle: oc) } + + before { spree_get :destroy, id: oc.id } + + it "displays an error message" do + expect(response).to redirect_to admin_order_cycles_path + expect(flash[:error]).to eq "That order cycle has been selected by a customer and cannot be deleted. To prevent customers from accessing it, please close it instead." + end + end + end end end