From e28a4508759facdf668b17ec740da0c15413848c Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 4 Apr 2014 13:28:46 +1100 Subject: [PATCH] Add API call to soft-delete a variant --- .../api/variants_controller_decorator.rb | 13 ++++++++++++ config/routes.rb | 4 ++++ lib/spree/api/testing_support/setup.rb | 19 +++++++++++++++++ .../spree/api/variants_controller_spec.rb | 21 +++++++++++++++---- spec/spec_helper.rb | 4 ++++ 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 app/controllers/spree/api/variants_controller_decorator.rb create mode 100644 lib/spree/api/testing_support/setup.rb diff --git a/app/controllers/spree/api/variants_controller_decorator.rb b/app/controllers/spree/api/variants_controller_decorator.rb new file mode 100644 index 0000000000..476d3c1543 --- /dev/null +++ b/app/controllers/spree/api/variants_controller_decorator.rb @@ -0,0 +1,13 @@ +Spree::Api::VariantsController.class_eval do + def soft_delete + @variant = scope.find(params[:id]) + authorize! :delete, @variant + + @variant.deleted_at = Time.now() + if @variant.save + respond_with(@variant, :status => 204) + else + invalid_resource!(@variant) + end + end +end diff --git a/config/routes.rb b/config/routes.rb index b2ad6b0eeb..4ca341db37 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -110,6 +110,10 @@ Spree::Core::Engine.routes.prepend do get :managed, on: :collection end + resources :variants do + delete :soft_delete + end + resources :orders do get :managed, on: :collection end diff --git a/lib/spree/api/testing_support/setup.rb b/lib/spree/api/testing_support/setup.rb new file mode 100644 index 0000000000..a54e45a46b --- /dev/null +++ b/lib/spree/api/testing_support/setup.rb @@ -0,0 +1,19 @@ +module Spree + module Api + module TestingSupport + module Setup + def sign_in_as_admin! + let!(:current_api_user) do + user = stub_model(Spree::LegacyUser) + user.should_receive(:has_spree_role?).any_number_of_times.with("admin").and_return(true) + + # Stub enterprises, needed for cancan ability checks + user.stub(:enterprises) { [] } + + user + end + end + end + end + end +end diff --git a/spec/controllers/spree/api/variants_controller_spec.rb b/spec/controllers/spree/api/variants_controller_spec.rb index c61928e1bb..66806798fc 100644 --- a/spec/controllers/spree/api/variants_controller_spec.rb +++ b/spec/controllers/spree/api/variants_controller_spec.rb @@ -1,11 +1,9 @@ require 'spec_helper' -require 'spree/api/testing_support/helpers' module Spree describe Spree::Api::VariantsController do - include Spree::Api::TestingSupport::Helpers render_views - + let!(:variant1) { FactoryGirl.create(:variant) } let!(:variant2) { FactoryGirl.create(:variant) } let!(:variant3) { FactoryGirl.create(:variant) } @@ -29,6 +27,7 @@ module Spree keys = json_response.keys.map{ |key| key.to_sym } unit_attributes.all?{ |attr| keys.include? attr }.should == true end + #it "sorts variants in ascending id order" do # spree_get :index, { :template => 'bulk_index', :format => :json } # ids = json_response.map{ |variant| variant['id'] } @@ -36,5 +35,19 @@ module Spree # ids[1].should < ids[2] #end end + + context "as an administrator" do + sign_in_as_admin! + + it "soft deletes a variant" do + product = create(:product) + variant = product.master + + spree_delete :soft_delete, {id: variant.to_param, product_id: product.to_param, format: :json} + response.status.should == 204 + lambda { variant.reload }.should_not raise_error(ActiveRecord::RecordNotFound) + variant.deleted_at.should_not be_nil + end + end end -end \ No newline at end of file +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 76d72d7291..121e827169 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -23,6 +23,8 @@ WebMock.disable_net_connect!(:allow_localhost => true) Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} require 'spree/core/testing_support/controller_requests' require 'spree/core/testing_support/capybara_ext' +require 'spree/api/testing_support/setup' +require 'spree/api/testing_support/helpers' require 'active_record/fixtures' fixtures_dir = File.expand_path('../../db/default', __FILE__) @@ -92,6 +94,8 @@ RSpec.configure do |config| config.include Spree::CheckoutHelpers config.include Spree::Core::TestingSupport::ControllerRequests, :type => :controller config.include Devise::TestHelpers, :type => :controller + config.extend Spree::Api::TestingSupport::Setup, :type => :controller + config.include Spree::Api::TestingSupport::Helpers, :type => :controller config.include OpenFoodNetwork::FeatureToggleHelper config.include OpenFoodNetwork::EnterpriseGroupsHelper config.include OpenFoodNetwork::DistributionHelper