apicasso 0.4.11 → 0.5.0

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -3
  3. data/Rakefile +0 -0
  4. data/app/controllers/apicasso/apidocs_controller.rb +332 -326
  5. data/app/controllers/apicasso/application_controller.rb +46 -1
  6. data/app/controllers/apicasso/crud_controller.rb +4 -20
  7. data/app/controllers/concerns/orderable.rb +1 -1
  8. data/app/controllers/concerns/sql_security.rb +67 -0
  9. data/app/models/apicasso/ability.rb +3 -0
  10. data/app/models/apicasso/application_record.rb +0 -0
  11. data/app/models/apicasso/key.rb +0 -0
  12. data/app/models/apicasso/request.rb +0 -0
  13. data/config/routes.rb +7 -0
  14. data/lib/apicasso/active_record_extension.rb +5 -0
  15. data/lib/apicasso/engine.rb +0 -0
  16. data/lib/apicasso/version.rb +1 -1
  17. data/lib/apicasso.rb +0 -0
  18. data/lib/generators/apicasso/install/install_generator.rb +6 -0
  19. data/lib/generators/apicasso/install/templates/create_apicasso_tables.rb +8 -0
  20. data/spec/apicasso_spec.rb +0 -0
  21. data/spec/dummy/Gemfile +0 -0
  22. data/spec/dummy/Gemfile.lock +0 -0
  23. data/spec/dummy/Rakefile +0 -0
  24. data/spec/dummy/app/controllers/application_controller.rb +0 -0
  25. data/spec/dummy/app/models/application_record.rb +0 -0
  26. data/spec/dummy/app/models/used_model.rb +0 -0
  27. data/spec/dummy/bin/bundle +0 -0
  28. data/spec/dummy/bin/rails +0 -0
  29. data/spec/dummy/bin/rake +0 -0
  30. data/spec/dummy/bin/setup +0 -0
  31. data/spec/dummy/bin/spring +0 -0
  32. data/spec/dummy/bin/update +0 -0
  33. data/spec/dummy/config/application.rb +0 -0
  34. data/spec/dummy/config/boot.rb +0 -0
  35. data/spec/dummy/config/cable.yml +0 -0
  36. data/spec/dummy/config/credentials.yml.enc +0 -0
  37. data/spec/dummy/config/database.yml +0 -0
  38. data/spec/dummy/config/environment.rb +0 -0
  39. data/spec/dummy/config/environments/development.rb +0 -0
  40. data/spec/dummy/config/environments/production.rb +0 -0
  41. data/spec/dummy/config/environments/test.rb +0 -0
  42. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -0
  44. data/spec/dummy/config/initializers/cors.rb +0 -0
  45. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -0
  46. data/spec/dummy/config/initializers/inflections.rb +0 -0
  47. data/spec/dummy/config/initializers/mime_types.rb +0 -0
  48. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -0
  49. data/spec/dummy/config/locales/en.yml +0 -0
  50. data/spec/dummy/config/puma.rb +0 -0
  51. data/spec/dummy/config/routes.rb +0 -0
  52. data/spec/dummy/config/spring.rb +0 -0
  53. data/spec/dummy/config/storage.yml +0 -0
  54. data/spec/dummy/config.ru +0 -0
  55. data/spec/dummy/db/migrate/20180918134607_create_apicasso_tables.rb +0 -0
  56. data/spec/dummy/db/migrate/20180918141254_create_used_models.rb +0 -0
  57. data/spec/dummy/db/migrate/20180919130152_create_active_storage_tables.active_storage.rb +0 -0
  58. data/spec/dummy/db/migrate/20180920133933_change_used_model_to_validates.rb +0 -0
  59. data/spec/dummy/db/schema.rb +0 -0
  60. data/spec/dummy/db/seeds.rb +0 -0
  61. data/spec/dummy/package.json +0 -0
  62. data/spec/factories/used_model.rb +0 -0
  63. data/spec/models/used_model_spec.rb +0 -0
  64. data/spec/rails_helper.rb +0 -0
  65. data/spec/requests/bad_requests_spec.rb +51 -0
  66. data/spec/requests/requests_spec.rb +98 -23
  67. data/spec/spec_helper.rb +1 -1
  68. data/spec/support/database_cleaner.rb +8 -0
  69. data/spec/support/factory_bot.rb +0 -0
  70. data/spec/token/token_spec.rb +322 -0
  71. metadata +32 -27
  72. data/spec/dummy/app/serializers/used_model_serializer.rb +0 -3
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails_helper'
4
-
5
4
  RSpec.describe 'Used Model requests', type: :request do
6
5
  token = Apicasso::Key.create(scope: { manage: { used_model: true } }).token
7
6
  access_token = { 'AUTHORIZATION' => "Token token=#{token}" }
@@ -38,7 +37,7 @@ RSpec.describe 'Used Model requests', type: :request do
38
37
  end
39
38
 
40
39
  context 'with pagination' do
41
- per_page = (1..UsedModel.count+1).to_a.sample
40
+ per_page = (1..UsedModel.count + 1).to_a.sample
42
41
  page = (1..5).to_a.sample
43
42
 
44
43
  before(:all) do
@@ -72,16 +71,25 @@ RSpec.describe 'Used Model requests', type: :request do
72
71
  end
73
72
 
74
73
  context 'by grouping' do
74
+ column_by, column_fields = [:active, :account_id, :unit_id, :brand, :name, :slug,
75
+ :model, :version, :model_year, :production_year, :kind, :new_vehicle, :old_price,
76
+ :price_value, :price, :category, :transmission, :km_value, :km, :plate, :color, :doors,
77
+ :fuel, :fuel_text, :shielded].sample(2)
78
+
75
79
  before(:all) do
76
- get '/api/v1/used_model', params: { 'group[by]': 'brand', 'group[calculate]': 'count', 'group[fields]': 'transmission' }, headers: access_token
80
+ get '/api/v1/used_model', params: {
81
+ 'group[by]': column_by,
82
+ 'group[calculate]': 'count',
83
+ 'group[fields]': column_fields
84
+ }, headers: access_token
77
85
  end
78
86
 
79
87
  it 'returns status ok' do
80
88
  expect(response).to have_http_status(:ok)
81
89
  end
82
90
 
83
- it 'returns all records grouped brand queried' do
84
- expect(JSON.parse(response.body)).to eq(UsedModel.group(:brand).count)
91
+ it 'returns all records grouped by field queried' do
92
+ expect(response.body).to eq(UsedModel.where("#{column_fields} is NOT NULL").group(column_by).count.to_json)
85
93
  end
86
94
  end
87
95
 
@@ -102,7 +110,10 @@ RSpec.describe 'Used Model requests', type: :request do
102
110
  end
103
111
 
104
112
  context 'with field selecting' do
105
- field_select = UsedModel.column_names.sample
113
+ fields = UsedModel.column_names
114
+ fields.delete('id')
115
+ field_select = fields.sample
116
+
106
117
  before(:all) do
107
118
  get '/api/v1/used_model', params: { 'select': field_select }, headers: access_token
108
119
  end
@@ -111,9 +122,9 @@ RSpec.describe 'Used Model requests', type: :request do
111
122
  expect(response).to have_http_status(:ok)
112
123
  end
113
124
 
114
- it 'returns all records that have field queried' do
125
+ it 'returns all records with id (default) and that have field queried' do
115
126
  JSON.parse(response.body)['entries'].each do |record|
116
- expect(record.keys).to include(field_select)
127
+ expect(record.keys).to eq(['id', field_select])
117
128
  end
118
129
  end
119
130
  end
@@ -134,19 +145,11 @@ RSpec.describe 'Used Model requests', type: :request do
134
145
  end
135
146
  end
136
147
 
137
- context 'with include associations invalid' do
138
- before(:all) do
139
- get '/api/v1/used_model', params: { 'include': 'files,file' }, headers: access_token
140
- end
141
-
142
- it 'returns status ok' do
143
- expect(response).to have_http_status(:ok)
144
- end
145
-
146
- it 'returns all records without includes queried' do
147
- JSON.parse(response.body)['entries'].each do |record|
148
- expect(record.keys).not_to include('files_blobs', 'files_url')
149
- end
148
+ context 'when include invalid associations' do
149
+ it 'raise a bad request exception' do
150
+ expect {
151
+ get '/api/v1/used_model', params: { 'include': 'filess,filee' }, headers: access_token
152
+ }.to raise_exception(ActionController::BadRequest)
150
153
  end
151
154
  end
152
155
  end
@@ -168,6 +171,51 @@ RSpec.describe 'Used Model requests', type: :request do
168
171
  it 'return matches with object searched' do
169
172
  expect(UsedModel.find(id_to_get_id.to_i).attributes.to_json).to eq(response.body)
170
173
  end
174
+
175
+ context 'with field selecting' do
176
+ id_to_get_id = UsedModel.all.sample.id.to_s
177
+ fields = UsedModel.column_names
178
+ fields.delete('id')
179
+ field_select = fields.sample
180
+
181
+ before(:all) do
182
+ get '/api/v1/used_model/' + id_to_get_id, params: { 'select': field_select }, headers: access_token
183
+ end
184
+
185
+ it 'returns status ok' do
186
+ expect(response).to have_http_status(:ok)
187
+ end
188
+
189
+ it 'returns the record with id (default) and that have field queried' do
190
+ expect(JSON.parse(response.body).keys).to eq([field_select])
191
+ end
192
+ end
193
+
194
+ context 'with include associations valid' do
195
+ id_to_test = UsedModel.all.sample.id.to_s
196
+
197
+ before(:all) do
198
+ get '/api/v1/used_model/' + id_to_test, params: { 'include': 'files_blobs,files_url' }, headers: access_token
199
+ end
200
+
201
+ it 'returns status ok' do
202
+ expect(response).to have_http_status(:ok)
203
+ end
204
+
205
+ it 'returns the record with includes queried' do
206
+ expect(JSON.parse(response.body).keys).to include('files_blobs', 'files_url')
207
+ end
208
+ end
209
+
210
+ context 'when include invalid associations' do
211
+ id_to_test = UsedModel.all.sample.id.to_s
212
+
213
+ it 'raise a bad request exception' do
214
+ expect {
215
+ get '/api/v1/used_model/' + id_to_test, params: { 'include': 'filess,filee' }, headers: access_token
216
+ }.to raise_exception(ActionController::BadRequest)
217
+ end
218
+ end
171
219
  end
172
220
 
173
221
  describe 'GET /api/v1/used_model/:slug' do
@@ -195,7 +243,35 @@ RSpec.describe 'Used Model requests', type: :request do
195
243
  context 'with valid params' do
196
244
  before(:all) do
197
245
  @quantity = UsedModel.all.size
198
- post '/api/v1/used_model/', params: { 'used_model': { 'name': 'test', 'account_id': 1, 'unit_id': 1, 'slug': slug_to_post, 'brand': 'BMW' }}, headers: access_token
246
+ slug_to_post = Faker::Lorem.word
247
+ post '/api/v1/used_model/', params: {
248
+ 'used_model': {
249
+ 'active': Faker::Boolean.boolean,
250
+ 'account_id': Faker::Number.number(1),
251
+ 'unit_id': Faker::Number.number(1),
252
+ 'brand': Faker::Vehicle.make,
253
+ 'name': Faker::Vehicle.make_and_model,
254
+ 'model': Faker::Vehicle.model,
255
+ 'slug': slug_to_post,
256
+ 'version': Faker::Number.decimal(1, 1),
257
+ 'model_year': Faker::Vehicle.year,
258
+ 'production_year': Faker::Vehicle.year,
259
+ 'kind': 'car',
260
+ 'new_vehicle': Faker::Boolean.boolean,
261
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
262
+ 'price_value': Faker::Number.decimal(4, 2),
263
+ 'price': Faker::Number.decimal(4, 2).to_s,
264
+ 'category': Faker::Vehicle.car_type,
265
+ 'transmission': Faker::Vehicle.transmission,
266
+ 'km_value': Faker::Number.number(8),
267
+ 'km': Faker::Number.number(8),
268
+ 'plate': Faker::Number.number(4),
269
+ 'color': Faker::Vehicle.color,
270
+ 'doors': Faker::Number.number(1),
271
+ 'fuel': Faker::Number.number(1),
272
+ 'fuel_text': Faker::Vehicle.fuel_type,
273
+ 'shielded': Faker::Boolean.boolean,
274
+ }}, headers: access_token
199
275
  end
200
276
 
201
277
  it 'returns status created' do
@@ -222,7 +298,6 @@ RSpec.describe 'Used Model requests', type: :request do
222
298
  describe 'PUT /api/v1/used_model/:id' do
223
299
  id_to_put = UsedModel.all.sample.id.to_s
224
300
  name_to_put = Faker::Lorem.word
225
- slug_to_put = UsedModel.all.sample.slug
226
301
 
227
302
  context 'with valid params' do
228
303
  before(:all) do
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,7 @@ ENV['RAILS_ENV'] ||= 'test'
3
3
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
4
  require 'rspec/rails'
5
5
  require 'factory_bot_rails'
6
+ require 'database_cleaner'
6
7
  require 'faker'
7
8
  require 'simplecov'
8
9
  SimpleCov.start
@@ -13,4 +14,3 @@ Rails.backtrace_cleaner.remove_silencers!
13
14
 
14
15
  # Load support files
15
16
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
16
-
@@ -0,0 +1,8 @@
1
+ RSpec.configure do |config|
2
+ config.use_transactional_fixtures = false
3
+
4
+ config.after(:suite) do
5
+ DatabaseCleaner.strategy = :truncation, { :only => %w[apicasso_keys] }
6
+ DatabaseCleaner.clean
7
+ end
8
+ end
File without changes
@@ -0,0 +1,322 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe 'Apicasso Keys', type: :request do
6
+ describe 'Generation keys' do
7
+ context 'with scope manage' do
8
+ apicasso_key = Apicasso::Key.create(scope: { manage: { used_model: true } })
9
+ access_token = { 'AUTHORIZATION' => "Token token=#{apicasso_key.token}" }
10
+
11
+ it 'returns ok to GET' do
12
+ get '/api/v1/used_model', headers: access_token
13
+ expect(response).to have_http_status(:ok)
14
+ end
15
+
16
+ it 'returns ok to POST' do
17
+ size_before = UsedModel.all.size
18
+
19
+ post '/api/v1/used_model/', params: {
20
+ 'used_model': {
21
+ 'active': Faker::Boolean.boolean,
22
+ 'account_id': Faker::Number.number(1),
23
+ 'unit_id': Faker::Number.number(1),
24
+ 'brand': Faker::Vehicle.make,
25
+ 'name': Faker::Vehicle.make_and_model,
26
+ 'model': Faker::Vehicle.model,
27
+ 'version': Faker::Number.decimal(1, 1),
28
+ 'model_year': Faker::Vehicle.year,
29
+ 'production_year': Faker::Vehicle.year,
30
+ 'kind': 'car',
31
+ 'new_vehicle': Faker::Boolean.boolean,
32
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
33
+ 'price_value': Faker::Number.decimal(4, 2),
34
+ 'price': Faker::Number.decimal(4, 2).to_s,
35
+ 'category': Faker::Vehicle.car_type,
36
+ 'transmission': Faker::Vehicle.transmission,
37
+ 'km_value': Faker::Number.number(8),
38
+ 'km': Faker::Number.number(8),
39
+ 'plate': Faker::Number.number(4),
40
+ 'color': Faker::Vehicle.color,
41
+ 'doors': Faker::Number.number(1),
42
+ 'fuel': Faker::Number.number(1),
43
+ 'fuel_text': Faker::Vehicle.fuel_type,
44
+ 'shielded': Faker::Boolean.boolean,
45
+ }}, headers: access_token
46
+
47
+ expect(UsedModel.all.size).to eq(size_before + 1)
48
+ expect(response).to have_http_status(:created)
49
+ end
50
+
51
+ it 'returns ok to UPDATE' do
52
+ id_to_del = UsedModel.all.sample.id.to_s
53
+
54
+ patch '/api/v1/used_model/' + id_to_del, params: {'used_model': { 'name': Faker::Vehicle.make_and_model }}, headers: access_token
55
+ expect(response).to have_http_status(:ok)
56
+ end
57
+
58
+ it 'returns ok to DELETE' do
59
+ id_to_del = UsedModel.all.sample.id.to_s
60
+ size_before = UsedModel.all.size
61
+
62
+ delete '/api/v1/used_model/' + id_to_del, headers: access_token
63
+
64
+ expect(UsedModel.all.size).to eq(size_before - 1)
65
+ expect(response).to have_http_status(:no_content)
66
+ end
67
+ end
68
+
69
+ context 'with scope to read' do
70
+ apicasso_key = Apicasso::Key.create(scope: { read: { used_model: true } })
71
+ access_token = { 'AUTHORIZATION' => "Token token=#{apicasso_key.token}" }
72
+
73
+ it 'returns ok to GET' do
74
+ get '/api/v1/used_model', headers: access_token
75
+ expect(response).to have_http_status(:ok)
76
+ end
77
+
78
+ it 'returns a raise to POST' do
79
+ size_before = UsedModel.all.size
80
+
81
+ expect {
82
+ post '/api/v1/used_model/', params: {
83
+ 'used_model': {
84
+ 'active': Faker::Boolean.boolean,
85
+ 'account_id': Faker::Number.number(1),
86
+ 'unit_id': Faker::Number.number(1),
87
+ 'brand': Faker::Vehicle.make,
88
+ 'name': Faker::Vehicle.make_and_model,
89
+ 'model': Faker::Vehicle.model,
90
+ 'version': Faker::Number.decimal(1, 1),
91
+ 'model_year': Faker::Vehicle.year,
92
+ 'production_year': Faker::Vehicle.year,
93
+ 'kind': 'car',
94
+ 'new_vehicle': Faker::Boolean.boolean,
95
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
96
+ 'price_value': Faker::Number.decimal(4, 2),
97
+ 'price': Faker::Number.decimal(4, 2).to_s,
98
+ 'category': Faker::Vehicle.car_type,
99
+ 'transmission': Faker::Vehicle.transmission,
100
+ 'km_value': Faker::Number.number(8),
101
+ 'km': Faker::Number.number(8),
102
+ 'plate': Faker::Number.number(4),
103
+ 'color': Faker::Vehicle.color,
104
+ 'doors': Faker::Number.number(1),
105
+ 'fuel': Faker::Number.number(1),
106
+ 'fuel_text': Faker::Vehicle.fuel_type,
107
+ 'shielded': Faker::Boolean.boolean
108
+ }}, headers: access_token
109
+ }.to raise_exception(CanCan::AccessDenied)
110
+ expect(UsedModel.all.size).to eq(size_before)
111
+ end
112
+
113
+ it 'returns a raise to UPDATE' do
114
+ id_to_del = UsedModel.all.sample.id.to_s
115
+
116
+ expect {
117
+ patch '/api/v1/used_model/' + id_to_del, params: { 'used_model': { 'name': Faker::Vehicle.make_and_model }}, headers: access_token
118
+ }.to raise_exception(CanCan::AccessDenied)
119
+ end
120
+
121
+ it 'returns a raise to DELETE' do
122
+ id_to_del = UsedModel.all.sample.id.to_s
123
+ size_before = UsedModel.all.size
124
+
125
+ expect {
126
+ delete '/api/v1/used_model/' + id_to_del, headers: access_token
127
+ }.to raise_exception(CanCan::AccessDenied)
128
+ expect(UsedModel.all.size).to eq(size_before)
129
+ end
130
+ end
131
+
132
+ context 'with scope to write' do
133
+ apicasso_key = Apicasso::Key.create(scope: { create: { used_model: true } })
134
+ access_token = { 'AUTHORIZATION' => "Token token=#{apicasso_key.token}" }
135
+
136
+ it 'returns a raise to GET' do
137
+ expect {
138
+ get '/api/v1/used_model', headers: access_token
139
+ }.to raise_exception(CanCan::AccessDenied)
140
+ end
141
+
142
+ it 'returns ok to POST' do
143
+ size_before = UsedModel.all.size
144
+
145
+ post '/api/v1/used_model/', params: {
146
+ 'used_model': {
147
+ 'active': Faker::Boolean.boolean,
148
+ 'account_id': Faker::Number.number(1),
149
+ 'unit_id': Faker::Number.number(1),
150
+ 'brand': Faker::Vehicle.make,
151
+ 'name': Faker::Vehicle.make_and_model,
152
+ 'model': Faker::Vehicle.model,
153
+ 'version': Faker::Number.decimal(1, 1),
154
+ 'model_year': Faker::Vehicle.year,
155
+ 'production_year': Faker::Vehicle.year,
156
+ 'kind': 'car',
157
+ 'new_vehicle': Faker::Boolean.boolean,
158
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
159
+ 'price_value': Faker::Number.decimal(4, 2),
160
+ 'price': Faker::Number.decimal(4, 2).to_s,
161
+ 'category': Faker::Vehicle.car_type,
162
+ 'transmission': Faker::Vehicle.transmission,
163
+ 'km_value': Faker::Number.number(8),
164
+ 'km': Faker::Number.number(8),
165
+ 'plate': Faker::Number.number(4),
166
+ 'color': Faker::Vehicle.color,
167
+ 'doors': Faker::Number.number(1),
168
+ 'fuel': Faker::Number.number(1),
169
+ 'fuel_text': Faker::Vehicle.fuel_type,
170
+ 'shielded': Faker::Boolean.boolean
171
+ }}, headers: access_token
172
+
173
+ expect(response).to have_http_status(:created)
174
+ expect(UsedModel.all.size).to eq(size_before + 1)
175
+ end
176
+
177
+ it 'returns a raise to UPDATE' do
178
+ id_to_del = UsedModel.all.sample.id.to_s
179
+
180
+ expect {
181
+ patch '/api/v1/used_model/' + id_to_del, params: { 'used_model': { 'name': Faker::Vehicle.make_and_model }}, headers: access_token
182
+ }.to raise_exception(CanCan::AccessDenied)
183
+ end
184
+
185
+ it 'returns a raise to DELETE' do
186
+ id_to_del = UsedModel.all.sample.id.to_s
187
+ size_before = UsedModel.all.size
188
+
189
+ expect {
190
+ delete '/api/v1/used_model/' + id_to_del, headers: access_token
191
+ }.to raise_exception(CanCan::AccessDenied)
192
+ expect(UsedModel.all.size).to eq(size_before)
193
+ end
194
+ end
195
+
196
+ context 'with scope to update' do
197
+ apicasso_key = Apicasso::Key.create(scope: { update: { used_model: true } })
198
+ access_token = { 'AUTHORIZATION' => "Token token=#{apicasso_key.token}" }
199
+
200
+ it 'returns a raise to GET' do
201
+ expect {
202
+ get '/api/v1/used_model', headers: access_token
203
+ }.to raise_exception(CanCan::AccessDenied)
204
+ end
205
+
206
+ it 'returns a raise to POST' do
207
+ size_before = UsedModel.all.size
208
+
209
+ expect {
210
+ post '/api/v1/used_model/', params: {
211
+ 'used_model': {
212
+ 'active': Faker::Boolean.boolean,
213
+ 'account_id': Faker::Number.number(1),
214
+ 'unit_id': Faker::Number.number(1),
215
+ 'brand': Faker::Vehicle.make,
216
+ 'name': Faker::Vehicle.make_and_model,
217
+ 'model': Faker::Vehicle.model,
218
+ 'version': Faker::Number.decimal(1, 1),
219
+ 'model_year': Faker::Vehicle.year,
220
+ 'production_year': Faker::Vehicle.year,
221
+ 'kind': 'car',
222
+ 'new_vehicle': Faker::Boolean.boolean,
223
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
224
+ 'price_value': Faker::Number.decimal(4, 2),
225
+ 'price': Faker::Number.decimal(4, 2).to_s,
226
+ 'category': Faker::Vehicle.car_type,
227
+ 'transmission': Faker::Vehicle.transmission,
228
+ 'km_value': Faker::Number.number(8),
229
+ 'km': Faker::Number.number(8),
230
+ 'plate': Faker::Number.number(4),
231
+ 'color': Faker::Vehicle.color,
232
+ 'doors': Faker::Number.number(1),
233
+ 'fuel': Faker::Number.number(1),
234
+ 'fuel_text': Faker::Vehicle.fuel_type,
235
+ 'shielded': Faker::Boolean.boolean
236
+ }}, headers: access_token
237
+ }.to raise_exception(CanCan::AccessDenied)
238
+ expect(UsedModel.all.size).to eq(size_before)
239
+ end
240
+
241
+ it 'returns ok to UPDATE' do
242
+ id_to_del = UsedModel.all.sample.id.to_s
243
+
244
+ patch '/api/v1/used_model/' + id_to_del, params: { 'used_model': { 'name': Faker::Vehicle.make_and_model }}, headers: access_token
245
+ expect(response).to have_http_status(:ok)
246
+ end
247
+
248
+ it 'returns a raise to DELETE' do
249
+ id_to_del = UsedModel.all.sample.id.to_s
250
+ size_before = UsedModel.all.size
251
+
252
+ expect {
253
+ delete '/api/v1/used_model/' + id_to_del, headers: access_token
254
+ }.to raise_exception(CanCan::AccessDenied)
255
+ expect(UsedModel.all.size).to eq(size_before)
256
+ end
257
+ end
258
+
259
+ context 'with scope to destroy' do
260
+ apicasso_key = Apicasso::Key.create(scope: { destroy: { used_model: true } })
261
+ access_token = { 'AUTHORIZATION' => "Token token=#{apicasso_key.token}" }
262
+
263
+ it 'returns a raise to GET' do
264
+ expect {
265
+ get '/api/v1/used_model', headers: access_token
266
+ }.to raise_exception(CanCan::AccessDenied)
267
+ end
268
+
269
+ it 'returns a raise to POST' do
270
+ size_before = UsedModel.all.size
271
+
272
+ expect {
273
+ post '/api/v1/used_model/', params: {
274
+ 'used_model': {
275
+ 'active': Faker::Boolean.boolean,
276
+ 'account_id': Faker::Number.number(1),
277
+ 'unit_id': Faker::Number.number(1),
278
+ 'brand': Faker::Vehicle.make,
279
+ 'name': Faker::Vehicle.make_and_model,
280
+ 'model': Faker::Vehicle.model,
281
+ 'version': Faker::Number.decimal(1, 1),
282
+ 'model_year': Faker::Vehicle.year,
283
+ 'production_year': Faker::Vehicle.year,
284
+ 'kind': 'car',
285
+ 'new_vehicle': Faker::Boolean.boolean,
286
+ 'old_price': Faker::Number.decimal(4, 2).to_s,
287
+ 'price_value': Faker::Number.decimal(4, 2),
288
+ 'price': Faker::Number.decimal(4, 2).to_s,
289
+ 'category': Faker::Vehicle.car_type,
290
+ 'transmission': Faker::Vehicle.transmission,
291
+ 'km_value': Faker::Number.number(8),
292
+ 'km': Faker::Number.number(8),
293
+ 'plate': Faker::Number.number(4),
294
+ 'color': Faker::Vehicle.color,
295
+ 'doors': Faker::Number.number(1),
296
+ 'fuel': Faker::Number.number(1),
297
+ 'fuel_text': Faker::Vehicle.fuel_type,
298
+ 'shielded': Faker::Boolean.boolean
299
+ }}, headers: access_token
300
+ }.to raise_exception(CanCan::AccessDenied)
301
+ expect(UsedModel.all.size).to eq(size_before)
302
+ end
303
+
304
+ it 'returns a raise to UPDATE' do
305
+ id_to_del = UsedModel.all.sample.id.to_s
306
+
307
+ expect {
308
+ patch '/api/v1/used_model/' + id_to_del, params: { 'used_model': { 'name': Faker::Vehicle.make_and_model }}, headers: access_token
309
+ }.to raise_exception(CanCan::AccessDenied)
310
+ end
311
+
312
+ it 'returns ok to DELETE' do
313
+ id_to_del = UsedModel.all.sample.id.to_s
314
+ size_before = UsedModel.all.size
315
+
316
+ delete '/api/v1/used_model/' + id_to_del, headers: access_token
317
+ expect(response).to have_http_status(:no_content)
318
+ expect(UsedModel.all.size).to eq(size_before - 1)
319
+ end
320
+ end
321
+ end
322
+ end