spree_api 2.4.10 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -2
  3. data/app/controllers/spree/api/base_controller.rb +9 -3
  4. data/app/controllers/spree/api/checkouts_controller.rb +4 -4
  5. data/app/controllers/spree/api/countries_controller.rb +3 -3
  6. data/app/controllers/spree/api/images_controller.rb +2 -2
  7. data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
  8. data/app/controllers/spree/api/option_values_controller.rb +1 -1
  9. data/app/controllers/spree/api/orders_controller.rb +6 -14
  10. data/app/controllers/spree/api/payments_controller.rb +5 -5
  11. data/app/controllers/spree/api/product_properties_controller.rb +1 -1
  12. data/app/controllers/spree/api/products_controller.rb +5 -5
  13. data/app/controllers/spree/api/properties_controller.rb +2 -2
  14. data/app/controllers/spree/api/return_authorizations_controller.rb +4 -4
  15. data/app/controllers/spree/api/shipments_controller.rb +4 -4
  16. data/app/controllers/spree/api/states_controller.rb +2 -2
  17. data/app/controllers/spree/api/stock_items_controller.rb +4 -4
  18. data/app/controllers/spree/api/stock_locations_controller.rb +5 -5
  19. data/app/controllers/spree/api/stock_movements_controller.rb +3 -3
  20. data/app/controllers/spree/api/stores_controller.rb +5 -5
  21. data/app/controllers/spree/api/taxonomies_controller.rb +4 -4
  22. data/app/controllers/spree/api/taxons_controller.rb +3 -3
  23. data/app/controllers/spree/api/users_controller.rb +3 -3
  24. data/app/controllers/spree/api/variants_controller.rb +3 -3
  25. data/app/controllers/spree/api/zones_controller.rb +7 -4
  26. data/app/helpers/spree/api/api_helpers.rb +1 -1
  27. data/app/views/spree/api/config/money.v1.rabl +0 -4
  28. data/app/views/spree/api/orders/payment.v1.rabl +1 -1
  29. data/app/views/spree/api/orders/show.v1.rabl +5 -1
  30. data/app/views/spree/api/products/show.v1.rabl +1 -0
  31. data/app/views/spree/api/taxonomies/show.v1.rabl +2 -2
  32. data/app/views/spree/api/variants/big.v1.rabl +6 -0
  33. data/app/views/spree/api/variants/small.v1.rabl +0 -1
  34. data/config/routes.rb +5 -1
  35. data/lib/spree/api/responders/rabl_template.rb +3 -4
  36. data/lib/spree/api/testing_support/helpers.rb +1 -1
  37. data/spec/controllers/spree/api/base_controller_spec.rb +16 -2
  38. data/spec/controllers/spree/api/config_controller_spec.rb +1 -5
  39. data/spec/controllers/spree/api/line_items_controller_spec.rb +3 -4
  40. data/spec/controllers/spree/api/orders_controller_spec.rb +1 -28
  41. data/spec/controllers/spree/api/payments_controller_spec.rb +21 -26
  42. data/spec/controllers/spree/api/product_properties_controller_spec.rb +1 -1
  43. data/spec/controllers/spree/api/products_controller_spec.rb +54 -7
  44. data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +2 -2
  45. data/spec/controllers/spree/api/stock_items_controller_spec.rb +4 -2
  46. data/spec/controllers/spree/api/stock_movements_controller_spec.rb +0 -6
  47. data/spec/controllers/spree/api/users_controller_spec.rb +17 -17
  48. data/spec/controllers/spree/api/variants_controller_spec.rb +2 -5
  49. data/spec/controllers/spree/api/zones_controller_spec.rb +26 -0
  50. data/spec/spec_helper.rb +3 -4
  51. data/spec/support/controller_hacks.rb +7 -5
  52. data/spree_api.gemspec +2 -1
  53. metadata +9 -10
  54. data/spec/requests/ransackable_attributes_spec.rb +0 -79
@@ -6,7 +6,7 @@ module Spree
6
6
  let!(:order) { create(:order) }
7
7
  let!(:payment) { create(:payment, :order => order) }
8
8
  let!(:attributes) { [:id, :source_type, :source_id, :amount, :display_amount,
9
- :payment_method_id, :state, :avs_response,
9
+ :payment_method_id, :response_code, :state, :avs_response,
10
10
  :created_at, :updated_at] }
11
11
 
12
12
  let(:resource_scoping) { { :order_id => order.to_param } }
@@ -82,7 +82,7 @@ module Spree
82
82
  end
83
83
 
84
84
  context "multiple payments" do
85
- before { @payment = create(:payment, :order => order) }
85
+ before { @payment = create(:payment, :order => order, :response_code => '99999') }
86
86
 
87
87
  it "can view all payments on an order" do
88
88
  api_get :index
@@ -95,41 +95,36 @@ module Spree
95
95
  expect(json_response['current_page']).to eq(1)
96
96
  expect(json_response['pages']).to eq(2)
97
97
  end
98
+
99
+ it 'can query the results through a paramter' do
100
+ api_get :index, :q => { :response_code_cont => '999' }
101
+ expect(json_response['count']).to eq(1)
102
+ expect(json_response['payments'].first['response_code']).to eq @payment.response_code
103
+ end
98
104
  end
99
105
 
100
106
  context "for a given payment" do
101
107
  context "updating" do
102
- context "when the state is checkout" do
103
- it "can update" do
104
- payment.update_attributes(state: 'checkout')
105
- api_put(:update, id: payment.to_param, payment: { amount: 2.01 })
106
- expect(response.status).to be(200)
107
- expect(payment.reload.amount).to eq(2.01)
108
- end
109
- end
110
-
111
- context "when the state is pending" do
112
- it "can update" do
113
- payment.update_attributes(state: 'pending')
114
- api_put(:update, id: payment.to_param, payment: { amount: 2.01 })
115
- expect(response.status).to be(200)
116
- expect(payment.reload.amount).to eq(2.01)
117
- end
108
+ it "can update" do
109
+ payment.update_attributes(:state => 'pending')
110
+ api_put :update, :id => payment.to_param, :payment => { :amount => 2.01 }
111
+ expect(response.status).to eq(200)
112
+ expect(payment.reload.amount).to eq(2.01)
118
113
  end
119
114
 
120
115
  context "update fails" do
121
116
  it "returns a 422 status when the amount is invalid" do
122
- payment.update_attributes(state: 'pending')
123
- api_put(:update, id: payment.to_param, payment: { amount: 'invalid' })
124
- expect(response.status).to be(422)
125
- expect(json_response['error']).to eql('Invalid resource. Please fix errors and try again.')
117
+ payment.update_attributes(:state => 'pending')
118
+ api_put :update, :id => payment.to_param, :payment => { :amount => 'invalid' }
119
+ expect(response.status).to eq(422)
120
+ expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
126
121
  end
127
122
 
128
123
  it "returns a 403 status when the payment is not pending" do
129
- payment.update_attributes(state: 'completed')
130
- api_put(:update, id: payment.to_param, payment: { amount: 2.01 })
131
- expect(response.status).to be(403)
132
- expect(json_response['error']).to eql('This payment cannot be updated because it is completed.')
124
+ payment.update_attributes(:state => 'completed')
125
+ api_put :update, :id => payment.to_param, :payment => { :amount => 2.01 }
126
+ expect(response.status).to eq(403)
127
+ expect(json_response["error"]).to eq("This payment cannot be updated because it is completed.")
133
128
  end
134
129
  end
135
130
  end
@@ -70,7 +70,7 @@ module Spree
70
70
  end
71
71
 
72
72
  it "cannot delete a product property" do
73
- api_delete :destroy, :property_name => property_1.property_name
73
+ api_delete :destroy, id: property_1.to_param, :property_name => property_1.property_name
74
74
  assert_unauthorized!
75
75
  expect { property_1.reload }.not_to raise_error
76
76
  end
@@ -67,6 +67,45 @@ module Spree
67
67
  expect(json_response["per_page"]).to eq(Kaminari.config.default_per_page)
68
68
  end
69
69
 
70
+ context "specifying a rabl template for a custom action" do
71
+ before do
72
+ Spree::Api::ProductsController.class_eval do
73
+ def custom_show
74
+ @product = find_product(params[:id])
75
+ respond_with(@product)
76
+ end
77
+ end
78
+ end
79
+
80
+ def set_custom_route
81
+ @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
82
+ r.draw { get 'custom_show' => 'spree/api/products#custom_show' }
83
+ end
84
+ end
85
+
86
+ it "uses the specified custom template through the request header" do
87
+ set_custom_route
88
+
89
+ request.headers['X-Spree-Template'] = 'show'
90
+ api_get :custom_show, :id => product.id
91
+ expect(response).to render_template('spree/api/products/show')
92
+ end
93
+
94
+ it "uses the specified custom template through the template URL parameter" do
95
+ set_custom_route
96
+
97
+ api_get :custom_show, :id => product.id, :template => 'show'
98
+ expect(response).to render_template('spree/api/products/show')
99
+ end
100
+
101
+ it "falls back to the default template if the specified template does not exist" do
102
+ request.headers['X-Spree-Template'] = 'invoice'
103
+
104
+ api_get :show, :id => product.id
105
+ expect(response).to render_template('spree/api/products/show')
106
+ end
107
+ end
108
+
70
109
  context "product has more than one price" do
71
110
  before { product.master.prices.create currency: "EUR", amount: 22 }
72
111
 
@@ -117,6 +156,21 @@ module Spree
117
156
  end
118
157
  end
119
158
 
159
+ context "jsonp" do
160
+ it "retrieves a list of products of jsonp" do
161
+ api_get :index, {:callback => 'callback'}
162
+ expect(response.body).to match(/^callback\(.*\)$/)
163
+ expect(response.header['Content-Type']).to include('application/javascript')
164
+ end
165
+
166
+ # Regression test for #4332
167
+ it "does not escape quotes" do
168
+ api_get :index, {:callback => 'callback'}
169
+ expect(response.body).to match(/^callback\({"count":1,"total_count":1/)
170
+ expect(response.header['Content-Type']).to include('application/javascript')
171
+ end
172
+ end
173
+
120
174
  it "can search for products" do
121
175
  create(:product, :name => "The best product in the world")
122
176
  api_get :index, :q => { :name_cont => "best" }
@@ -287,13 +341,6 @@ module Spree
287
341
  expect(json_response['option_types'].count).to eq(2)
288
342
  end
289
343
 
290
- it "creates product with option_types ids" do
291
- option_type = create(:option_type)
292
- product_data.merge!(option_type_ids: [option_type.id])
293
- api_post :create, product: product_data
294
- expect(json_response['option_types'].first['id']).to eq option_type.id
295
- end
296
-
297
344
  it "creates with shipping categories" do
298
345
  hash = { :name => "The Other Product",
299
346
  :price => 19.99,
@@ -40,12 +40,12 @@ module Spree
40
40
  end
41
41
 
42
42
  it "cannot update a return authorization" do
43
- api_put :update
43
+ api_put :update, id: 1
44
44
  assert_not_found!
45
45
  end
46
46
 
47
47
  it "cannot delete a return authorization" do
48
- api_delete :destroy
48
+ api_delete :destroy, id: 1
49
49
  assert_not_found!
50
50
  end
51
51
  end
@@ -39,12 +39,14 @@ module Spree
39
39
  end
40
40
 
41
41
  it "cannot update a stock item" do
42
- api_put :update, stock_location_id: stock_location.to_param, stock_item_id: stock_item.to_param
42
+ api_put :update, stock_location_id: stock_location.to_param,
43
+ id: stock_item.to_param
43
44
  expect(response.status).to eq(404)
44
45
  end
45
46
 
46
47
  it "cannot destroy a stock item" do
47
- api_delete :destroy, stock_location_id: stock_location.to_param, stock_item_id: stock_item.to_param
48
+ api_delete :destroy, stock_location_id: stock_location.to_param,
49
+ id: stock_item.to_param
48
50
  expect(response.status).to eq(404)
49
51
  end
50
52
  end
@@ -46,12 +46,6 @@ module Spree
46
46
  expect(json_response['stock_movements'].first['stock_item']['count_on_hand']).to eq 11
47
47
  end
48
48
 
49
- it 'requires a stock_location_id to be passed as a parameter' do
50
- api_get :index
51
- expect(json_response['error']).to match(/stock_location_id parameter must be provided/)
52
- expect(response.status).to eq(422)
53
- end
54
-
55
49
  it 'can control the page size through a parameter' do
56
50
  create(:stock_movement, stock_item: stock_item)
57
51
  api_get :index, stock_location_id: stock_location.to_param, per_page: 1
@@ -4,40 +4,42 @@ module Spree
4
4
  describe Api::UsersController, :type => :controller do
5
5
  render_views
6
6
 
7
- let(:user) { create(:user, spree_api_key: rand.to_s) }
7
+ let(:user) { create(:user) }
8
8
  let(:stranger) { create(:user, :email => 'stranger@example.com') }
9
9
  let(:attributes) { [:id, :email, :created_at, :updated_at] }
10
10
 
11
+ before { stub_authentication! }
12
+
11
13
  context "as a normal user" do
14
+ before do
15
+ allow(controller).to receive_messages :try_spree_current_user => user
16
+ end
17
+
12
18
  it "can get own details" do
13
- api_get :show, id: user.id, token: user.spree_api_key
19
+ api_get :show, :id => user.id
14
20
 
15
21
  expect(json_response['email']).to eq user.email
16
22
  end
17
23
 
18
24
  it "cannot get other users details" do
19
- api_get :show, id: stranger.id, token: user.spree_api_key
25
+ api_get :show, :id => stranger.id
20
26
 
21
27
  assert_not_found!
22
28
  end
23
29
 
24
30
  it "can learn how to create a new user" do
25
- api_get :new, token: user.spree_api_key
31
+ api_get :new
26
32
  expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
27
33
  end
28
34
 
29
35
  it "can create a new user" do
30
- user_params = {
31
- :email => 'new@example.com', :password => 'spree123', :password_confirmation => 'spree123'
32
- }
33
-
34
- api_post :create, :user => user_params, token: user.spree_api_key
36
+ api_post :create, :user => { :email => 'new@example.com', :password => 'spree123', :password_confirmation => 'spree123' }
35
37
  expect(json_response['email']).to eq 'new@example.com'
36
38
  end
37
39
 
38
40
  # there's no validations on LegacyUser?
39
41
  xit "cannot create a new user with invalid attributes" do
40
- api_post :create, :user => {}, token: user.spree_api_key
42
+ api_post :create, :user => {}
41
43
  expect(response.status).to eq(422)
42
44
  expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
43
45
  errors = json_response["errors"]
@@ -45,7 +47,7 @@ module Spree
45
47
 
46
48
  it "can update own details" do
47
49
  country = create(:country)
48
- api_put :update, id: user.id, token: user.spree_api_key, user: {
50
+ api_put :update, id: user.id, user: {
49
51
  email: "mine@example.com",
50
52
  bill_address_attributes: {
51
53
  first_name: 'First',
@@ -74,23 +76,23 @@ module Spree
74
76
  end
75
77
 
76
78
  it "cannot update other users details" do
77
- api_put :update, id: stranger.id, token: user.spree_api_key, user: { :email => "mine@example.com" }
79
+ api_put :update, :id => stranger.id, :user => { :email => "mine@example.com" }
78
80
  assert_not_found!
79
81
  end
80
82
 
81
83
  it "can delete itself" do
82
- api_delete :destroy, id: user.id, token: user.spree_api_key
84
+ api_delete :destroy, :id => user.id
83
85
  expect(response.status).to eq(204)
84
86
  end
85
87
 
86
88
  it "cannot delete other user" do
87
- api_delete :destroy, id: stranger.id, token: user.spree_api_key
89
+ api_delete :destroy, :id => stranger.id
88
90
  assert_not_found!
89
91
  end
90
92
 
91
93
  it "should only get own details on index" do
92
94
  2.times { create(:user) }
93
- api_get :index, token: user.spree_api_key
95
+ api_get :index
94
96
 
95
97
  expect(Spree.user_class.count).to eq 3
96
98
  expect(json_response['count']).to eq 1
@@ -99,8 +101,6 @@ module Spree
99
101
  end
100
102
 
101
103
  context "as an admin" do
102
- before { stub_authentication! }
103
-
104
104
  sign_in_as_admin!
105
105
 
106
106
  it "gets all users" do
@@ -4,11 +4,10 @@ module Spree
4
4
  describe Api::VariantsController, :type => :controller do
5
5
  render_views
6
6
 
7
- let(:option_value) { create(:option_value) }
8
7
  let!(:product) { create(:product) }
9
8
  let!(:variant) do
10
9
  variant = product.master
11
- variant.option_values << option_value
10
+ variant.option_values << create(:option_value)
12
11
  variant
13
12
  end
14
13
 
@@ -167,12 +166,10 @@ module Spree
167
166
  end
168
167
 
169
168
  it "can create a new variant" do
170
- api_post :create, variant: { sku: "12345", option_value_ids: [option_value.id] }
171
-
169
+ api_post :create, :variant => { :sku => "12345" }
172
170
  expect(json_response).to have_attributes(new_attributes)
173
171
  expect(response.status).to eq(201)
174
172
  expect(json_response["sku"]).to eq("12345")
175
- expect(json_response["option_values"].first["id"]).to eq option_value.id
176
173
 
177
174
  expect(variant.product.variants.count).to eq(1)
178
175
  end
@@ -38,6 +38,32 @@ module Spree
38
38
  expect(json_response['zone_members'].size).to eq @zone.zone_members.count
39
39
  end
40
40
 
41
+ context "specifying a rabl template to use" do
42
+ before do
43
+ Spree::Api::ZonesController.class_eval do
44
+ def custom_show
45
+ respond_with(zone)
46
+ end
47
+ end
48
+ end
49
+
50
+ it "uses the specified template" do
51
+ @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
52
+ r.draw { get 'custom_show' => 'spree/api/zones#custom_show' }
53
+ end
54
+
55
+ request.headers['X-Spree-Template'] = 'show'
56
+ api_get :custom_show, :id => @zone.id
57
+ expect(response).to render_template('spree/api/zones/show')
58
+ end
59
+
60
+ it "falls back to the default template if the specified template does not exist" do
61
+ request.headers['X-Spree-Template'] = 'invoice'
62
+ api_get :show, :id => @zone.id
63
+ expect(response).to render_template('spree/api/zones/show')
64
+ end
65
+ end
66
+
41
67
  context "as an admin" do
42
68
  sign_in_as_admin!
43
69
 
data/spec/spec_helper.rb CHANGED
@@ -38,18 +38,17 @@ require 'spree/api/testing_support/setup'
38
38
  RSpec.configure do |config|
39
39
  config.backtrace_exclusion_patterns = [/gems\/activesupport/, /gems\/actionpack/, /gems\/rspec/]
40
40
  config.color = true
41
+ config.fail_fast = ENV['FAIL_FAST'] || false
41
42
  config.infer_spec_type_from_file_location!
43
+ config.raise_errors_for_deprecations!
44
+ config.use_transactional_fixtures = true
42
45
 
43
46
  config.include FactoryGirl::Syntax::Methods
44
47
  config.include Spree::Api::TestingSupport::Helpers, :type => :controller
45
48
  config.extend Spree::Api::TestingSupport::Setup, :type => :controller
46
49
  config.include Spree::TestingSupport::Preferences, :type => :controller
47
50
 
48
- config.fail_fast = ENV['FAIL_FAST'] || false
49
-
50
51
  config.before do
51
52
  Spree::Api::Config[:requires_authentication] = true
52
53
  end
53
-
54
- config.use_transactional_fixtures = true
55
54
  end
@@ -1,5 +1,11 @@
1
1
  require 'active_support/all'
2
2
  module ControllerHacks
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ routes { Spree::Core::Engine.routes }
7
+ end
8
+
3
9
  def api_get(action, params={}, session=nil, flash=nil)
4
10
  api_process(action, params, session, flash, "GET")
5
11
  end
@@ -12,17 +18,13 @@ module ControllerHacks
12
18
  api_process(action, params, session, flash, "PUT")
13
19
  end
14
20
 
15
- def api_patch(action, params={}, session=nil, flash=nil)
16
- api_process(action, params, session, flash, "PATCH")
17
- end
18
-
19
21
  def api_delete(action, params={}, session=nil, flash=nil)
20
22
  api_process(action, params, session, flash, "DELETE")
21
23
  end
22
24
 
23
25
  def api_process(action, params={}, session=nil, flash=nil, method="get")
24
26
  scoping = respond_to?(:resource_scoping) ? resource_scoping : {}
25
- process(action, method, params.merge(scoping).reverse_merge!(:use_route => :spree, :format => :json), session, flash)
27
+ process(action, method, params.merge(scoping).reverse_merge!(:format => :json), session, flash)
26
28
  end
27
29
  end
28
30
 
data/spree_api.gemspec CHANGED
@@ -6,7 +6,8 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["ryan@spreecommerce.com"]
7
7
  gem.description = %q{Spree's API}
8
8
  gem.summary = %q{Spree's API}
9
- gem.homepage = ""
9
+ gem.homepage = 'https://spreecommerce.com'
10
+ gem.license = %q{BSD-3}
10
11
 
11
12
  gem.files = `git ls-files`.split($\)
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.10
4
+ version: 3.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-19 00:00:00.000000000 Z
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.4.10
19
+ version: 3.0.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.4.10
26
+ version: 3.0.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rabl
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -241,15 +241,15 @@ files:
241
241
  - spec/fixtures/thinking-cat.jpg
242
242
  - spec/models/spree/legacy_user_spec.rb
243
243
  - spec/requests/rabl_cache_spec.rb
244
- - spec/requests/ransackable_attributes_spec.rb
245
244
  - spec/shared_examples/protect_product_actions.rb
246
245
  - spec/spec_helper.rb
247
246
  - spec/support/controller_hacks.rb
248
247
  - spec/support/database_cleaner.rb
249
248
  - spec/support/have_attributes_matcher.rb
250
249
  - spree_api.gemspec
251
- homepage: ''
252
- licenses: []
250
+ homepage: https://spreecommerce.com
251
+ licenses:
252
+ - BSD-3
253
253
  metadata: {}
254
254
  post_install_message:
255
255
  rdoc_options: []
@@ -262,9 +262,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
262
262
  version: '0'
263
263
  required_rubygems_version: !ruby/object:Gem::Requirement
264
264
  requirements:
265
- - - ">="
265
+ - - ">"
266
266
  - !ruby/object:Gem::Version
267
- version: '0'
267
+ version: 1.3.1
268
268
  requirements: []
269
269
  rubyforge_project:
270
270
  rubygems_version: 2.4.5
@@ -307,7 +307,6 @@ test_files:
307
307
  - spec/fixtures/thinking-cat.jpg
308
308
  - spec/models/spree/legacy_user_spec.rb
309
309
  - spec/requests/rabl_cache_spec.rb
310
- - spec/requests/ransackable_attributes_spec.rb
311
310
  - spec/shared_examples/protect_product_actions.rb
312
311
  - spec/spec_helper.rb
313
312
  - spec/support/controller_hacks.rb