apicasso 0.4.11 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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