grape 1.6.0 → 1.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/CONTRIBUTING.md +1 -0
  4. data/README.md +9 -1
  5. data/lib/grape/api.rb +12 -0
  6. data/lib/grape/dry_types.rb +12 -0
  7. data/lib/grape/dsl/headers.rb +5 -2
  8. data/lib/grape/dsl/helpers.rb +1 -1
  9. data/lib/grape/middleware/auth/dsl.rb +7 -1
  10. data/lib/grape/middleware/base.rb +1 -1
  11. data/lib/grape/util/json.rb +2 -0
  12. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  13. data/lib/grape/validations/types/array_coercer.rb +0 -2
  14. data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
  15. data/lib/grape/validations/types/json.rb +0 -2
  16. data/lib/grape/validations/types/primitive_coercer.rb +5 -7
  17. data/lib/grape/validations/types/set_coercer.rb +0 -3
  18. data/lib/grape/validations/types.rb +83 -9
  19. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  20. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  21. data/lib/grape/validations/validators/as_validator.rb +14 -0
  22. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  23. data/lib/grape/validations/validators/base.rb +73 -71
  24. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  25. data/lib/grape/validations/validators/default_validator.rb +51 -0
  26. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  27. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  28. data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
  29. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  30. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  31. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  32. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  33. data/lib/grape/validations/validators/values_validator.rb +88 -0
  34. data/lib/grape/version.rb +1 -1
  35. data/lib/grape.rb +59 -24
  36. data/spec/grape/api/custom_validations_spec.rb +77 -46
  37. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  38. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  39. data/spec/grape/api/invalid_format_spec.rb +2 -0
  40. data/spec/grape/api/recognize_path_spec.rb +1 -1
  41. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  42. data/spec/grape/api_remount_spec.rb +16 -15
  43. data/spec/grape/api_spec.rb +317 -193
  44. data/spec/grape/dsl/callbacks_spec.rb +1 -0
  45. data/spec/grape/dsl/headers_spec.rb +39 -9
  46. data/spec/grape/dsl/helpers_spec.rb +3 -2
  47. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  48. data/spec/grape/dsl/logger_spec.rb +16 -18
  49. data/spec/grape/dsl/middleware_spec.rb +1 -0
  50. data/spec/grape/dsl/parameters_spec.rb +1 -0
  51. data/spec/grape/dsl/request_response_spec.rb +1 -0
  52. data/spec/grape/dsl/routing_spec.rb +9 -6
  53. data/spec/grape/endpoint/declared_spec.rb +12 -12
  54. data/spec/grape/endpoint_spec.rb +59 -50
  55. data/spec/grape/entity_spec.rb +13 -13
  56. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  57. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  58. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  59. data/spec/grape/exceptions/validation_spec.rb +5 -3
  60. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  61. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  62. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  63. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  64. data/spec/grape/loading_spec.rb +8 -8
  65. data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
  66. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  67. data/spec/grape/middleware/base_spec.rb +24 -15
  68. data/spec/grape/middleware/error_spec.rb +1 -0
  69. data/spec/grape/middleware/exception_spec.rb +111 -161
  70. data/spec/grape/middleware/formatter_spec.rb +25 -4
  71. data/spec/grape/middleware/globals_spec.rb +7 -4
  72. data/spec/grape/middleware/stack_spec.rb +11 -11
  73. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  74. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  75. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  76. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  77. data/spec/grape/middleware/versioner_spec.rb +1 -1
  78. data/spec/grape/parser_spec.rb +4 -0
  79. data/spec/grape/path_spec.rb +52 -52
  80. data/spec/grape/presenters/presenter_spec.rb +7 -6
  81. data/spec/grape/request_spec.rb +6 -4
  82. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  83. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  84. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  85. data/spec/grape/util/stackable_values_spec.rb +7 -5
  86. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  87. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  88. data/spec/grape/validations/params_scope_spec.rb +9 -7
  89. data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
  90. data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
  91. data/spec/grape/validations/types_spec.rb +8 -8
  92. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  93. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  94. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  95. data/spec/grape/validations/validators/coerce_spec.rb +10 -12
  96. data/spec/grape/validations/validators/default_spec.rb +72 -78
  97. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  98. data/spec/grape/validations/validators/except_values_spec.rb +1 -1
  99. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  100. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  101. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  102. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  103. data/spec/grape/validations/validators/values_spec.rb +172 -171
  104. data/spec/grape/validations_spec.rb +45 -16
  105. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  106. data/spec/integration/multi_json/json_spec.rb +1 -1
  107. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  108. data/spec/shared/versioning_examples.rb +10 -7
  109. data/spec/spec_helper.rb +11 -1
  110. metadata +116 -116
  111. data/lib/grape/validations/types/build_coercer.rb +0 -94
  112. data/lib/grape/validations/validators/all_or_none.rb +0 -16
  113. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  114. data/lib/grape/validations/validators/as.rb +0 -12
  115. data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
  116. data/lib/grape/validations/validators/coerce.rb +0 -87
  117. data/lib/grape/validations/validators/default.rb +0 -49
  118. data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
  119. data/lib/grape/validations/validators/except_values.rb +0 -22
  120. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
  121. data/lib/grape/validations/validators/presence.rb +0 -13
  122. data/lib/grape/validations/validators/regexp.rb +0 -14
  123. data/lib/grape/validations/validators/same_as.rb +0 -27
  124. data/lib/grape/validations/validators/values.rb +0 -86
@@ -7,6 +7,7 @@ describe Grape::Exceptions::InvalidAcceptHeader do
7
7
  it 'does return with status 200' do
8
8
  expect(last_response.status).to eq 200
9
9
  end
10
+
10
11
  it 'does return the expected result' do
11
12
  expect(last_response.body).to eq('beer received')
12
13
  end
@@ -20,6 +21,7 @@ describe Grape::Exceptions::InvalidAcceptHeader do
20
21
  it 'does not include the X-Cascade=pass header' do
21
22
  expect(last_response.headers['X-Cascade']).to be_nil
22
23
  end
24
+
23
25
  it 'does not accept the request' do
24
26
  expect(last_response.status).to eq 406
25
27
  end
@@ -28,6 +30,7 @@ describe Grape::Exceptions::InvalidAcceptHeader do
28
30
  it 'does not include the X-Cascade=pass header' do
29
31
  expect(last_response.headers['X-Cascade']).to be_nil
30
32
  end
33
+
31
34
  it 'does show rescue handler processing' do
32
35
  expect(last_response.status).to eq 400
33
36
  expect(last_response.body).to eq('message was processed')
@@ -36,6 +39,7 @@ describe Grape::Exceptions::InvalidAcceptHeader do
36
39
 
37
40
  context 'API with cascade=false and rescue_from :all handler' do
38
41
  subject { Class.new(Grape::API) }
42
+
39
43
  before do
40
44
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
41
45
  subject.rescue_from :all do |e|
@@ -52,7 +56,8 @@ describe Grape::Exceptions::InvalidAcceptHeader do
52
56
 
53
57
  context 'that received a request with correct vendor and version' do
54
58
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
55
- it_should_behave_like 'a valid request'
59
+
60
+ it_behaves_like 'a valid request'
56
61
  end
57
62
 
58
63
  context 'that receives' do
@@ -61,13 +66,15 @@ describe Grape::Exceptions::InvalidAcceptHeader do
61
66
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
62
67
  'CONTENT_TYPE' => 'application/json'
63
68
  end
64
- it_should_behave_like 'a rescued request'
69
+
70
+ it_behaves_like 'a rescued request'
65
71
  end
66
72
  end
67
73
  end
68
74
 
69
75
  context 'API with cascade=false and without a rescue handler' do
70
76
  subject { Class.new(Grape::API) }
77
+
71
78
  before do
72
79
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
73
80
  subject.get '/beer' do
@@ -81,23 +88,28 @@ describe Grape::Exceptions::InvalidAcceptHeader do
81
88
 
82
89
  context 'that received a request with correct vendor and version' do
83
90
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
84
- it_should_behave_like 'a valid request'
91
+
92
+ it_behaves_like 'a valid request'
85
93
  end
86
94
 
87
95
  context 'that receives' do
88
96
  context 'an invalid version in the request' do
89
97
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
90
- it_should_behave_like 'a not-cascaded request'
98
+
99
+ it_behaves_like 'a not-cascaded request'
91
100
  end
101
+
92
102
  context 'an invalid vendor in the request' do
93
103
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
94
- it_should_behave_like 'a not-cascaded request'
104
+
105
+ it_behaves_like 'a not-cascaded request'
95
106
  end
96
107
  end
97
108
  end
98
109
 
99
110
  context 'API with cascade=false and with rescue_from :all handler and http_codes' do
100
111
  subject { Class.new(Grape::API) }
112
+
101
113
  before do
102
114
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
103
115
  subject.rescue_from :all do |e|
@@ -119,7 +131,8 @@ describe Grape::Exceptions::InvalidAcceptHeader do
119
131
 
120
132
  context 'that received a request with correct vendor and version' do
121
133
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
122
- it_should_behave_like 'a valid request'
134
+
135
+ it_behaves_like 'a valid request'
123
136
  end
124
137
 
125
138
  context 'that receives' do
@@ -128,13 +141,15 @@ describe Grape::Exceptions::InvalidAcceptHeader do
128
141
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
129
142
  'CONTENT_TYPE' => 'application/json'
130
143
  end
131
- it_should_behave_like 'a rescued request'
144
+
145
+ it_behaves_like 'a rescued request'
132
146
  end
133
147
  end
134
148
  end
135
149
 
136
150
  context 'API with cascade=false, http_codes but without a rescue handler' do
137
151
  subject { Class.new(Grape::API) }
152
+
138
153
  before do
139
154
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
140
155
  subject.desc 'Get beer' do
@@ -153,23 +168,28 @@ describe Grape::Exceptions::InvalidAcceptHeader do
153
168
 
154
169
  context 'that received a request with correct vendor and version' do
155
170
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
156
- it_should_behave_like 'a valid request'
171
+
172
+ it_behaves_like 'a valid request'
157
173
  end
158
174
 
159
175
  context 'that receives' do
160
176
  context 'an invalid version in the request' do
161
177
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
162
- it_should_behave_like 'a not-cascaded request'
178
+
179
+ it_behaves_like 'a not-cascaded request'
163
180
  end
181
+
164
182
  context 'an invalid vendor in the request' do
165
183
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
166
- it_should_behave_like 'a not-cascaded request'
184
+
185
+ it_behaves_like 'a not-cascaded request'
167
186
  end
168
187
  end
169
188
  end
170
189
 
171
190
  context 'API with cascade=true and rescue_from :all handler' do
172
191
  subject { Class.new(Grape::API) }
192
+
173
193
  before do
174
194
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
175
195
  subject.rescue_from :all do |e|
@@ -186,7 +206,8 @@ describe Grape::Exceptions::InvalidAcceptHeader do
186
206
 
187
207
  context 'that received a request with correct vendor and version' do
188
208
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
189
- it_should_behave_like 'a valid request'
209
+
210
+ it_behaves_like 'a valid request'
190
211
  end
191
212
 
192
213
  context 'that receives' do
@@ -195,20 +216,24 @@ describe Grape::Exceptions::InvalidAcceptHeader do
195
216
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77',
196
217
  'CONTENT_TYPE' => 'application/json'
197
218
  end
198
- it_should_behave_like 'a cascaded request'
219
+
220
+ it_behaves_like 'a cascaded request'
199
221
  end
222
+
200
223
  context 'an invalid vendor in the request' do
201
224
  before do
202
225
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
203
226
  'CONTENT_TYPE' => 'application/json'
204
227
  end
205
- it_should_behave_like 'a cascaded request'
228
+
229
+ it_behaves_like 'a cascaded request'
206
230
  end
207
231
  end
208
232
  end
209
233
 
210
234
  context 'API with cascade=true and without a rescue handler' do
211
235
  subject { Class.new(Grape::API) }
236
+
212
237
  before do
213
238
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
214
239
  subject.get '/beer' do
@@ -222,23 +247,28 @@ describe Grape::Exceptions::InvalidAcceptHeader do
222
247
 
223
248
  context 'that received a request with correct vendor and version' do
224
249
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
225
- it_should_behave_like 'a valid request'
250
+
251
+ it_behaves_like 'a valid request'
226
252
  end
227
253
 
228
254
  context 'that receives' do
229
255
  context 'an invalid version in the request' do
230
256
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
231
- it_should_behave_like 'a cascaded request'
257
+
258
+ it_behaves_like 'a cascaded request'
232
259
  end
260
+
233
261
  context 'an invalid vendor in the request' do
234
262
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
235
- it_should_behave_like 'a cascaded request'
263
+
264
+ it_behaves_like 'a cascaded request'
236
265
  end
237
266
  end
238
267
  end
239
268
 
240
269
  context 'API with cascade=true and with rescue_from :all handler and http_codes' do
241
270
  subject { Class.new(Grape::API) }
271
+
242
272
  before do
243
273
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
244
274
  subject.rescue_from :all do |e|
@@ -260,7 +290,8 @@ describe Grape::Exceptions::InvalidAcceptHeader do
260
290
 
261
291
  context 'that received a request with correct vendor and version' do
262
292
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
263
- it_should_behave_like 'a valid request'
293
+
294
+ it_behaves_like 'a valid request'
264
295
  end
265
296
 
266
297
  context 'that receives' do
@@ -269,20 +300,24 @@ describe Grape::Exceptions::InvalidAcceptHeader do
269
300
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77',
270
301
  'CONTENT_TYPE' => 'application/json'
271
302
  end
272
- it_should_behave_like 'a cascaded request'
303
+
304
+ it_behaves_like 'a cascaded request'
273
305
  end
306
+
274
307
  context 'an invalid vendor in the request' do
275
308
  before do
276
309
  get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
277
310
  'CONTENT_TYPE' => 'application/json'
278
311
  end
279
- it_should_behave_like 'a cascaded request'
312
+
313
+ it_behaves_like 'a cascaded request'
280
314
  end
281
315
  end
282
316
  end
283
317
 
284
318
  context 'API with cascade=true, http_codes but without a rescue handler' do
285
319
  subject { Class.new(Grape::API) }
320
+
286
321
  before do
287
322
  subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
288
323
  subject.desc 'Get beer' do
@@ -301,17 +336,21 @@ describe Grape::Exceptions::InvalidAcceptHeader do
301
336
 
302
337
  context 'that received a request with correct vendor and version' do
303
338
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
304
- it_should_behave_like 'a valid request'
339
+
340
+ it_behaves_like 'a valid request'
305
341
  end
306
342
 
307
343
  context 'that receives' do
308
344
  context 'an invalid version in the request' do
309
345
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
310
- it_should_behave_like 'a cascaded request'
346
+
347
+ it_behaves_like 'a cascaded request'
311
348
  end
349
+
312
350
  context 'an invalid vendor in the request' do
313
351
  before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
314
- it_should_behave_like 'a cascaded request'
352
+
353
+ it_behaves_like 'a cascaded request'
315
354
  end
316
355
  end
317
356
  end
@@ -5,30 +5,31 @@ require 'ostruct'
5
5
 
6
6
  describe Grape::Exceptions::ValidationErrors do
7
7
  let(:validation_message) { 'FooBar is invalid' }
8
- let(:validation_error) { OpenStruct.new(params: [validation_message]) }
8
+ let(:validation_error) { instance_double Grape::Exceptions::Validation, params: [validation_message], message: '' }
9
9
 
10
10
  context 'initialize' do
11
+ subject do
12
+ described_class.new(errors: [validation_error], headers: headers)
13
+ end
14
+
11
15
  let(:headers) do
12
16
  {
13
17
  'A-Header-Key' => 'A-Header-Value'
14
18
  }
15
19
  end
16
20
 
17
- subject do
18
- described_class.new(errors: [validation_error], headers: headers)
19
- end
20
-
21
- it 'should assign headers through base class' do
21
+ it 'assigns headers through base class' do
22
22
  expect(subject.headers).to eq(headers)
23
23
  end
24
24
  end
25
25
 
26
26
  context 'message' do
27
27
  context 'is not repeated' do
28
+ subject(:message) { error.message.split(',').map(&:strip) }
29
+
28
30
  let(:error) do
29
31
  described_class.new(errors: [validation_error, validation_error])
30
32
  end
31
- subject(:message) { error.message.split(',').map(&:strip) }
32
33
 
33
34
  it { expect(message).to include validation_message }
34
35
  it { expect(message.size).to eq 1 }
@@ -37,9 +38,10 @@ describe Grape::Exceptions::ValidationErrors do
37
38
 
38
39
  describe '#full_messages' do
39
40
  context 'with errors' do
41
+ subject { described_class.new(errors: [validation_error_1, validation_error_2]).full_messages }
42
+
40
43
  let(:validation_error_1) { Grape::Exceptions::Validation.new(params: ['id'], message: :presence) }
41
44
  let(:validation_error_2) { Grape::Exceptions::Validation.new(params: ['name'], message: :presence) }
42
- subject { described_class.new(errors: [validation_error_1, validation_error_2]).full_messages }
43
45
 
44
46
  it 'returns an array with each errors full message' do
45
47
  expect(subject).to contain_exactly('id is missing', 'name is missing')
@@ -47,9 +49,10 @@ describe Grape::Exceptions::ValidationErrors do
47
49
  end
48
50
 
49
51
  context 'when attributes is an array of symbols' do
50
- let(:validation_error) { Grape::Exceptions::Validation.new(params: [:admin_field], message: 'Can not set admin-only field') }
51
52
  subject { described_class.new(errors: [validation_error]).full_messages }
52
53
 
54
+ let(:validation_error) { Grape::Exceptions::Validation.new(params: [:admin_field], message: 'Can not set admin-only field') }
55
+
53
56
  it 'returns an array with an error full message' do
54
57
  expect(subject.first).to eq('admin_field Can not set admin-only field')
55
58
  end
@@ -65,7 +68,7 @@ describe Grape::Exceptions::ValidationErrors do
65
68
 
66
69
  it 'can return structured json with separate fields' do
67
70
  subject.format :json
68
- subject.rescue_from Grape::Exceptions::ValidationErrors do |e|
71
+ subject.rescue_from described_class do |e|
69
72
  error!(e, 400)
70
73
  end
71
74
  subject.params do
@@ -4,16 +4,18 @@ require 'spec_helper'
4
4
 
5
5
  describe Grape::Exceptions::Validation do
6
6
  it 'fails when params are missing' do
7
- expect { Grape::Exceptions::Validation.new(message: 'presence') }.to raise_error(ArgumentError, /missing keyword:.+?params/)
7
+ expect { described_class.new(message: 'presence') }.to raise_error(ArgumentError, /missing keyword:.+?params/)
8
8
  end
9
+
9
10
  context 'when message is a symbol' do
10
11
  it 'stores message_key' do
11
- expect(Grape::Exceptions::Validation.new(params: ['id'], message: :presence).message_key).to eq(:presence)
12
+ expect(described_class.new(params: ['id'], message: :presence).message_key).to eq(:presence)
12
13
  end
13
14
  end
15
+
14
16
  context 'when message is a String' do
15
17
  it 'does not store the message_key' do
16
- expect(Grape::Exceptions::Validation.new(params: ['id'], message: 'presence').message_key).to eq(nil)
18
+ expect(described_class.new(params: ['id'], message: 'presence').message_key).to eq(nil)
17
19
  end
18
20
  end
19
21
  end
@@ -10,10 +10,10 @@ describe Grape::Extensions::Hash::ParamBuilder do
10
10
  end
11
11
 
12
12
  describe 'in an endpoint' do
13
- context '#params' do
13
+ describe '#params' do
14
14
  before do
15
15
  subject.params do
16
- build_with Grape::Extensions::Hash::ParamBuilder
16
+ build_with Grape::Extensions::Hash::ParamBuilder # rubocop:disable RSpec/DescribedClass
17
17
  end
18
18
 
19
19
  subject.get do
@@ -21,7 +21,7 @@ describe Grape::Extensions::Hash::ParamBuilder do
21
21
  end
22
22
  end
23
23
 
24
- it 'should be of type Hash' do
24
+ it 'is of type Hash' do
25
25
  get '/'
26
26
  expect(last_response.status).to eq(200)
27
27
  expect(last_response.body).to eq('Hash')
@@ -31,17 +31,17 @@ describe Grape::Extensions::Hash::ParamBuilder do
31
31
 
32
32
  describe 'in an api' do
33
33
  before do
34
- subject.send(:include, Grape::Extensions::Hash::ParamBuilder)
34
+ subject.send(:include, Grape::Extensions::Hash::ParamBuilder) # rubocop:disable RSpec/DescribedClass
35
35
  end
36
36
 
37
- context '#params' do
37
+ describe '#params' do
38
38
  before do
39
39
  subject.get do
40
40
  params.class
41
41
  end
42
42
  end
43
43
 
44
- it 'should be Hash' do
44
+ it 'is Hash' do
45
45
  get '/'
46
46
  expect(last_response.status).to eq(200)
47
47
  expect(last_response.body).to eq('Hash')
@@ -69,7 +69,7 @@ describe Grape::Extensions::Hash::ParamBuilder do
69
69
 
70
70
  it 'symbolizes the params' do
71
71
  subject.params do
72
- build_with Grape::Extensions::Hash::ParamBuilder
72
+ build_with Grape::Extensions::Hash::ParamBuilder # rubocop:disable RSpec/DescribedClass
73
73
  requires :a, type: String
74
74
  end
75
75
 
@@ -10,10 +10,10 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
10
10
  end
11
11
 
12
12
  describe 'in an endpoint' do
13
- context '#params' do
13
+ describe '#params' do
14
14
  before do
15
15
  subject.params do
16
- build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
16
+ build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder # rubocop:disable RSpec/DescribedClass
17
17
  end
18
18
 
19
19
  subject.get do
@@ -21,7 +21,7 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
21
21
  end
22
22
  end
23
23
 
24
- it 'should be of type Hash' do
24
+ it 'is of type Hash' do
25
25
  get '/'
26
26
  expect(last_response.status).to eq(200)
27
27
  expect(last_response.body).to eq('ActiveSupport::HashWithIndifferentAccess')
@@ -31,10 +31,10 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
31
31
 
32
32
  describe 'in an api' do
33
33
  before do
34
- subject.send(:include, Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder)
34
+ subject.send(:include, Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder) # rubocop:disable RSpec/DescribedClass
35
35
  end
36
36
 
37
- context '#params' do
37
+ describe '#params' do
38
38
  before do
39
39
  subject.get do
40
40
  params.class
@@ -49,7 +49,7 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
49
49
 
50
50
  it 'parses sub hash params' do
51
51
  subject.params do
52
- build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
52
+ build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder # rubocop:disable RSpec/DescribedClass
53
53
 
54
54
  optional :a, type: Hash do
55
55
  optional :b, type: Hash do
@@ -70,7 +70,7 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
70
70
 
71
71
  it 'params are indifferent to symbol or string keys' do
72
72
  subject.params do
73
- build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
73
+ build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder # rubocop:disable RSpec/DescribedClass
74
74
  optional :a, type: Hash do
75
75
  optional :b, type: Hash do
76
76
  optional :c, type: String
@@ -90,7 +90,7 @@ describe Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuild
90
90
 
91
91
  it 'responds to string keys' do
92
92
  subject.params do
93
- build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
93
+ build_with Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder # rubocop:disable RSpec/DescribedClass
94
94
  requires :a, type: String
95
95
  end
96
96
 
@@ -10,10 +10,10 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
10
10
  end
11
11
 
12
12
  describe 'in an endpoint' do
13
- context '#params' do
13
+ describe '#params' do
14
14
  before do
15
15
  subject.params do
16
- build_with Grape::Extensions::Hashie::Mash::ParamBuilder
16
+ build_with Grape::Extensions::Hashie::Mash::ParamBuilder # rubocop:disable RSpec/DescribedClass
17
17
  end
18
18
 
19
19
  subject.get do
@@ -21,7 +21,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
21
21
  end
22
22
  end
23
23
 
24
- it 'should be of type Hashie::Mash' do
24
+ it 'is of type Hashie::Mash' do
25
25
  get '/'
26
26
  expect(last_response.status).to eq(200)
27
27
  expect(last_response.body).to eq('Hashie::Mash')
@@ -31,17 +31,17 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
31
31
 
32
32
  describe 'in an api' do
33
33
  before do
34
- subject.send(:include, Grape::Extensions::Hashie::Mash::ParamBuilder)
34
+ subject.send(:include, Grape::Extensions::Hashie::Mash::ParamBuilder) # rubocop:disable RSpec/DescribedClass
35
35
  end
36
36
 
37
- context '#params' do
37
+ describe '#params' do
38
38
  before do
39
39
  subject.get do
40
40
  params.class
41
41
  end
42
42
  end
43
43
 
44
- it 'should be Hashie::Mash' do
44
+ it 'is Hashie::Mash' do
45
45
  get '/'
46
46
  expect(last_response.status).to eq(200)
47
47
  expect(last_response.body).to eq('Hashie::Mash')
@@ -57,7 +57,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
57
57
  end
58
58
  end
59
59
 
60
- it 'should be Hashie::Mash' do
60
+ it 'is Hashie::Mash' do
61
61
  get '/foo'
62
62
  expect(last_response.status).to eq(200)
63
63
  expect(last_response.body).to eq('Hashie::Mash')
@@ -66,7 +66,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
66
66
 
67
67
  it 'is indifferent to key or symbol access' do
68
68
  subject.params do
69
- build_with Grape::Extensions::Hashie::Mash::ParamBuilder
69
+ build_with Grape::Extensions::Hashie::Mash::ParamBuilder # rubocop:disable RSpec/DescribedClass
70
70
  requires :a, type: String
71
71
  end
72
72
  subject.get '/foo' do
@@ -44,7 +44,7 @@ describe Rack::Sendfile do
44
44
 
45
45
  it 'not contains Sendfile headers' do
46
46
  headers = subject[1]
47
- expect(headers).to_not include('X-Accel-Redirect')
47
+ expect(headers).not_to include('X-Accel-Redirect')
48
48
  end
49
49
  end
50
50
  end
@@ -3,6 +3,14 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Grape::API do
6
+ subject do
7
+ CombinedApi = combined_api
8
+ Class.new(Grape::API) do
9
+ format :json
10
+ mount CombinedApi => '/'
11
+ end
12
+ end
13
+
6
14
  let(:jobs_api) do
7
15
  Class.new(Grape::API) do
8
16
  namespace :one do
@@ -26,14 +34,6 @@ describe Grape::API do
26
34
  end
27
35
  end
28
36
 
29
- subject do
30
- CombinedApi = combined_api
31
- Class.new(Grape::API) do
32
- format :json
33
- mount CombinedApi => '/'
34
- end
35
- end
36
-
37
37
  def app
38
38
  subject
39
39
  end
@@ -16,7 +16,7 @@ describe Grape::Middleware::Auth::DSL do
16
16
  end
17
17
 
18
18
  describe '.auth' do
19
- it 'stets auth parameters' do
19
+ it 'sets auth parameters' do
20
20
  expect(subject.base_instance).to receive(:use).with(Grape::Middleware::Auth::Base, settings)
21
21
 
22
22
  subject.auth :http_digest, realm: settings[:realm], opaque: settings[:opaque], &settings[:proc]
@@ -38,16 +38,25 @@ describe Grape::Middleware::Auth::DSL do
38
38
  end
39
39
 
40
40
  describe '.http_basic' do
41
- it 'stets auth parameters' do
41
+ it 'sets auth parameters' do
42
42
  subject.http_basic realm: 'my_realm', &settings[:proc]
43
43
  expect(subject.auth).to eq(realm: 'my_realm', type: :http_basic, proc: block)
44
44
  end
45
45
  end
46
46
 
47
47
  describe '.http_digest' do
48
- it 'stets auth parameters' do
49
- subject.http_digest realm: 'my_realm', opaque: 'my_opaque', &settings[:proc]
50
- expect(subject.auth).to eq(realm: 'my_realm', type: :http_digest, proc: block, opaque: 'my_opaque')
48
+ context 'when realm is a hash' do
49
+ it 'sets auth parameters' do
50
+ subject.http_digest realm: { realm: 'my_realm', opaque: 'my_opaque' }, &settings[:proc]
51
+ expect(subject.auth).to eq(realm: { realm: 'my_realm', opaque: 'my_opaque' }, type: :http_digest, proc: block)
52
+ end
53
+ end
54
+
55
+ context 'when realm is not hash' do
56
+ it 'sets auth parameters' do
57
+ subject.http_digest realm: 'my_realm', opaque: 'my_opaque', &settings[:proc]
58
+ expect(subject.auth).to eq(realm: 'my_realm', type: :http_digest, proc: block, opaque: 'my_opaque')
59
+ end
51
60
  end
52
61
  end
53
62
  end