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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +0 -11
- data/.gitignore +1 -0
- data/.rspec +0 -1
- data/.rubocop.yml +22 -19
- data/.travis.yml +1 -0
- data/CHANGELOG.md +251 -6
- data/LICENSE.txt +3 -1
- data/README.md +47 -81
- data/docs/helpers/body.md +93 -0
- data/docs/helpers/connection.md +19 -0
- data/docs/helpers/headers.md +72 -0
- data/docs/helpers/http_method.md +39 -0
- data/docs/helpers/let.md +14 -0
- data/docs/helpers/logger.md +24 -0
- data/docs/helpers/middleware.md +56 -0
- data/docs/helpers/operation.md +103 -0
- data/docs/helpers/option.md +50 -0
- data/docs/helpers/path.md +37 -0
- data/docs/helpers/query.md +59 -0
- data/docs/helpers/response.md +40 -0
- data/docs/helpers/scope.md +121 -0
- data/docs/helpers/security.md +102 -0
- data/docs/helpers/validate.md +68 -0
- data/docs/index.md +70 -78
- data/docs/license.md +5 -1
- data/docs/rspec.md +96 -0
- data/evil-client.gemspec +10 -8
- data/lib/evil/client.rb +126 -72
- data/lib/evil/client/builder.rb +47 -0
- data/lib/evil/client/builder/operation.rb +40 -0
- data/lib/evil/client/builder/scope.rb +31 -0
- data/lib/evil/client/chaining.rb +17 -0
- data/lib/evil/client/connection.rb +60 -20
- data/lib/evil/client/container.rb +66 -0
- data/lib/evil/client/container/operation.rb +23 -0
- data/lib/evil/client/container/scope.rb +28 -0
- data/lib/evil/client/exceptions/definition_error.rb +15 -0
- data/lib/evil/client/exceptions/name_error.rb +32 -0
- data/lib/evil/client/exceptions/response_error.rb +42 -0
- data/lib/evil/client/exceptions/type_error.rb +29 -0
- data/lib/evil/client/exceptions/validation_error.rb +27 -0
- data/lib/evil/client/formatter.rb +49 -0
- data/lib/evil/client/formatter/form.rb +45 -0
- data/lib/evil/client/formatter/multipart.rb +33 -0
- data/lib/evil/client/formatter/part.rb +66 -0
- data/lib/evil/client/formatter/text.rb +21 -0
- data/lib/evil/client/resolver.rb +84 -0
- data/lib/evil/client/resolver/body.rb +22 -0
- data/lib/evil/client/resolver/format.rb +30 -0
- data/lib/evil/client/resolver/headers.rb +46 -0
- data/lib/evil/client/resolver/http_method.rb +34 -0
- data/lib/evil/client/resolver/middleware.rb +36 -0
- data/lib/evil/client/resolver/query.rb +39 -0
- data/lib/evil/client/resolver/request.rb +96 -0
- data/lib/evil/client/resolver/response.rb +26 -0
- data/lib/evil/client/resolver/security.rb +113 -0
- data/lib/evil/client/resolver/uri.rb +35 -0
- data/lib/evil/client/rspec.rb +127 -0
- data/lib/evil/client/schema.rb +105 -0
- data/lib/evil/client/schema/operation.rb +177 -0
- data/lib/evil/client/schema/scope.rb +73 -0
- data/lib/evil/client/settings.rb +172 -0
- data/lib/evil/client/settings/validator.rb +64 -0
- data/mkdocs.yml +21 -15
- data/spec/features/custom_connection_spec.rb +17 -0
- data/spec/features/operation/middleware_spec.rb +50 -0
- data/spec/features/operation/options_spec.rb +71 -0
- data/spec/features/operation/request_spec.rb +94 -0
- data/spec/features/operation/response_spec.rb +48 -0
- data/spec/features/scope/options_spec.rb +52 -0
- data/spec/fixtures/locales/en.yml +16 -0
- data/spec/fixtures/test_client.rb +76 -0
- data/spec/spec_helper.rb +18 -6
- data/spec/support/fixtures_helper.rb +7 -0
- data/spec/unit/builder/operation_spec.rb +90 -0
- data/spec/unit/builder/scope_spec.rb +84 -0
- data/spec/unit/client_spec.rb +137 -0
- data/spec/unit/connection_spec.rb +78 -0
- data/spec/unit/container/operation_spec.rb +81 -0
- data/spec/unit/container/scope_spec.rb +61 -0
- data/spec/unit/container_spec.rb +107 -0
- data/spec/unit/exceptions/definition_error_spec.rb +15 -0
- data/spec/unit/exceptions/name_error_spec.rb +77 -0
- data/spec/unit/exceptions/response_error_spec.rb +22 -0
- data/spec/unit/exceptions/type_error_spec.rb +71 -0
- data/spec/unit/exceptions/validation_error_spec.rb +13 -0
- data/spec/unit/formatter/form_spec.rb +27 -0
- data/spec/unit/formatter/multipart_spec.rb +23 -0
- data/spec/unit/formatter/part_spec.rb +49 -0
- data/spec/unit/formatter/text_spec.rb +37 -0
- data/spec/unit/formatter_spec.rb +46 -0
- data/spec/unit/resolver/body_spec.rb +65 -0
- data/spec/unit/resolver/format_spec.rb +66 -0
- data/spec/unit/resolver/headers_spec.rb +93 -0
- data/spec/unit/resolver/http_method_spec.rb +67 -0
- data/spec/unit/resolver/middleware_spec.rb +83 -0
- data/spec/unit/resolver/query_spec.rb +85 -0
- data/spec/unit/resolver/request_spec.rb +121 -0
- data/spec/unit/resolver/response_spec.rb +64 -0
- data/spec/unit/resolver/security_spec.rb +156 -0
- data/spec/unit/resolver/uri_spec.rb +117 -0
- data/spec/unit/rspec_spec.rb +342 -0
- data/spec/unit/schema/operation_spec.rb +309 -0
- data/spec/unit/schema/scope_spec.rb +110 -0
- data/spec/unit/schema_spec.rb +157 -0
- data/spec/unit/settings/validator_spec.rb +128 -0
- data/spec/unit/settings_spec.rb +248 -0
- metadata +192 -135
- data/docs/base_url.md +0 -38
- data/docs/documentation.md +0 -9
- data/docs/headers.md +0 -59
- data/docs/http_method.md +0 -31
- data/docs/model.md +0 -173
- data/docs/operation.md +0 -0
- data/docs/overview.md +0 -0
- data/docs/path.md +0 -48
- data/docs/query.md +0 -99
- data/docs/responses.md +0 -66
- data/docs/security.md +0 -102
- data/docs/settings.md +0 -32
- data/lib/evil/client/connection/net_http.rb +0 -57
- data/lib/evil/client/dsl.rb +0 -127
- data/lib/evil/client/dsl/base.rb +0 -26
- data/lib/evil/client/dsl/files.rb +0 -37
- data/lib/evil/client/dsl/headers.rb +0 -16
- data/lib/evil/client/dsl/http_method.rb +0 -24
- data/lib/evil/client/dsl/operation.rb +0 -91
- data/lib/evil/client/dsl/operations.rb +0 -41
- data/lib/evil/client/dsl/path.rb +0 -25
- data/lib/evil/client/dsl/query.rb +0 -16
- data/lib/evil/client/dsl/response.rb +0 -61
- data/lib/evil/client/dsl/responses.rb +0 -29
- data/lib/evil/client/dsl/scope.rb +0 -27
- data/lib/evil/client/dsl/security.rb +0 -57
- data/lib/evil/client/dsl/verifier.rb +0 -35
- data/lib/evil/client/middleware.rb +0 -81
- data/lib/evil/client/middleware/base.rb +0 -11
- data/lib/evil/client/middleware/merge_security.rb +0 -20
- data/lib/evil/client/middleware/normalize_headers.rb +0 -17
- data/lib/evil/client/middleware/stringify_form.rb +0 -40
- data/lib/evil/client/middleware/stringify_json.rb +0 -19
- data/lib/evil/client/middleware/stringify_multipart.rb +0 -36
- data/lib/evil/client/middleware/stringify_multipart/part.rb +0 -36
- data/lib/evil/client/middleware/stringify_query.rb +0 -35
- data/lib/evil/client/operation.rb +0 -34
- data/lib/evil/client/operation/request.rb +0 -26
- data/lib/evil/client/operation/response.rb +0 -39
- data/lib/evil/client/operation/response_error.rb +0 -13
- data/lib/evil/client/operation/unexpected_response_error.rb +0 -19
- data/spec/features/instantiation_spec.rb +0 -68
- data/spec/features/middleware_spec.rb +0 -79
- data/spec/features/operation_with_documentation_spec.rb +0 -41
- data/spec/features/operation_with_files_spec.rb +0 -40
- data/spec/features/operation_with_form_body_spec.rb +0 -158
- data/spec/features/operation_with_headers_spec.rb +0 -99
- data/spec/features/operation_with_http_method_spec.rb +0 -45
- data/spec/features/operation_with_json_body_spec.rb +0 -156
- data/spec/features/operation_with_nested_responses_spec.rb +0 -95
- data/spec/features/operation_with_path_spec.rb +0 -47
- data/spec/features/operation_with_query_spec.rb +0 -84
- data/spec/features/operation_with_security_spec.rb +0 -228
- data/spec/features/scoping_spec.rb +0 -48
- data/spec/support/test_client.rb +0 -15
- data/spec/unit/evil/client/connection/net_http_spec.rb +0 -38
- data/spec/unit/evil/client/dsl/files_spec.rb +0 -37
- data/spec/unit/evil/client/dsl/operation_spec.rb +0 -374
- data/spec/unit/evil/client/dsl/operations_spec.rb +0 -29
- data/spec/unit/evil/client/dsl/scope_spec.rb +0 -32
- data/spec/unit/evil/client/dsl/security_spec.rb +0 -135
- data/spec/unit/evil/client/middleware/merge_security_spec.rb +0 -32
- data/spec/unit/evil/client/middleware/normalize_headers_spec.rb +0 -17
- data/spec/unit/evil/client/middleware/stringify_form_spec.rb +0 -63
- data/spec/unit/evil/client/middleware/stringify_json_spec.rb +0 -61
- data/spec/unit/evil/client/middleware/stringify_multipart/part_spec.rb +0 -59
- data/spec/unit/evil/client/middleware/stringify_multipart_spec.rb +0 -62
- data/spec/unit/evil/client/middleware/stringify_query_spec.rb +0 -40
- data/spec/unit/evil/client/middleware_spec.rb +0 -46
- data/spec/unit/evil/client/operation/request_spec.rb +0 -49
- data/spec/unit/evil/client/operation/response_spec.rb +0 -63
@@ -0,0 +1,309 @@
|
|
1
|
+
RSpec.describe Evil::Client::Schema::Operation do
|
2
|
+
let(:client) { class_double Evil::Client, name: "MyApi" }
|
3
|
+
let(:parent) { described_class.new client }
|
4
|
+
let(:schema) { described_class.new parent, :users }
|
5
|
+
let(:block) { -> { "bar" } }
|
6
|
+
|
7
|
+
it "subclasses the base schema" do
|
8
|
+
expect(described_class.superclass).to eq Evil::Client::Schema
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#leaf?" do
|
12
|
+
subject { schema.leaf? }
|
13
|
+
|
14
|
+
it "returns true" do
|
15
|
+
expect(subject).to eq true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "definitions" do
|
20
|
+
subject { schema.definitions }
|
21
|
+
|
22
|
+
it "is a hash with empty responses" do
|
23
|
+
expect(subject).to eq responses: {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#path" do
|
28
|
+
context "with block syntax" do
|
29
|
+
subject { schema.path(&block) }
|
30
|
+
|
31
|
+
it "adds block to definitions" do
|
32
|
+
expect { subject }
|
33
|
+
.to change { schema.definitions[:path] }
|
34
|
+
.to block
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns the schema itself" do
|
38
|
+
expect(subject).to eq schema
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "with plain syntax" do
|
43
|
+
subject { schema.path "foo" }
|
44
|
+
|
45
|
+
it "wraps value to block and adds it to definitions" do
|
46
|
+
expect { subject }
|
47
|
+
.to change { schema.definitions[:path]&.call }
|
48
|
+
.to "foo"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns the schema itself" do
|
52
|
+
expect(subject).to eq schema
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#http_method" do
|
58
|
+
context "with block syntax" do
|
59
|
+
subject { schema.http_method(&block) }
|
60
|
+
|
61
|
+
it "adds block to definitions" do
|
62
|
+
expect { subject }
|
63
|
+
.to change { schema.definitions[:http_method] }
|
64
|
+
.to block
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns the schema itself" do
|
68
|
+
expect(subject).to eq schema
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "with plain syntax" do
|
73
|
+
subject { schema.http_method "foo" }
|
74
|
+
|
75
|
+
it "wraps value to block and adds it to definitions" do
|
76
|
+
expect { subject }
|
77
|
+
.to change { schema.definitions[:http_method]&.call }
|
78
|
+
.to "foo"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "returns the schema itself" do
|
82
|
+
expect(subject).to eq schema
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#format" do
|
88
|
+
context "with block syntax" do
|
89
|
+
subject { schema.format(&block) }
|
90
|
+
|
91
|
+
it "adds block to definitions" do
|
92
|
+
expect { subject }
|
93
|
+
.to change { schema.definitions[:format] }
|
94
|
+
.to block
|
95
|
+
end
|
96
|
+
|
97
|
+
it "returns the schema itself" do
|
98
|
+
expect(subject).to eq schema
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "with plain syntax" do
|
103
|
+
subject { schema.format "foo" }
|
104
|
+
|
105
|
+
it "wraps value to block and adds it to definitions" do
|
106
|
+
expect { subject }
|
107
|
+
.to change { schema.definitions[:format]&.call }
|
108
|
+
.to "foo"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns the schema itself" do
|
112
|
+
expect(subject).to eq schema
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "#security" do
|
118
|
+
context "with block syntax" do
|
119
|
+
subject { schema.security(&block) }
|
120
|
+
|
121
|
+
it "adds block to definitions" do
|
122
|
+
expect { subject }
|
123
|
+
.to change { schema.definitions[:security] }
|
124
|
+
.to block
|
125
|
+
end
|
126
|
+
|
127
|
+
it "returns the schema itself" do
|
128
|
+
expect(subject).to eq schema
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "with plain syntax" do
|
133
|
+
subject { schema.security "foo" => "bar" }
|
134
|
+
|
135
|
+
it "wraps value to block and adds it to definitions" do
|
136
|
+
expect { subject }
|
137
|
+
.to change { schema.definitions[:security]&.call }
|
138
|
+
.to "foo" => "bar"
|
139
|
+
end
|
140
|
+
|
141
|
+
it "returns the schema itself" do
|
142
|
+
expect(subject).to eq schema
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "#headers" do
|
148
|
+
context "with block syntax" do
|
149
|
+
subject { schema.headers(&block) }
|
150
|
+
|
151
|
+
it "adds block to definitions" do
|
152
|
+
expect { subject }
|
153
|
+
.to change { schema.definitions[:headers] }
|
154
|
+
.to block
|
155
|
+
end
|
156
|
+
|
157
|
+
it "returns the schema itself" do
|
158
|
+
expect(subject).to eq schema
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context "with plain syntax" do
|
163
|
+
subject { schema.headers "foo" => "bar" }
|
164
|
+
|
165
|
+
it "wraps value to block and adds it to definitions" do
|
166
|
+
expect { subject }
|
167
|
+
.to change { schema.definitions[:headers]&.call }
|
168
|
+
.to "foo" => "bar"
|
169
|
+
end
|
170
|
+
|
171
|
+
it "returns the schema itself" do
|
172
|
+
expect(subject).to eq schema
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "#query" do
|
178
|
+
context "with block syntax" do
|
179
|
+
subject { schema.query(&block) }
|
180
|
+
|
181
|
+
it "adds block to definitions" do
|
182
|
+
expect { subject }
|
183
|
+
.to change { schema.definitions[:query] }
|
184
|
+
.to block
|
185
|
+
end
|
186
|
+
|
187
|
+
it "returns the schema itself" do
|
188
|
+
expect(subject).to eq schema
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context "with plain syntax" do
|
193
|
+
subject { schema.query "foo" => "bar" }
|
194
|
+
|
195
|
+
it "wraps value to block and adds it to definitions" do
|
196
|
+
expect { subject }
|
197
|
+
.to change { schema.definitions[:query]&.call }
|
198
|
+
.to "foo" => "bar"
|
199
|
+
end
|
200
|
+
|
201
|
+
it "returns the schema itself" do
|
202
|
+
expect(subject).to eq schema
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#body" do
|
208
|
+
context "with block syntax" do
|
209
|
+
subject { schema.body(&block) }
|
210
|
+
|
211
|
+
it "adds block to definitions" do
|
212
|
+
expect { subject }
|
213
|
+
.to change { schema.definitions[:body] }
|
214
|
+
.to block
|
215
|
+
end
|
216
|
+
|
217
|
+
it "returns the schema itself" do
|
218
|
+
expect(subject).to eq schema
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context "with plain syntax" do
|
223
|
+
subject { schema.body "foo" => "bar" }
|
224
|
+
|
225
|
+
it "wraps value to block and adds it to definitions" do
|
226
|
+
expect { subject }
|
227
|
+
.to change { schema.definitions[:body]&.call }
|
228
|
+
.to "foo" => "bar"
|
229
|
+
end
|
230
|
+
|
231
|
+
it "returns the schema itself" do
|
232
|
+
expect(subject).to eq schema
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#middleware" do
|
238
|
+
context "with block syntax" do
|
239
|
+
subject { schema.middleware(&block) }
|
240
|
+
|
241
|
+
it "adds block to definitions" do
|
242
|
+
expect { subject }
|
243
|
+
.to change { schema.definitions[:middleware] }
|
244
|
+
.to block
|
245
|
+
end
|
246
|
+
|
247
|
+
it "returns the schema itself" do
|
248
|
+
expect(subject).to eq schema
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context "with plain syntax" do
|
253
|
+
before { class Test::Foo; end }
|
254
|
+
subject { schema.middleware Test::Foo }
|
255
|
+
|
256
|
+
it "wraps value to block and adds it to definitions" do
|
257
|
+
expect { subject }
|
258
|
+
.to change { schema.definitions[:middleware]&.call }
|
259
|
+
.to Test::Foo
|
260
|
+
end
|
261
|
+
|
262
|
+
it "returns the schema itself" do
|
263
|
+
expect(subject).to eq schema
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
describe "#response" do
|
269
|
+
context "with a block" do
|
270
|
+
subject { schema.response(200, 201, &block) }
|
271
|
+
|
272
|
+
it "adds block to responses under given keys" do
|
273
|
+
expect { subject }
|
274
|
+
.to change { schema.definitions[:responses] }
|
275
|
+
.to(200 => block, 201 => block)
|
276
|
+
end
|
277
|
+
|
278
|
+
it "returns the schema itself" do
|
279
|
+
expect(subject).to eq schema
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
context "without a block" do
|
284
|
+
subject { schema.response(200) }
|
285
|
+
|
286
|
+
it "adds identity block to responses under given keys" do
|
287
|
+
subject
|
288
|
+
|
289
|
+
expect(schema.definitions.dig(:responses, 200).call("Hi")).to eq %w[Hi]
|
290
|
+
end
|
291
|
+
|
292
|
+
it "returns the schema itself" do
|
293
|
+
expect(subject).to eq schema
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe "#responses" do
|
299
|
+
context "with a block" do
|
300
|
+
subject { schema.responses(200, 201, &block) }
|
301
|
+
|
302
|
+
it "is an alias for #response" do
|
303
|
+
expect { subject }
|
304
|
+
.to change { schema.definitions[:responses] }
|
305
|
+
.to(200 => block, 201 => block)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
RSpec.describe Evil::Client::Schema::Scope do
|
2
|
+
let(:client) { class_double Evil::Client, name: "MyApi" }
|
3
|
+
let(:parent) { described_class.new client }
|
4
|
+
let(:schema) { described_class.new parent, :users }
|
5
|
+
let(:block) { proc { def self.foo; :FOO; end } }
|
6
|
+
let(:dsl_methods) do
|
7
|
+
%i[operations scopes options schema settings inspect logger]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "subclasses the operation schema" do
|
11
|
+
expect(described_class.superclass).to eq Evil::Client::Schema::Operation
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#leaf?" do
|
15
|
+
subject { schema.leaf? }
|
16
|
+
|
17
|
+
it "returns false" do
|
18
|
+
expect(subject).to eq false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#scopes" do
|
23
|
+
subject { schema.scopes }
|
24
|
+
|
25
|
+
it "returns empty hash by default" do
|
26
|
+
expect(subject).to eq({})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#scope" do
|
31
|
+
subject { schema.scope(:customers, &block) }
|
32
|
+
|
33
|
+
it "adds named subscope to the scope" do
|
34
|
+
subject
|
35
|
+
expect(schema.scopes[:customers]).to be_a described_class
|
36
|
+
end
|
37
|
+
|
38
|
+
it "executes the block in context of the new subscope" do
|
39
|
+
subject
|
40
|
+
expect(schema.scopes[:customers].foo).to eq :FOO
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns the scope itself" do
|
44
|
+
expect(subject).to eq schema
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when name is reserved by DSL" do
|
48
|
+
it "raises Evil::Client::NameError" do
|
49
|
+
dsl_methods.each do |name|
|
50
|
+
expect { schema.scope(name, &block) }
|
51
|
+
.to raise_error Evil::Client::NameError
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when there is an operation with the same name" do
|
57
|
+
before { schema.operation(:customers) {} }
|
58
|
+
|
59
|
+
it "raises Evil::Client::TypeError" do
|
60
|
+
expect { subject }.to raise_error Evil::Client::TypeError
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#operations" do
|
66
|
+
subject { schema.operations }
|
67
|
+
|
68
|
+
it "returns empty hash by default" do
|
69
|
+
expect(subject).to eq({})
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#operation" do
|
74
|
+
subject { schema.operation(:fetch, &block) }
|
75
|
+
|
76
|
+
it "adds named operation to the scope" do
|
77
|
+
subject
|
78
|
+
expect(schema.operations[:fetch]).to be_a Evil::Client::Schema::Operation
|
79
|
+
end
|
80
|
+
|
81
|
+
it "executes the block in context of the new operation" do
|
82
|
+
subject
|
83
|
+
expect(schema.operations[:fetch].foo).to eq :FOO
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns the scope itself" do
|
87
|
+
expect(subject).to eq schema
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when name is reserved by DSL" do
|
91
|
+
it "raises Evil::Client::NameError" do
|
92
|
+
dsl_methods.each do |name|
|
93
|
+
expect { schema.operation(name, &block) }
|
94
|
+
.to raise_error Evil::Client::NameError
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when there is an operation with the same name" do
|
100
|
+
before { schema.scope(:fetch) {} }
|
101
|
+
|
102
|
+
it "raises Evil::Client::TypeError" do
|
103
|
+
expect { subject }.to raise_error Evil::Client::TypeError
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "#operation" do
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
RSpec.describe Evil::Client::Schema do
|
2
|
+
let(:client) { class_double Evil::Client, name: "MyApi" }
|
3
|
+
let(:parent) { described_class.new client }
|
4
|
+
let(:schema) { described_class.new parent, :users }
|
5
|
+
|
6
|
+
describe "#client" do
|
7
|
+
context "for a root schema" do
|
8
|
+
subject { parent.client }
|
9
|
+
|
10
|
+
it "is taken from initializer" do
|
11
|
+
expect(subject).to eq client
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "for a subschema" do
|
16
|
+
subject { schema.client }
|
17
|
+
|
18
|
+
it "is taken from parent" do
|
19
|
+
expect(subject).to eq client
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#parent" do
|
25
|
+
context "for a root schema" do
|
26
|
+
subject { parent.parent }
|
27
|
+
|
28
|
+
it "is absent" do
|
29
|
+
expect(subject).to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "for a subschema" do
|
34
|
+
subject { schema.parent }
|
35
|
+
|
36
|
+
it "is taken from the initializer" do
|
37
|
+
expect(subject).to eq parent
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#name" do
|
43
|
+
context "for a root schema" do
|
44
|
+
subject { parent.name }
|
45
|
+
|
46
|
+
it "is taken from client" do
|
47
|
+
expect(subject).to eq client.name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "for a subschema" do
|
52
|
+
subject { schema.name }
|
53
|
+
|
54
|
+
it "is taken from the initializer" do
|
55
|
+
expect(subject).to eq :users
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#to_s" do
|
61
|
+
context "for a root schema" do
|
62
|
+
subject { parent.to_s }
|
63
|
+
|
64
|
+
it "returns the name" do
|
65
|
+
expect(subject).to eq "MyApi"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "for a subschema" do
|
70
|
+
subject { schema.to_s }
|
71
|
+
|
72
|
+
it "returns full name" do
|
73
|
+
expect(subject).to eq "MyApi.users"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#to_str" do
|
79
|
+
subject { schema.to_str }
|
80
|
+
|
81
|
+
it "is an alias for #to_s" do
|
82
|
+
expect(subject).to eq schema.to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#inspect" do
|
87
|
+
subject { schema.inspect }
|
88
|
+
|
89
|
+
it "is an alias for #to_s" do
|
90
|
+
expect(subject).to eq schema.to_s
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#settings" do
|
95
|
+
context "for a root schema" do
|
96
|
+
subject { parent.settings }
|
97
|
+
|
98
|
+
it "is a subclass of Evil::Client::Settings" do
|
99
|
+
expect(subject).to be_a Class
|
100
|
+
expect(subject.superclass).to eq Evil::Client::Settings
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "for a subschema" do
|
105
|
+
subject { schema.settings }
|
106
|
+
|
107
|
+
it "is a subclass of parent settings" do
|
108
|
+
expect(subject).to be_a Class
|
109
|
+
expect(subject.superclass).to eq parent.settings
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#option" do
|
115
|
+
before { allow(schema.settings).to receive(:let) }
|
116
|
+
subject { schema.option(:user, optional: true) }
|
117
|
+
|
118
|
+
it "is delegated to settings" do
|
119
|
+
expect(schema.settings)
|
120
|
+
.to receive(:option).with(:user, nil, optional: true)
|
121
|
+
|
122
|
+
subject
|
123
|
+
end
|
124
|
+
|
125
|
+
it "returns the schema itself" do
|
126
|
+
expect(subject).to eq schema
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#let" do
|
131
|
+
before { allow(schema.settings).to receive(:let) }
|
132
|
+
subject { schema.let(:user) {} }
|
133
|
+
|
134
|
+
it "is delegated to settings" do
|
135
|
+
expect(schema.settings).to receive(:let).with(:user)
|
136
|
+
subject
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns the schema itself" do
|
140
|
+
expect(subject).to eq schema
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#validate" do
|
145
|
+
before { allow(schema.settings).to receive(:validate) }
|
146
|
+
subject { schema.validate(:id_present) {} }
|
147
|
+
|
148
|
+
it "is delegated to settings" do
|
149
|
+
expect(schema.settings).to receive(:validate).with(:id_present)
|
150
|
+
subject
|
151
|
+
end
|
152
|
+
|
153
|
+
it "returns the schema itself" do
|
154
|
+
expect(subject).to eq schema
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|