grape 1.5.2 → 1.7.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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +75 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +152 -21
  5. data/UPGRADING.md +86 -2
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +14 -18
  8. data/lib/grape/api.rb +18 -13
  9. data/lib/grape/cookies.rb +2 -0
  10. data/lib/grape/dry_types.rb +12 -0
  11. data/lib/grape/dsl/api.rb +0 -2
  12. data/lib/grape/dsl/callbacks.rb +0 -2
  13. data/lib/grape/dsl/configuration.rb +0 -2
  14. data/lib/grape/dsl/desc.rb +2 -19
  15. data/lib/grape/dsl/headers.rb +5 -2
  16. data/lib/grape/dsl/helpers.rb +7 -7
  17. data/lib/grape/dsl/inside_route.rb +43 -30
  18. data/lib/grape/dsl/middleware.rb +4 -6
  19. data/lib/grape/dsl/parameters.rb +8 -10
  20. data/lib/grape/dsl/request_response.rb +9 -8
  21. data/lib/grape/dsl/routing.rb +6 -4
  22. data/lib/grape/dsl/settings.rb +5 -7
  23. data/lib/grape/dsl/validations.rb +0 -15
  24. data/lib/grape/endpoint.rb +21 -36
  25. data/lib/grape/error_formatter/json.rb +9 -7
  26. data/lib/grape/error_formatter/xml.rb +2 -6
  27. data/lib/grape/exceptions/base.rb +2 -2
  28. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  29. data/lib/grape/exceptions/missing_group_type.rb +8 -1
  30. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  31. data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
  32. data/lib/grape/exceptions/validation.rb +1 -6
  33. data/lib/grape/formatter/json.rb +1 -0
  34. data/lib/grape/formatter/serializable_hash.rb +2 -1
  35. data/lib/grape/formatter/xml.rb +1 -0
  36. data/lib/grape/locale/en.yml +9 -8
  37. data/lib/grape/middleware/auth/dsl.rb +7 -2
  38. data/lib/grape/middleware/base.rb +3 -1
  39. data/lib/grape/middleware/error.rb +2 -2
  40. data/lib/grape/middleware/formatter.rb +4 -4
  41. data/lib/grape/middleware/stack.rb +2 -2
  42. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  43. data/lib/grape/middleware/versioner/header.rb +6 -4
  44. data/lib/grape/middleware/versioner/param.rb +1 -0
  45. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  46. data/lib/grape/middleware/versioner/path.rb +2 -0
  47. data/lib/grape/parser/json.rb +1 -1
  48. data/lib/grape/parser/xml.rb +1 -1
  49. data/lib/grape/path.rb +1 -0
  50. data/lib/grape/request.rb +5 -0
  51. data/lib/grape/router/pattern.rb +1 -1
  52. data/lib/grape/router/route.rb +2 -2
  53. data/lib/grape/router.rb +6 -0
  54. data/lib/grape/util/inheritable_setting.rb +1 -3
  55. data/lib/grape/util/json.rb +2 -0
  56. data/lib/grape/util/lazy_value.rb +3 -2
  57. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  58. data/lib/grape/validations/attributes_doc.rb +58 -0
  59. data/lib/grape/validations/params_scope.rb +137 -78
  60. data/lib/grape/validations/types/array_coercer.rb +0 -2
  61. data/lib/grape/validations/types/custom_type_coercer.rb +1 -2
  62. data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
  63. data/lib/grape/validations/types/json.rb +2 -1
  64. data/lib/grape/validations/types/primitive_coercer.rb +16 -8
  65. data/lib/grape/validations/types/set_coercer.rb +0 -2
  66. data/lib/grape/validations/types.rb +98 -30
  67. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  68. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  69. data/lib/grape/validations/validators/as_validator.rb +14 -0
  70. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  71. data/lib/grape/validations/validators/base.rb +82 -70
  72. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  73. data/lib/grape/validations/validators/default_validator.rb +51 -0
  74. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  75. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  76. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  77. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  78. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  79. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  80. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  81. data/lib/grape/validations/validators/values_validator.rb +88 -0
  82. data/lib/grape/validations.rb +16 -6
  83. data/lib/grape/version.rb +1 -1
  84. data/lib/grape.rb +70 -29
  85. data/spec/grape/api/custom_validations_spec.rb +116 -45
  86. data/spec/grape/api/deeply_included_options_spec.rb +3 -5
  87. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
  88. data/spec/grape/api/documentation_spec.rb +59 -0
  89. data/spec/grape/api/inherited_helpers_spec.rb +0 -2
  90. data/spec/grape/api/instance_spec.rb +0 -1
  91. data/spec/grape/api/invalid_format_spec.rb +2 -2
  92. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
  93. data/spec/grape/api/nested_helpers_spec.rb +0 -2
  94. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
  95. data/spec/grape/api/parameters_modification_spec.rb +0 -2
  96. data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
  97. data/spec/grape/api/recognize_path_spec.rb +1 -3
  98. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
  99. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
  100. data/spec/grape/api/routes_with_requirements_spec.rb +8 -10
  101. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
  102. data/spec/grape/api/shared_helpers_spec.rb +0 -2
  103. data/spec/grape/api_remount_spec.rb +16 -16
  104. data/spec/grape/api_spec.rb +527 -224
  105. data/spec/grape/config_spec.rb +0 -2
  106. data/spec/grape/dsl/callbacks_spec.rb +2 -3
  107. data/spec/grape/dsl/configuration_spec.rb +0 -2
  108. data/spec/grape/dsl/desc_spec.rb +0 -2
  109. data/spec/grape/dsl/headers_spec.rb +39 -11
  110. data/spec/grape/dsl/helpers_spec.rb +3 -4
  111. data/spec/grape/dsl/inside_route_spec.rb +16 -16
  112. data/spec/grape/dsl/logger_spec.rb +15 -19
  113. data/spec/grape/dsl/middleware_spec.rb +2 -3
  114. data/spec/grape/dsl/parameters_spec.rb +2 -2
  115. data/spec/grape/dsl/request_response_spec.rb +7 -8
  116. data/spec/grape/dsl/routing_spec.rb +11 -10
  117. data/spec/grape/dsl/settings_spec.rb +0 -2
  118. data/spec/grape/dsl/validations_spec.rb +0 -17
  119. data/spec/grape/endpoint/declared_spec.rb +261 -16
  120. data/spec/grape/endpoint_spec.rb +98 -57
  121. data/spec/grape/entity_spec.rb +22 -23
  122. data/spec/grape/exceptions/base_spec.rb +16 -2
  123. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
  124. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
  125. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
  126. data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
  127. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
  128. data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
  129. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
  130. data/spec/grape/exceptions/missing_option_spec.rb +1 -3
  131. data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
  132. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
  133. data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
  134. data/spec/grape/exceptions/validation_errors_spec.rb +13 -11
  135. data/spec/grape/exceptions/validation_spec.rb +5 -5
  136. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
  137. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
  138. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
  139. data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
  140. data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
  141. data/spec/grape/integration/rack_spec.rb +0 -2
  142. data/spec/grape/loading_spec.rb +8 -10
  143. data/spec/grape/middleware/auth/base_spec.rb +0 -1
  144. data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
  145. data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
  146. data/spec/grape/middleware/base_spec.rb +24 -17
  147. data/spec/grape/middleware/error_spec.rb +8 -3
  148. data/spec/grape/middleware/exception_spec.rb +111 -163
  149. data/spec/grape/middleware/formatter_spec.rb +27 -8
  150. data/spec/grape/middleware/globals_spec.rb +7 -6
  151. data/spec/grape/middleware/stack_spec.rb +14 -14
  152. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
  153. data/spec/grape/middleware/versioner/header_spec.rb +30 -15
  154. data/spec/grape/middleware/versioner/param_spec.rb +7 -3
  155. data/spec/grape/middleware/versioner/path_spec.rb +5 -3
  156. data/spec/grape/middleware/versioner_spec.rb +1 -3
  157. data/spec/grape/named_api_spec.rb +0 -2
  158. data/spec/grape/parser_spec.rb +4 -2
  159. data/spec/grape/path_spec.rb +52 -54
  160. data/spec/grape/presenters/presenter_spec.rb +7 -8
  161. data/spec/grape/request_spec.rb +6 -6
  162. data/spec/grape/util/inheritable_setting_spec.rb +7 -8
  163. data/spec/grape/util/inheritable_values_spec.rb +3 -3
  164. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
  165. data/spec/grape/util/stackable_values_spec.rb +7 -6
  166. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
  167. data/spec/grape/validations/attributes_doc_spec.rb +153 -0
  168. data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
  169. data/spec/grape/validations/instance_behaivour_spec.rb +9 -12
  170. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
  171. data/spec/grape/validations/params_scope_spec.rb +361 -96
  172. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
  173. data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
  174. data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
  175. data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
  176. data/spec/grape/validations/types_spec.rb +36 -10
  177. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
  178. data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
  179. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
  180. data/spec/grape/validations/validators/coerce_spec.rb +99 -24
  181. data/spec/grape/validations/validators/default_spec.rb +72 -80
  182. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
  183. data/spec/grape/validations/validators/except_values_spec.rb +3 -5
  184. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
  185. data/spec/grape/validations/validators/presence_spec.rb +16 -3
  186. data/spec/grape/validations/validators/regexp_spec.rb +25 -33
  187. data/spec/grape/validations/validators/same_as_spec.rb +14 -22
  188. data/spec/grape/validations/validators/values_spec.rb +182 -179
  189. data/spec/grape/validations_spec.rb +149 -80
  190. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  191. data/spec/integration/multi_json/json_spec.rb +1 -3
  192. data/spec/integration/multi_xml/xml_spec.rb +1 -3
  193. data/spec/shared/versioning_examples.rb +12 -9
  194. data/spec/spec_helper.rb +21 -6
  195. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  196. metadata +125 -115
  197. data/lib/grape/validations/validators/all_or_none.rb +0 -15
  198. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  199. data/lib/grape/validations/validators/as.rb +0 -16
  200. data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
  201. data/lib/grape/validations/validators/coerce.rb +0 -91
  202. data/lib/grape/validations/validators/default.rb +0 -48
  203. data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
  204. data/lib/grape/validations/validators/except_values.rb +0 -22
  205. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
  206. data/lib/grape/validations/validators/presence.rb +0 -12
  207. data/lib/grape/validations/validators/regexp.rb +0 -13
  208. data/lib/grape/validations/validators/same_as.rb +0 -26
  209. data/lib/grape/validations/validators/values.rb +0 -83
  210. data/spec/support/eager_load.rb +0 -19
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Grape::Extensions::Hashie::Mash::ParamBuilder do
6
4
  subject { Class.new(Grape::API) }
7
5
 
@@ -10,10 +8,10 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
10
8
  end
11
9
 
12
10
  describe 'in an endpoint' do
13
- context '#params' do
11
+ describe '#params' do
14
12
  before do
15
13
  subject.params do
16
- build_with Grape::Extensions::Hashie::Mash::ParamBuilder
14
+ build_with Grape::Extensions::Hashie::Mash::ParamBuilder # rubocop:disable RSpec/DescribedClass
17
15
  end
18
16
 
19
17
  subject.get do
@@ -21,7 +19,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
21
19
  end
22
20
  end
23
21
 
24
- it 'should be of type Hashie::Mash' do
22
+ it 'is of type Hashie::Mash' do
25
23
  get '/'
26
24
  expect(last_response.status).to eq(200)
27
25
  expect(last_response.body).to eq('Hashie::Mash')
@@ -31,17 +29,17 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
31
29
 
32
30
  describe 'in an api' do
33
31
  before do
34
- subject.send(:include, Grape::Extensions::Hashie::Mash::ParamBuilder)
32
+ subject.send(:include, Grape::Extensions::Hashie::Mash::ParamBuilder) # rubocop:disable RSpec/DescribedClass
35
33
  end
36
34
 
37
- context '#params' do
35
+ describe '#params' do
38
36
  before do
39
37
  subject.get do
40
38
  params.class
41
39
  end
42
40
  end
43
41
 
44
- it 'should be Hashie::Mash' do
42
+ it 'is Hashie::Mash' do
45
43
  get '/'
46
44
  expect(last_response.status).to eq(200)
47
45
  expect(last_response.body).to eq('Hashie::Mash')
@@ -57,7 +55,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
57
55
  end
58
56
  end
59
57
 
60
- it 'should be Hashie::Mash' do
58
+ it 'is Hashie::Mash' do
61
59
  get '/foo'
62
60
  expect(last_response.status).to eq(200)
63
61
  expect(last_response.body).to eq('Hashie::Mash')
@@ -66,7 +64,7 @@ describe Grape::Extensions::Hashie::Mash::ParamBuilder do
66
64
 
67
65
  it 'is indifferent to key or symbol access' do
68
66
  subject.params do
69
- build_with Grape::Extensions::Hashie::Mash::ParamBuilder
67
+ build_with Grape::Extensions::Hashie::Mash::ParamBuilder # rubocop:disable RSpec/DescribedClass
70
68
  requires :a, type: String
71
69
  end
72
70
  subject.get '/foo' do
@@ -2,8 +2,6 @@
2
2
 
3
3
  # see https://github.com/ruby-grape/grape/issues/1348
4
4
 
5
- require 'spec_helper'
6
-
7
5
  def namespace
8
6
  raise
9
7
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Rack::Sendfile do
6
4
  subject do
7
5
  content_object = file_object
@@ -44,7 +42,7 @@ describe Rack::Sendfile do
44
42
 
45
43
  it 'not contains Sendfile headers' do
46
44
  headers = subject[1]
47
- expect(headers).to_not include('X-Accel-Redirect')
45
+ expect(headers).not_to include('X-Accel-Redirect')
48
46
  end
49
47
  end
50
48
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Rack do
6
4
  it 'correctly populates params from a Tempfile' do
7
5
  input = Tempfile.new 'rubbish'
@@ -1,8 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Grape::API do
4
+ subject do
5
+ CombinedApi = combined_api
6
+ Class.new(Grape::API) do
7
+ format :json
8
+ mount CombinedApi => '/'
9
+ end
10
+ end
11
+
6
12
  let(:jobs_api) do
7
13
  Class.new(Grape::API) do
8
14
  namespace :one do
@@ -26,14 +32,6 @@ describe Grape::API do
26
32
  end
27
33
  end
28
34
 
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
35
  def app
38
36
  subject
39
37
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
3
  require 'base64'
5
4
 
6
5
  describe Grape::Middleware::Auth::Base do
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Grape::Middleware::Auth::DSL do
6
4
  subject { Class.new(Grape::API) }
7
5
 
8
- let(:block) { ->() {} }
6
+ let(:block) { -> {} }
9
7
  let(:settings) do
10
8
  {
11
9
  opaque: 'secret',
@@ -16,7 +14,7 @@ describe Grape::Middleware::Auth::DSL do
16
14
  end
17
15
 
18
16
  describe '.auth' do
19
- it 'stets auth parameters' do
17
+ it 'sets auth parameters' do
20
18
  expect(subject.base_instance).to receive(:use).with(Grape::Middleware::Auth::Base, settings)
21
19
 
22
20
  subject.auth :http_digest, realm: settings[:realm], opaque: settings[:opaque], &settings[:proc]
@@ -38,16 +36,25 @@ describe Grape::Middleware::Auth::DSL do
38
36
  end
39
37
 
40
38
  describe '.http_basic' do
41
- it 'stets auth parameters' do
39
+ it 'sets auth parameters' do
42
40
  subject.http_basic realm: 'my_realm', &settings[:proc]
43
41
  expect(subject.auth).to eq(realm: 'my_realm', type: :http_basic, proc: block)
44
42
  end
45
43
  end
46
44
 
47
45
  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')
46
+ context 'when realm is a hash' do
47
+ it 'sets auth parameters' do
48
+ subject.http_digest realm: { realm: 'my_realm', opaque: 'my_opaque' }, &settings[:proc]
49
+ expect(subject.auth).to eq(realm: { realm: 'my_realm', opaque: 'my_opaque' }, type: :http_digest, proc: block)
50
+ end
51
+ end
52
+
53
+ context 'when realm is not hash' do
54
+ it 'sets auth parameters' do
55
+ subject.http_digest realm: 'my_realm', opaque: 'my_opaque', &settings[:proc]
56
+ expect(subject.auth).to eq(realm: 'my_realm', type: :http_digest, proc: block, opaque: 'my_opaque')
57
+ end
51
58
  end
52
59
  end
53
60
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  require 'base64'
6
4
 
7
5
  describe Grape::Middleware::Auth::Strategies do
@@ -42,7 +40,17 @@ describe Grape::Middleware::Auth::Strategies do
42
40
  end
43
41
 
44
42
  module StrategiesSpec
45
- class Test < Grape::API
43
+ class PasswordHashed < Grape::API
44
+ http_digest(realm: { realm: 'Test Api', opaque: 'secret', passwords_hashed: true }) do |username|
45
+ { 'foo' => Digest::MD5.hexdigest(['foo', 'Test Api', 'bar'].join(':')) }[username]
46
+ end
47
+
48
+ get '/test' do
49
+ [{ hey: 'you' }, { there: 'bar' }, { foo: 'baz' }]
50
+ end
51
+ end
52
+
53
+ class PasswordIsNotHashed < Grape::API
46
54
  http_digest(realm: 'Test Api', opaque: 'secret') do |username|
47
55
  { 'foo' => 'bar' }[username]
48
56
  end
@@ -53,30 +61,60 @@ describe Grape::Middleware::Auth::Strategies do
53
61
  end
54
62
  end
55
63
 
56
- def app
57
- StrategiesSpec::Test
58
- end
64
+ context 'when password is hashed' do
65
+ def app
66
+ StrategiesSpec::PasswordHashed
67
+ end
59
68
 
60
- it 'is a digest authentication challenge' do
61
- get '/test'
62
- expect(last_response).to be_challenge
63
- end
69
+ it 'is a digest authentication challenge' do
70
+ get '/test'
71
+ expect(last_response).to be_challenge
72
+ end
64
73
 
65
- it 'throws a 401 if no auth is given' do
66
- get '/test'
67
- expect(last_response.status).to eq(401)
68
- end
74
+ it 'throws a 401 if no auth is given' do
75
+ get '/test'
76
+ expect(last_response.status).to eq(401)
77
+ end
69
78
 
70
- it 'authenticates if given valid creds' do
71
- digest_authorize 'foo', 'bar'
72
- get '/test'
73
- expect(last_response.status).to eq(200)
79
+ it 'authenticates if given valid creds' do
80
+ digest_authorize 'foo', 'bar'
81
+ get '/test'
82
+ expect(last_response.status).to eq(200)
83
+ end
84
+
85
+ it 'throws a 401 if given invalid creds' do
86
+ digest_authorize 'bar', 'foo'
87
+ get '/test'
88
+ expect(last_response.status).to eq(401)
89
+ end
74
90
  end
75
91
 
76
- it 'throws a 401 if given invalid creds' do
77
- digest_authorize 'bar', 'foo'
78
- get '/test'
79
- expect(last_response.status).to eq(401)
92
+ context 'when password is not hashed' do
93
+ def app
94
+ StrategiesSpec::PasswordIsNotHashed
95
+ end
96
+
97
+ it 'is a digest authentication challenge' do
98
+ get '/test'
99
+ expect(last_response).to be_challenge
100
+ end
101
+
102
+ it 'throws a 401 if no auth is given' do
103
+ get '/test'
104
+ expect(last_response.status).to eq(401)
105
+ end
106
+
107
+ it 'authenticates if given valid creds' do
108
+ digest_authorize 'foo', 'bar'
109
+ get '/test'
110
+ expect(last_response.status).to eq(200)
111
+ end
112
+
113
+ it 'throws a 401 if given invalid creds' do
114
+ digest_authorize 'bar', 'foo'
115
+ get '/test'
116
+ expect(last_response.status).to eq(401)
117
+ end
80
118
  end
81
119
  end
82
120
  end
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Grape::Middleware::Base do
6
- subject { Grape::Middleware::Base.new(blank_app) }
4
+ subject { described_class.new(blank_app) }
5
+
7
6
  let(:blank_app) { ->(_) { [200, {}, 'Hi there.'] } }
8
7
 
9
8
  before do
@@ -20,6 +19,8 @@ describe Grape::Middleware::Base do
20
19
  end
21
20
 
22
21
  context 'callbacks' do
22
+ after { subject.call!({}) }
23
+
23
24
  it 'calls #before' do
24
25
  expect(subject).to receive(:before)
25
26
  end
@@ -27,8 +28,6 @@ describe Grape::Middleware::Base do
27
28
  it 'calls #after' do
28
29
  expect(subject).to receive(:after)
29
30
  end
30
-
31
- after { subject.call!({}) }
32
31
  end
33
32
 
34
33
  context 'callbacks on error' do
@@ -58,7 +57,7 @@ describe Grape::Middleware::Base do
58
57
  context 'with patched warnings' do
59
58
  before do
60
59
  @warnings = warnings = []
61
- allow_any_instance_of(Grape::Middleware::Base).to receive(:warn) { |m| warnings << m }
60
+ allow_any_instance_of(described_class).to receive(:warn) { |m| warnings << m }
62
61
  allow(subject).to receive(:after).and_raise(StandardError)
63
62
  end
64
63
 
@@ -75,49 +74,57 @@ describe Grape::Middleware::Base do
75
74
  end
76
75
 
77
76
  describe '#response' do
78
- subject { Grape::Middleware::Base.new(response) }
77
+ subject do
78
+ puts described_class
79
+ described_class.new(response)
80
+ end
79
81
 
80
- context Array do
82
+ before { subject.call({}) }
83
+
84
+ context 'when Array' do
81
85
  let(:response) { ->(_) { [204, { abc: 1 }, 'test'] } }
82
86
 
83
87
  it 'status' do
84
- subject.call({})
85
88
  expect(subject.response.status).to eq(204)
86
89
  end
87
90
 
88
91
  it 'body' do
89
- subject.call({})
90
92
  expect(subject.response.body).to eq(['test'])
91
93
  end
92
94
 
93
95
  it 'header' do
94
- subject.call({})
95
96
  expect(subject.response.header).to have_key(:abc)
96
97
  end
98
+
99
+ it 'returns the memoized Rack::Response instance' do
100
+ expect(subject.response).to be(subject.response)
101
+ end
97
102
  end
98
103
 
99
- context Rack::Response do
104
+ context 'when Rack::Response' do
100
105
  let(:response) { ->(_) { Rack::Response.new('test', 204, abc: 1) } }
101
106
 
102
107
  it 'status' do
103
- subject.call({})
104
108
  expect(subject.response.status).to eq(204)
105
109
  end
106
110
 
107
111
  it 'body' do
108
- subject.call({})
109
112
  expect(subject.response.body).to eq(['test'])
110
113
  end
111
114
 
112
115
  it 'header' do
113
- subject.call({})
114
116
  expect(subject.response.header).to have_key(:abc)
115
117
  end
118
+
119
+ it 'returns the memoized Rack::Response instance' do
120
+ expect(subject.response).to be(subject.response)
121
+ end
116
122
  end
117
123
  end
118
124
 
119
125
  describe '#context' do
120
- subject { Grape::Middleware::Base.new(blank_app) }
126
+ subject { described_class.new(blank_app) }
127
+
121
128
  it 'allows access to response context' do
122
129
  subject.call(Grape::Env::API_ENDPOINT => { header: 'some header' })
123
130
  expect(subject.context).to eq(header: 'some header')
@@ -126,7 +133,7 @@ describe Grape::Middleware::Base do
126
133
 
127
134
  context 'options' do
128
135
  it 'persists options passed at initialization' do
129
- expect(Grape::Middleware::Base.new(blank_app, abc: true).options[:abc]).to be true
136
+ expect(described_class.new(blank_app, abc: true).options[:abc]).to be true
130
137
  end
131
138
 
132
139
  context 'defaults' do
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
3
  require 'grape-entity'
5
4
 
6
5
  describe Grape::Middleware::Error do
@@ -16,8 +15,7 @@ describe Grape::Middleware::Error do
16
15
 
17
16
  class ErrApp
18
17
  class << self
19
- attr_accessor :error
20
- attr_accessor :format
18
+ attr_accessor :error, :format
21
19
 
22
20
  def call(_env)
23
21
  throw :error, error
@@ -43,6 +41,12 @@ describe Grape::Middleware::Error do
43
41
  expect(last_response.status).to eq(410)
44
42
  end
45
43
 
44
+ it 'sets the status code based on the rack util status code symbol' do
45
+ ErrorSpec::ErrApp.error = { status: :gone }
46
+ get '/'
47
+ expect(last_response.status).to eq(410)
48
+ end
49
+
46
50
  it 'sets the error message appropriately' do
47
51
  ErrorSpec::ErrApp.error = { message: 'Awesome stuff.' }
48
52
  get '/'
@@ -63,6 +67,7 @@ describe Grape::Middleware::Error do
63
67
 
64
68
  context 'with http code' do
65
69
  let(:options) { { default_message: 'Aww, hamburgers.' } }
70
+
66
71
  it 'adds the status code if wanted' do
67
72
  ErrorSpec::ErrApp.error = { message: { code: 200 } }
68
73
  get '/'