diff --git a/app/assets/javascripts/admin/standing_orders/controllers/orders_panel_controller.js.coffee b/app/assets/javascripts/admin/standing_orders/controllers/orders_panel_controller.js.coffee index bcd2ba8910..e2947aadb4 100644 --- a/app/assets/javascripts/admin/standing_orders/controllers/orders_panel_controller.js.coffee +++ b/app/assets/javascripts/admin/standing_orders/controllers/orders_panel_controller.js.coffee @@ -5,6 +5,10 @@ angular.module("admin.standingOrders").controller "OrdersPanelController", ($sco if confirm(t('are_you_sure')) $scope.standingOrder.cancelOrder(order) + $scope.resumeOrder = (order) -> + if confirm(t('are_you_sure')) + $scope.standingOrder.resumeOrder(order) + $scope.orderCycleName = (id) -> OrderCycles.byID[id].name diff --git a/app/models/spree/ability_decorator.rb b/app/models/spree/ability_decorator.rb index d2cb409418..3d1024b16e 100644 --- a/app/models/spree/ability_decorator.rb +++ b/app/models/spree/ability_decorator.rb @@ -260,7 +260,7 @@ class AbilityDecorator can [:destroy], StandingLineItem do |standing_line_item| user.enterprises.include?(standing_line_item.standing_order.shop) end - can [:admin, :cancel], StandingOrderOrder do |standing_order_order| + can [:admin, :cancel, :resume], StandingOrderOrder do |standing_order_order| user.enterprises.include?(standing_order_order.standing_order.shop) end end diff --git a/config/routes.rb b/config/routes.rb index 64a1b436c3..825e5a905c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -185,6 +185,7 @@ Openfoodnetwork::Application.routes.draw do resources :standing_order_orders, only: [], format: :json do put :cancel, on: :member + put :resume, on: :member end end diff --git a/spec/controllers/admin/standing_order_orders_controller_spec.rb b/spec/controllers/admin/standing_order_orders_controller_spec.rb index 8f0b420e2a..1c989ff681 100644 --- a/spec/controllers/admin/standing_order_orders_controller_spec.rb +++ b/spec/controllers/admin/standing_order_orders_controller_spec.rb @@ -62,4 +62,69 @@ describe Admin::StandingOrderOrdersController, type: :controller do end end end + + describe 'resume' 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!(: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!(:standing_order_order) { standing_order.standing_order_orders.first } + + before do + # Processing order to completion + while !order.completed? do break unless order.next! end + standing_order_order.update_attribute(:cancelled_at, Time.zone.now) + order.cancel + allow(controller).to receive(:spree_current_user) { user } + end + + context 'json' do + let(:params) { { format: :json, id: standing_order_order.id } } + + context 'as a regular user' do + it 'redirects to unauthorized' do + spree_put :resume, params + expect(response).to redirect_to spree.unauthorized_path + end + end + + context 'as an enterprise user' do + context "without authorisation" do + let!(:shop2) { create(:distributor_enterprise) } + before { shop2.update_attributes(owner: user) } + + it 'redirects to unauthorized' do + spree_put :resume, params + expect(response).to redirect_to spree.unauthorized_path + end + end + + context "with authorisation" do + before { shop.update_attributes(owner: user) } + + context "when resuming succeeds" do + it 'renders the resumed standing_order_order as json' do + spree_get :resume, params + json_response = JSON.parse(response.body) + expect(json_response['status']).to eq "resumed" + expect(json_response['id']).to eq standing_order_order.id + expect(standing_order_order.reload.cancelled_at).to be nil + end + end + + context "when resuming fails" do + before { order_cycle.update_attributes(orders_close_at: 1.day.ago) } + + it "shows an error" do + spree_get :resume, params + json_response = JSON.parse(response.body) + expect(json_response['errors']).to eq ['Could not resume the order'] + end + end + end + end + end + end end