grape 1.5.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +150 -21
  5. data/UPGRADING.md +61 -4
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +14 -18
  8. data/lib/grape/api.rb +17 -12
  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 +20 -35
  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/missing_group_type.rb +8 -1
  29. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  30. data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
  31. data/lib/grape/exceptions/validation.rb +1 -6
  32. data/lib/grape/formatter/json.rb +1 -0
  33. data/lib/grape/formatter/serializable_hash.rb +2 -1
  34. data/lib/grape/formatter/xml.rb +1 -0
  35. data/lib/grape/locale/en.yml +9 -8
  36. data/lib/grape/middleware/auth/dsl.rb +7 -2
  37. data/lib/grape/middleware/base.rb +3 -1
  38. data/lib/grape/middleware/error.rb +2 -2
  39. data/lib/grape/middleware/formatter.rb +4 -4
  40. data/lib/grape/middleware/stack.rb +2 -2
  41. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  42. data/lib/grape/middleware/versioner/header.rb +6 -4
  43. data/lib/grape/middleware/versioner/param.rb +1 -0
  44. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  45. data/lib/grape/middleware/versioner/path.rb +2 -0
  46. data/lib/grape/path.rb +1 -0
  47. data/lib/grape/request.rb +3 -0
  48. data/lib/grape/router/pattern.rb +1 -1
  49. data/lib/grape/router/route.rb +2 -2
  50. data/lib/grape/router.rb +6 -0
  51. data/lib/grape/util/inheritable_setting.rb +1 -3
  52. data/lib/grape/util/json.rb +2 -0
  53. data/lib/grape/util/lazy_value.rb +3 -2
  54. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  55. data/lib/grape/validations/attributes_doc.rb +58 -0
  56. data/lib/grape/validations/params_scope.rb +137 -78
  57. data/lib/grape/validations/types/array_coercer.rb +0 -2
  58. data/lib/grape/validations/types/custom_type_coercer.rb +1 -0
  59. data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
  60. data/lib/grape/validations/types/json.rb +2 -1
  61. data/lib/grape/validations/types/primitive_coercer.rb +16 -8
  62. data/lib/grape/validations/types/set_coercer.rb +0 -2
  63. data/lib/grape/validations/types.rb +98 -30
  64. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  65. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  66. data/lib/grape/validations/validators/as_validator.rb +14 -0
  67. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  68. data/lib/grape/validations/validators/base.rb +82 -70
  69. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  70. data/lib/grape/validations/validators/default_validator.rb +51 -0
  71. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  72. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  73. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  74. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  75. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  76. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  77. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  78. data/lib/grape/validations/validators/values_validator.rb +88 -0
  79. data/lib/grape/validations.rb +16 -6
  80. data/lib/grape/version.rb +1 -1
  81. data/lib/grape.rb +69 -29
  82. data/spec/grape/api/custom_validations_spec.rb +116 -45
  83. data/spec/grape/api/deeply_included_options_spec.rb +3 -5
  84. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
  85. data/spec/grape/api/documentation_spec.rb +59 -0
  86. data/spec/grape/api/inherited_helpers_spec.rb +0 -2
  87. data/spec/grape/api/instance_spec.rb +0 -1
  88. data/spec/grape/api/invalid_format_spec.rb +2 -2
  89. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
  90. data/spec/grape/api/nested_helpers_spec.rb +0 -2
  91. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
  92. data/spec/grape/api/parameters_modification_spec.rb +0 -2
  93. data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
  94. data/spec/grape/api/recognize_path_spec.rb +1 -3
  95. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
  96. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
  97. data/spec/grape/api/routes_with_requirements_spec.rb +8 -10
  98. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
  99. data/spec/grape/api/shared_helpers_spec.rb +0 -2
  100. data/spec/grape/api_remount_spec.rb +16 -16
  101. data/spec/grape/api_spec.rb +457 -231
  102. data/spec/grape/config_spec.rb +0 -2
  103. data/spec/grape/dsl/callbacks_spec.rb +2 -3
  104. data/spec/grape/dsl/configuration_spec.rb +0 -2
  105. data/spec/grape/dsl/desc_spec.rb +0 -2
  106. data/spec/grape/dsl/headers_spec.rb +39 -11
  107. data/spec/grape/dsl/helpers_spec.rb +3 -4
  108. data/spec/grape/dsl/inside_route_spec.rb +16 -16
  109. data/spec/grape/dsl/logger_spec.rb +15 -19
  110. data/spec/grape/dsl/middleware_spec.rb +2 -3
  111. data/spec/grape/dsl/parameters_spec.rb +2 -2
  112. data/spec/grape/dsl/request_response_spec.rb +7 -8
  113. data/spec/grape/dsl/routing_spec.rb +11 -10
  114. data/spec/grape/dsl/settings_spec.rb +0 -2
  115. data/spec/grape/dsl/validations_spec.rb +0 -17
  116. data/spec/grape/endpoint/declared_spec.rb +261 -16
  117. data/spec/grape/endpoint_spec.rb +86 -58
  118. data/spec/grape/entity_spec.rb +22 -23
  119. data/spec/grape/exceptions/base_spec.rb +16 -2
  120. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
  121. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
  122. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
  123. data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
  124. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
  125. data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
  126. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
  127. data/spec/grape/exceptions/missing_option_spec.rb +1 -3
  128. data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
  129. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
  130. data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
  131. data/spec/grape/exceptions/validation_errors_spec.rb +13 -11
  132. data/spec/grape/exceptions/validation_spec.rb +5 -5
  133. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
  134. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
  135. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
  136. data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
  137. data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
  138. data/spec/grape/integration/rack_spec.rb +0 -2
  139. data/spec/grape/loading_spec.rb +8 -10
  140. data/spec/grape/middleware/auth/base_spec.rb +0 -1
  141. data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
  142. data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
  143. data/spec/grape/middleware/base_spec.rb +24 -17
  144. data/spec/grape/middleware/error_spec.rb +8 -3
  145. data/spec/grape/middleware/exception_spec.rb +111 -163
  146. data/spec/grape/middleware/formatter_spec.rb +27 -8
  147. data/spec/grape/middleware/globals_spec.rb +7 -6
  148. data/spec/grape/middleware/stack_spec.rb +14 -14
  149. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
  150. data/spec/grape/middleware/versioner/header_spec.rb +30 -15
  151. data/spec/grape/middleware/versioner/param_spec.rb +7 -3
  152. data/spec/grape/middleware/versioner/path_spec.rb +5 -3
  153. data/spec/grape/middleware/versioner_spec.rb +1 -3
  154. data/spec/grape/named_api_spec.rb +0 -2
  155. data/spec/grape/parser_spec.rb +4 -2
  156. data/spec/grape/path_spec.rb +52 -54
  157. data/spec/grape/presenters/presenter_spec.rb +7 -8
  158. data/spec/grape/request_spec.rb +6 -6
  159. data/spec/grape/util/inheritable_setting_spec.rb +7 -8
  160. data/spec/grape/util/inheritable_values_spec.rb +3 -3
  161. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
  162. data/spec/grape/util/stackable_values_spec.rb +7 -6
  163. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
  164. data/spec/grape/validations/attributes_doc_spec.rb +153 -0
  165. data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
  166. data/spec/grape/validations/instance_behaivour_spec.rb +9 -12
  167. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
  168. data/spec/grape/validations/params_scope_spec.rb +361 -96
  169. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
  170. data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
  171. data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
  172. data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
  173. data/spec/grape/validations/types_spec.rb +36 -10
  174. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
  175. data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
  176. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
  177. data/spec/grape/validations/validators/coerce_spec.rb +23 -24
  178. data/spec/grape/validations/validators/default_spec.rb +72 -80
  179. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
  180. data/spec/grape/validations/validators/except_values_spec.rb +3 -5
  181. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
  182. data/spec/grape/validations/validators/presence_spec.rb +16 -3
  183. data/spec/grape/validations/validators/regexp_spec.rb +25 -33
  184. data/spec/grape/validations/validators/same_as_spec.rb +14 -22
  185. data/spec/grape/validations/validators/values_spec.rb +182 -179
  186. data/spec/grape/validations_spec.rb +149 -80
  187. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  188. data/spec/integration/multi_json/json_spec.rb +1 -3
  189. data/spec/integration/multi_xml/xml_spec.rb +1 -3
  190. data/spec/shared/versioning_examples.rb +12 -9
  191. data/spec/spec_helper.rb +21 -6
  192. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  193. metadata +126 -117
  194. data/lib/grape/validations/validators/all_or_none.rb +0 -15
  195. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  196. data/lib/grape/validations/validators/as.rb +0 -16
  197. data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
  198. data/lib/grape/validations/validators/coerce.rb +0 -91
  199. data/lib/grape/validations/validators/default.rb +0 -48
  200. data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
  201. data/lib/grape/validations/validators/except_values.rb +0 -22
  202. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
  203. data/lib/grape/validations/validators/presence.rb +0 -12
  204. data/lib/grape/validations/validators/regexp.rb +0 -13
  205. data/lib/grape/validations/validators/same_as.rb +0 -26
  206. data/lib/grape/validations/validators/values.rb +0 -83
  207. 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 '/'