spree_api 2.4.10 → 3.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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