evil-client 0.3.3 → 1.0.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 (180) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +0 -11
  3. data/.gitignore +1 -0
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +22 -19
  6. data/.travis.yml +1 -0
  7. data/CHANGELOG.md +251 -6
  8. data/LICENSE.txt +3 -1
  9. data/README.md +47 -81
  10. data/docs/helpers/body.md +93 -0
  11. data/docs/helpers/connection.md +19 -0
  12. data/docs/helpers/headers.md +72 -0
  13. data/docs/helpers/http_method.md +39 -0
  14. data/docs/helpers/let.md +14 -0
  15. data/docs/helpers/logger.md +24 -0
  16. data/docs/helpers/middleware.md +56 -0
  17. data/docs/helpers/operation.md +103 -0
  18. data/docs/helpers/option.md +50 -0
  19. data/docs/helpers/path.md +37 -0
  20. data/docs/helpers/query.md +59 -0
  21. data/docs/helpers/response.md +40 -0
  22. data/docs/helpers/scope.md +121 -0
  23. data/docs/helpers/security.md +102 -0
  24. data/docs/helpers/validate.md +68 -0
  25. data/docs/index.md +70 -78
  26. data/docs/license.md +5 -1
  27. data/docs/rspec.md +96 -0
  28. data/evil-client.gemspec +10 -8
  29. data/lib/evil/client.rb +126 -72
  30. data/lib/evil/client/builder.rb +47 -0
  31. data/lib/evil/client/builder/operation.rb +40 -0
  32. data/lib/evil/client/builder/scope.rb +31 -0
  33. data/lib/evil/client/chaining.rb +17 -0
  34. data/lib/evil/client/connection.rb +60 -20
  35. data/lib/evil/client/container.rb +66 -0
  36. data/lib/evil/client/container/operation.rb +23 -0
  37. data/lib/evil/client/container/scope.rb +28 -0
  38. data/lib/evil/client/exceptions/definition_error.rb +15 -0
  39. data/lib/evil/client/exceptions/name_error.rb +32 -0
  40. data/lib/evil/client/exceptions/response_error.rb +42 -0
  41. data/lib/evil/client/exceptions/type_error.rb +29 -0
  42. data/lib/evil/client/exceptions/validation_error.rb +27 -0
  43. data/lib/evil/client/formatter.rb +49 -0
  44. data/lib/evil/client/formatter/form.rb +45 -0
  45. data/lib/evil/client/formatter/multipart.rb +33 -0
  46. data/lib/evil/client/formatter/part.rb +66 -0
  47. data/lib/evil/client/formatter/text.rb +21 -0
  48. data/lib/evil/client/resolver.rb +84 -0
  49. data/lib/evil/client/resolver/body.rb +22 -0
  50. data/lib/evil/client/resolver/format.rb +30 -0
  51. data/lib/evil/client/resolver/headers.rb +46 -0
  52. data/lib/evil/client/resolver/http_method.rb +34 -0
  53. data/lib/evil/client/resolver/middleware.rb +36 -0
  54. data/lib/evil/client/resolver/query.rb +39 -0
  55. data/lib/evil/client/resolver/request.rb +96 -0
  56. data/lib/evil/client/resolver/response.rb +26 -0
  57. data/lib/evil/client/resolver/security.rb +113 -0
  58. data/lib/evil/client/resolver/uri.rb +35 -0
  59. data/lib/evil/client/rspec.rb +127 -0
  60. data/lib/evil/client/schema.rb +105 -0
  61. data/lib/evil/client/schema/operation.rb +177 -0
  62. data/lib/evil/client/schema/scope.rb +73 -0
  63. data/lib/evil/client/settings.rb +172 -0
  64. data/lib/evil/client/settings/validator.rb +64 -0
  65. data/mkdocs.yml +21 -15
  66. data/spec/features/custom_connection_spec.rb +17 -0
  67. data/spec/features/operation/middleware_spec.rb +50 -0
  68. data/spec/features/operation/options_spec.rb +71 -0
  69. data/spec/features/operation/request_spec.rb +94 -0
  70. data/spec/features/operation/response_spec.rb +48 -0
  71. data/spec/features/scope/options_spec.rb +52 -0
  72. data/spec/fixtures/locales/en.yml +16 -0
  73. data/spec/fixtures/test_client.rb +76 -0
  74. data/spec/spec_helper.rb +18 -6
  75. data/spec/support/fixtures_helper.rb +7 -0
  76. data/spec/unit/builder/operation_spec.rb +90 -0
  77. data/spec/unit/builder/scope_spec.rb +84 -0
  78. data/spec/unit/client_spec.rb +137 -0
  79. data/spec/unit/connection_spec.rb +78 -0
  80. data/spec/unit/container/operation_spec.rb +81 -0
  81. data/spec/unit/container/scope_spec.rb +61 -0
  82. data/spec/unit/container_spec.rb +107 -0
  83. data/spec/unit/exceptions/definition_error_spec.rb +15 -0
  84. data/spec/unit/exceptions/name_error_spec.rb +77 -0
  85. data/spec/unit/exceptions/response_error_spec.rb +22 -0
  86. data/spec/unit/exceptions/type_error_spec.rb +71 -0
  87. data/spec/unit/exceptions/validation_error_spec.rb +13 -0
  88. data/spec/unit/formatter/form_spec.rb +27 -0
  89. data/spec/unit/formatter/multipart_spec.rb +23 -0
  90. data/spec/unit/formatter/part_spec.rb +49 -0
  91. data/spec/unit/formatter/text_spec.rb +37 -0
  92. data/spec/unit/formatter_spec.rb +46 -0
  93. data/spec/unit/resolver/body_spec.rb +65 -0
  94. data/spec/unit/resolver/format_spec.rb +66 -0
  95. data/spec/unit/resolver/headers_spec.rb +93 -0
  96. data/spec/unit/resolver/http_method_spec.rb +67 -0
  97. data/spec/unit/resolver/middleware_spec.rb +83 -0
  98. data/spec/unit/resolver/query_spec.rb +85 -0
  99. data/spec/unit/resolver/request_spec.rb +121 -0
  100. data/spec/unit/resolver/response_spec.rb +64 -0
  101. data/spec/unit/resolver/security_spec.rb +156 -0
  102. data/spec/unit/resolver/uri_spec.rb +117 -0
  103. data/spec/unit/rspec_spec.rb +342 -0
  104. data/spec/unit/schema/operation_spec.rb +309 -0
  105. data/spec/unit/schema/scope_spec.rb +110 -0
  106. data/spec/unit/schema_spec.rb +157 -0
  107. data/spec/unit/settings/validator_spec.rb +128 -0
  108. data/spec/unit/settings_spec.rb +248 -0
  109. metadata +192 -135
  110. data/docs/base_url.md +0 -38
  111. data/docs/documentation.md +0 -9
  112. data/docs/headers.md +0 -59
  113. data/docs/http_method.md +0 -31
  114. data/docs/model.md +0 -173
  115. data/docs/operation.md +0 -0
  116. data/docs/overview.md +0 -0
  117. data/docs/path.md +0 -48
  118. data/docs/query.md +0 -99
  119. data/docs/responses.md +0 -66
  120. data/docs/security.md +0 -102
  121. data/docs/settings.md +0 -32
  122. data/lib/evil/client/connection/net_http.rb +0 -57
  123. data/lib/evil/client/dsl.rb +0 -127
  124. data/lib/evil/client/dsl/base.rb +0 -26
  125. data/lib/evil/client/dsl/files.rb +0 -37
  126. data/lib/evil/client/dsl/headers.rb +0 -16
  127. data/lib/evil/client/dsl/http_method.rb +0 -24
  128. data/lib/evil/client/dsl/operation.rb +0 -91
  129. data/lib/evil/client/dsl/operations.rb +0 -41
  130. data/lib/evil/client/dsl/path.rb +0 -25
  131. data/lib/evil/client/dsl/query.rb +0 -16
  132. data/lib/evil/client/dsl/response.rb +0 -61
  133. data/lib/evil/client/dsl/responses.rb +0 -29
  134. data/lib/evil/client/dsl/scope.rb +0 -27
  135. data/lib/evil/client/dsl/security.rb +0 -57
  136. data/lib/evil/client/dsl/verifier.rb +0 -35
  137. data/lib/evil/client/middleware.rb +0 -81
  138. data/lib/evil/client/middleware/base.rb +0 -11
  139. data/lib/evil/client/middleware/merge_security.rb +0 -20
  140. data/lib/evil/client/middleware/normalize_headers.rb +0 -17
  141. data/lib/evil/client/middleware/stringify_form.rb +0 -40
  142. data/lib/evil/client/middleware/stringify_json.rb +0 -19
  143. data/lib/evil/client/middleware/stringify_multipart.rb +0 -36
  144. data/lib/evil/client/middleware/stringify_multipart/part.rb +0 -36
  145. data/lib/evil/client/middleware/stringify_query.rb +0 -35
  146. data/lib/evil/client/operation.rb +0 -34
  147. data/lib/evil/client/operation/request.rb +0 -26
  148. data/lib/evil/client/operation/response.rb +0 -39
  149. data/lib/evil/client/operation/response_error.rb +0 -13
  150. data/lib/evil/client/operation/unexpected_response_error.rb +0 -19
  151. data/spec/features/instantiation_spec.rb +0 -68
  152. data/spec/features/middleware_spec.rb +0 -79
  153. data/spec/features/operation_with_documentation_spec.rb +0 -41
  154. data/spec/features/operation_with_files_spec.rb +0 -40
  155. data/spec/features/operation_with_form_body_spec.rb +0 -158
  156. data/spec/features/operation_with_headers_spec.rb +0 -99
  157. data/spec/features/operation_with_http_method_spec.rb +0 -45
  158. data/spec/features/operation_with_json_body_spec.rb +0 -156
  159. data/spec/features/operation_with_nested_responses_spec.rb +0 -95
  160. data/spec/features/operation_with_path_spec.rb +0 -47
  161. data/spec/features/operation_with_query_spec.rb +0 -84
  162. data/spec/features/operation_with_security_spec.rb +0 -228
  163. data/spec/features/scoping_spec.rb +0 -48
  164. data/spec/support/test_client.rb +0 -15
  165. data/spec/unit/evil/client/connection/net_http_spec.rb +0 -38
  166. data/spec/unit/evil/client/dsl/files_spec.rb +0 -37
  167. data/spec/unit/evil/client/dsl/operation_spec.rb +0 -374
  168. data/spec/unit/evil/client/dsl/operations_spec.rb +0 -29
  169. data/spec/unit/evil/client/dsl/scope_spec.rb +0 -32
  170. data/spec/unit/evil/client/dsl/security_spec.rb +0 -135
  171. data/spec/unit/evil/client/middleware/merge_security_spec.rb +0 -32
  172. data/spec/unit/evil/client/middleware/normalize_headers_spec.rb +0 -17
  173. data/spec/unit/evil/client/middleware/stringify_form_spec.rb +0 -63
  174. data/spec/unit/evil/client/middleware/stringify_json_spec.rb +0 -61
  175. data/spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb +0 -59
  176. data/spec/unit/evil/client/middleware/stringify_multipart_spec.rb +0 -62
  177. data/spec/unit/evil/client/middleware/stringify_query_spec.rb +0 -40
  178. data/spec/unit/evil/client/middleware_spec.rb +0 -46
  179. data/spec/unit/evil/client/operation/request_spec.rb +0 -49
  180. data/spec/unit/evil/client/operation/response_spec.rb +0 -63
@@ -1,48 +0,0 @@
1
- RSpec.describe "scoping" do
2
- # see Test::Client definition in `/spec/support/test_client.rb`
3
- before do
4
- class Test::Client < Evil::Client
5
- operation :update_user do
6
- http_method :put
7
- path { |id:, **| "users/#{id}" }
8
-
9
- query do
10
- attribute :token
11
- end
12
-
13
- body format: :form do
14
- attribute :name
15
- end
16
-
17
- response :success, 200
18
- end
19
-
20
- scope do
21
- param :token
22
-
23
- scope :users do
24
- scope do
25
- param :id
26
-
27
- def update(name:)
28
- operations[:update_user].call(id: id, token: token, name: name)
29
- end
30
- end
31
- end
32
- end
33
- end
34
-
35
- stub_request(:put, //)
36
- end
37
-
38
- let(:path) { "https://foo.example.com/api/v3/users/7?token=qux" }
39
- let(:client) do
40
- Test::Client.new "foo", version: 3, user: "bar"
41
- end
42
-
43
- it "provides access to params over nested scopes" do
44
- client["qux"].users[7].update name: "baz"
45
-
46
- expect(a_request(:put, path).with(body: "name=baz")).to have_been_made
47
- end
48
- end
@@ -1,15 +0,0 @@
1
- module Test
2
- class Client < Evil::Client
3
- settings do
4
- param :subdomain, type: Dry::Types["strict.string"]
5
- option :version, type: Dry::Types["coercible.int"], default: proc { 1 }
6
- option :user, type: Dry::Types["strict.string"]
7
- option :password, type: Dry::Types["coercible.string"], optional: true
8
- option :token, type: Dry::Types["coercible.string"], optional: true
9
- end
10
-
11
- base_url do |settings|
12
- "https://#{settings.subdomain}.example.com/api/v#{settings.version}/"
13
- end
14
- end
15
- end
@@ -1,38 +0,0 @@
1
- require "evil/client/connection/net_http"
2
-
3
- describe Evil::Client::Connection::NetHTTP do
4
- let(:uri) { URI("https://example.com/foo/") }
5
- let(:connection) { described_class.new(uri) }
6
- let(:env) do
7
- {
8
- http_method: "post",
9
- path: "bar/baz",
10
- headers: { "Content-Type": "text/plain", "Accept": "text/plain" },
11
- body_string: "Check!",
12
- query_string: "status=new"
13
- }
14
- end
15
-
16
- before do
17
- stub_request(:post, "https://example.com/foo/bar/baz?status=new")
18
- .to_return status: 201,
19
- body: "Success!",
20
- headers: { "Content-Type" => "text/plain; charset: utf-8" }
21
- end
22
-
23
- subject { connection.call env }
24
-
25
- it "sends a request" do
26
- subject
27
- expect(a_request(:post, "https://example.com/foo/bar/baz?status=new"))
28
- .to have_been_made
29
- end
30
-
31
- it "returns rack-compatible response" do
32
- expect(subject).to eq [
33
- 201,
34
- { "content-type" => ["text/plain; charset: utf-8"] },
35
- ["Success!"]
36
- ]
37
- end
38
- end
@@ -1,37 +0,0 @@
1
- RSpec.describe Evil::Client::DSL::Files do
2
- subject do
3
- described_class.new(&block).call file: "Hi!",
4
- charset: "utf-16",
5
- type: "application/json",
6
- filename: "greetings.json",
7
- text: "Hoorah!"
8
- end
9
-
10
- context "from block without definitions:" do
11
- let(:block) { proc {} }
12
-
13
- it "provides an empty schema" do
14
- expect(subject).to eq([])
15
- end
16
- end
17
-
18
- context "from block with definitions:" do
19
- let(:block) do
20
- proc do |file:, **opts|
21
- add file, **opts
22
- end
23
- end
24
-
25
- it "provides a schema" do
26
- expect(subject).to be_a Array
27
- expect(subject.count).to eq 1
28
-
29
- item = subject.first
30
- expect(item[:file]).to be_a StringIO
31
- expect(item[:file].read).to eq "Hi!"
32
- expect(item[:type]).to eq MIME::Types["application/json"].first
33
- expect(item[:charset]).to eq "utf-16"
34
- expect(item[:filename]).to eq "greetings.json"
35
- end
36
- end
37
- end
@@ -1,374 +0,0 @@
1
- RSpec.describe Evil::Client::DSL::Operation do
2
- let(:operation) { described_class.new(:some_operation, block) }
3
- let(:settings) { double version: 3, user: "foo", password: "bar" }
4
-
5
- subject { operation.finalize(settings) }
6
-
7
- context "without definitions" do
8
- let(:block) { proc {} }
9
- it "returns a hash" do
10
- expect(subject).to eq key: :some_operation, responses: {}
11
- end
12
- end
13
-
14
- context "with #documentation" do
15
- let(:block) do
16
- proc { |settings| documentation "https://foo.bar/v#{settings.version}" }
17
- end
18
-
19
- it "defines link to :doc" do
20
- expect(subject[:doc]).to eq "https://foo.bar/v3"
21
- end
22
- end
23
-
24
- context "with #http_method" do
25
- let(:block) do
26
- proc { |settings| http_method settings.version > 2 ? "post" : "get" }
27
- end
28
-
29
- it "defines :method" do
30
- expect(subject[:method].call).to eq "post"
31
- end
32
- end
33
-
34
- context "with #path" do
35
- let(:block) do
36
- proc do |settings|
37
- path { |id:, **| "/v#{settings.version}/users/#{id}/" }
38
- end
39
- end
40
-
41
- it "defines :path without trailing slashes" do
42
- path = subject[:path]
43
- expect(path).to be_kind_of Proc
44
- expect(path.call(id: 55)).to eq "v3/users/55"
45
- end
46
- end
47
-
48
- context "with #files" do
49
- let(:block) do
50
- proc do
51
- files do |file:, **options|
52
- add file, **options
53
- end
54
- end
55
- end
56
-
57
- it "sets format to file" do
58
- expect(subject[:format]).to eq "multipart"
59
- end
60
-
61
- it "defines schema for a file" do
62
- file = Tempfile.new
63
-
64
- schema = subject[:files].call file: file,
65
- type: "text/html",
66
- charset: "utf-16"
67
-
68
- expect(schema).to contain_exactly \
69
- file: file,
70
- type: MIME::Types["text/html"].first,
71
- charset: "utf-16",
72
- filename: nil
73
- end
74
-
75
- it "wraps string to StringIO" do
76
- schema = subject[:files].call file: "Hello!"
77
- file = schema.first[:file]
78
-
79
- expect(file).to be_kind_of StringIO
80
- expect(file.read).to eq "Hello!"
81
- end
82
- end
83
-
84
- context "with #security" do
85
- let(:block) do
86
- proc do |settings|
87
- security do
88
- basic_auth settings.user, settings.password
89
- end
90
- end
91
- end
92
-
93
- it "defines :security schema" do
94
- expect(subject[:security].call)
95
- .to eq headers: { "authorization" => "Basic Zm9vOmJhcg==" }
96
- end
97
- end
98
-
99
- context "with #body" do
100
- context "with block without :model" do
101
- let(:block) do
102
- proc do |_|
103
- body do
104
- attribute :foo
105
- attribute :bar
106
- end
107
- end
108
- end
109
-
110
- it "sets format to json" do
111
- expect(subject[:format]).to eq "json"
112
- end
113
-
114
- it "defines :block as model filter" do
115
- model = subject[:body][foo: :FOO, bar: :BAR, baz: :BAZ]
116
- expect(model).to eq foo: :FOO, bar: :BAR
117
- end
118
- end
119
-
120
- context "with :model without block" do
121
- before do
122
- class Test::Foo < Evil::Struct
123
- attribute :qux
124
- end
125
- end
126
-
127
- let(:block) do
128
- proc do |_|
129
- body model: Test::Foo
130
- end
131
- end
132
-
133
- it "defines :block as model filter" do
134
- model = subject[:body][foo: :FOO, bar: :BAR, qux: :QUX, baz: :BAZ]
135
- expect(model).to eq qux: :QUX
136
- end
137
- end
138
-
139
- context "with :model and block" do
140
- before do
141
- class Test::Foo < Evil::Struct
142
- attribute :qux
143
- end
144
- end
145
-
146
- let(:block) do
147
- proc do |_|
148
- body model: Test::Foo do
149
- attribute :foo
150
- attribute :bar
151
- end
152
- end
153
- end
154
-
155
- it "defines :block as model filter" do
156
- model = subject[:body][foo: :FOO, bar: :BAR, qux: :QUX, baz: :BAZ]
157
- expect(model).to eq foo: :FOO, bar: :BAR, qux: :QUX
158
- end
159
- end
160
- end
161
-
162
- context "with #query" do
163
- before do
164
- class Test::Foo < Evil::Struct
165
- attribute :qux
166
- end
167
- end
168
-
169
- let(:block) do
170
- proc do |settings|
171
- query model: Test::Foo do
172
- attribute settings.user
173
- attribute :bar
174
- end
175
- end
176
- end
177
-
178
- it "defines :block as model filter" do
179
- model = subject[:query][foo: :FOO, bar: :BAR, qux: :QUX, baz: :BAZ]
180
- expect(model).to eq foo: :FOO, bar: :BAR, qux: :QUX
181
- end
182
- end
183
-
184
- context "with #headers" do
185
- before do
186
- class Test::Foo < Evil::Struct
187
- attribute :qux
188
- end
189
- end
190
-
191
- let(:block) do
192
- proc do |settings|
193
- headers model: Test::Foo do
194
- attribute settings.user
195
- attribute :bar
196
- end
197
- end
198
- end
199
-
200
- it "defines :block as model filter" do
201
- model = subject[:headers][foo: :FOO, bar: :BAR, qux: :QUX, baz: :BAZ]
202
- expect(model).to eq foo: :FOO, bar: :BAR, qux: :QUX
203
- end
204
- end
205
-
206
- context "with #response" do
207
- let(:response_schema) { subject[:responses][:success] }
208
- let(:response_raise) { response_schema[:raise] }
209
- let(:response_coercer) { response_schema[:coercer] }
210
-
211
- context "with plain format" do
212
- let(:body) { "foo" }
213
- let(:block) { proc { |_| response :success, 200, format: :plain } }
214
-
215
- it "works" do
216
- expect(response_coercer.call(body)).to eq "foo"
217
- end
218
- end
219
-
220
- context "with plain format and handler" do
221
- let(:body) { "foo" }
222
- let(:block) do
223
- proc do |_|
224
- response :success, 200, format: :plain do |body|
225
- body.to_sym
226
- end
227
- end
228
- end
229
-
230
- it "applies coercer" do
231
- expect(response_coercer.call(body)).to eq :foo
232
- end
233
- end
234
-
235
- context "with plain format and type" do
236
- let(:body) { "0" }
237
- let(:block) do
238
- proc do |_|
239
- response :success,
240
- 200,
241
- format: :plain,
242
- model: Dry::Types["coercible.int"]
243
- end
244
- end
245
-
246
- it "uses type" do
247
- expect(response_coercer.call(body)).to eq 0
248
- end
249
- end
250
-
251
- context "with plain format, coercer and type" do
252
- let(:body) { "0" }
253
- let(:block) do
254
- proc do |_|
255
- response :success,
256
- 200,
257
- format: :plain,
258
- model: Dry::Types["coercible.string"] { |val| val.to_i + 1 }
259
- end
260
- end
261
-
262
- it "applies coercer and then type" do
263
- expect(response_coercer.call(body)).to eq "1"
264
- end
265
- end
266
-
267
- context "with json format" do
268
- let(:body) { '{"foo":1,"baz":"qux"}' }
269
- let(:block) { proc { |_| response :success, 200, format: :json } }
270
-
271
- it "returns parsed body" do
272
- expect(response_coercer.call(body)).to eq "foo" => 1, "baz" => "qux"
273
- end
274
- end
275
-
276
- context "with json format and handler" do
277
- let(:body) { '{"foo":1,"baz":"qux"}' }
278
- let(:block) do
279
- proc do |_|
280
- response :success, 200, format: :json do |body|
281
- body.keys
282
- end
283
- end
284
- end
285
-
286
- it "returns parsed and handled body" do
287
- expect(response_coercer.call(body)).to eq data: %w[foo baz]
288
- end
289
- end
290
-
291
- context "with json format and type" do
292
- before do
293
- class Test::Foo < Evil::Struct
294
- attribute :foo
295
- end
296
- end
297
-
298
- let(:body) { '{"foo":1,"baz":"qux"}' }
299
- let(:block) do
300
- proc do |_|
301
- response :success, 200, format: :json, model: Test::Foo
302
- end
303
- end
304
-
305
- it "returns parsed and filtered body" do
306
- expect(response_coercer.call(body)).to eq foo: 1
307
- end
308
- end
309
-
310
- context "with json format, type and handler" do
311
- before do
312
- class Test::Foo < Evil::Struct
313
- attribute :foo
314
- end
315
- end
316
-
317
- let(:body) { '{"foo":1,"baz":"qux"}' }
318
- let(:block) do
319
- proc do |_|
320
- response :success, 200, format: :json, model: Test::Foo do |body|
321
- body["foo"] = body["foo"].to_s
322
- body
323
- end
324
- end
325
- end
326
-
327
- it "returns parsed, handled and filtered body" do
328
- expect(response_coercer.call(body)).to eq Test::Foo.new(foo: "1")
329
- end
330
- end
331
-
332
- context "with json format and filter" do
333
- before do
334
- class Test::Foo < Evil::Struct
335
- attribute :foo
336
- end
337
- end
338
-
339
- let(:body) { '{"foo":1,"baz":"qux"}' }
340
- let(:block) do
341
- proc do |_|
342
- response :success, 200, format: :json do
343
- attribute :baz
344
- end
345
- end
346
- end
347
-
348
- it "returns parsed and filtered body" do
349
- expect(response_coercer.call(body)).to eq baz: "qux"
350
- end
351
- end
352
-
353
- context "with json format, type and filter" do
354
- before do
355
- class Test::Foo < Evil::Struct
356
- attribute :foo
357
- end
358
- end
359
-
360
- let(:body) { '{"foo":1,"baz":2}' }
361
- let(:block) do
362
- proc do |_|
363
- response :success, 200, format: :json, model: Test::Foo do
364
- attribute :baz, Dry::Types["coercible.string"]
365
- end
366
- end
367
- end
368
-
369
- it "returns parsed and filtered body" do
370
- expect(response_coercer.call(body)).to eq foo: 1, baz: "2"
371
- end
372
- end
373
- end
374
- end