http_stub 0.17.0 → 0.18.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 +5 -13
- data/lib/http_stub.rb +2 -0
- data/lib/http_stub/configurer.rb +8 -0
- data/lib/http_stub/configurer/dsl/endpoint_template.rb +26 -0
- data/lib/http_stub/configurer/dsl/server.rb +12 -0
- data/lib/http_stub/configurer/dsl/stub_builder.rb +14 -0
- data/lib/http_stub/configurer/dsl/stub_builder_producer.rb +1 -1
- data/lib/http_stub/configurer/part.rb +19 -0
- data/lib/http_stub/version.rb +1 -1
- data/spec/acceptance/configurer_part_spec.rb +66 -0
- data/spec/acceptance/endpoint_template_spec.rb +54 -0
- data/spec/lib/http_stub/configurer/dsl/endpoint_template_spec.rb +163 -0
- data/spec/lib/http_stub/configurer/dsl/scenario_builder_spec.rb +7 -5
- data/spec/lib/http_stub/configurer/dsl/server_spec.rb +114 -7
- data/spec/lib/http_stub/configurer/dsl/stub_builder_producer_spec.rb +9 -29
- data/spec/lib/http_stub/configurer/dsl/stub_builder_spec.rb +263 -0
- data/spec/lib/http_stub/configurer/part_spec.rb +69 -0
- data/spec/spec_helper.rb +3 -1
- metadata +290 -280
@@ -17,11 +17,12 @@ describe HttpStub::Configurer::DSL::ScenarioBuilder do
|
|
17
17
|
|
18
18
|
describe "#add_stub!" do
|
19
19
|
|
20
|
-
let(:stub_builder) { instance_double(HttpStub::Configurer::DSL::StubBuilder) }
|
20
|
+
let(:stub_builder) { instance_double(HttpStub::Configurer::DSL::StubBuilder, invoke: nil) }
|
21
21
|
|
22
22
|
context "when a block is provided" do
|
23
23
|
|
24
|
-
let(:
|
24
|
+
let(:block_verifier) { double("BlockVerifier") }
|
25
|
+
let(:block) { lambda { block_verifier.verify } }
|
25
26
|
|
26
27
|
subject { scenario_builder.add_stub!(&block) }
|
27
28
|
|
@@ -33,8 +34,9 @@ describe HttpStub::Configurer::DSL::ScenarioBuilder do
|
|
33
34
|
subject
|
34
35
|
end
|
35
36
|
|
36
|
-
it "
|
37
|
-
expect(
|
37
|
+
it "requests the stub builder invoke the provided block" do
|
38
|
+
expect(stub_builder).to receive(:invoke).and_yield
|
39
|
+
expect(block_verifier).to receive(:verify)
|
38
40
|
|
39
41
|
subject
|
40
42
|
end
|
@@ -81,7 +83,7 @@ describe HttpStub::Configurer::DSL::ScenarioBuilder do
|
|
81
83
|
|
82
84
|
let(:stubs) { (1..3).map { instance_double(HttpStub::Configurer::Request::Stub) } }
|
83
85
|
let(:stub_builders) do
|
84
|
-
stubs.map { |stub| instance_double(HttpStub::Configurer::DSL::StubBuilder, build: stub) }
|
86
|
+
stubs.map { |stub| instance_double(HttpStub::Configurer::DSL::StubBuilder, invoke: nil, build: stub) }
|
85
87
|
end
|
86
88
|
|
87
89
|
before(:example) do
|
@@ -4,6 +4,14 @@ describe HttpStub::Configurer::DSL::Server do
|
|
4
4
|
|
5
5
|
let(:server) { HttpStub::Configurer::DSL::Server.new(server_facade) }
|
6
6
|
|
7
|
+
shared_context "establish response defaults" do
|
8
|
+
|
9
|
+
let(:response_defaults) { { key: "value" } }
|
10
|
+
|
11
|
+
before(:example) { server.response_defaults = { key: "value" } }
|
12
|
+
|
13
|
+
end
|
14
|
+
|
7
15
|
it "produces stub builders" do
|
8
16
|
expect(server).to be_a(HttpStub::Configurer::DSL::StubBuilderProducer)
|
9
17
|
end
|
@@ -70,9 +78,13 @@ describe HttpStub::Configurer::DSL::Server do
|
|
70
78
|
|
71
79
|
context "when a stub builder is not provided" do
|
72
80
|
|
73
|
-
let(:
|
81
|
+
let(:block_verifier) { double("BlockVerifier") }
|
82
|
+
let(:block) { lambda { block_verifier.verify } }
|
74
83
|
|
75
|
-
before(:example)
|
84
|
+
before(:example) do
|
85
|
+
allow(HttpStub::Configurer::DSL::StubBuilder).to receive(:new).and_return(stub_builder)
|
86
|
+
allow(stub_builder).to receive(:invoke)
|
87
|
+
end
|
76
88
|
|
77
89
|
subject { server.add_stub!(&block) }
|
78
90
|
|
@@ -82,8 +94,9 @@ describe HttpStub::Configurer::DSL::Server do
|
|
82
94
|
subject
|
83
95
|
end
|
84
96
|
|
85
|
-
it "
|
86
|
-
expect(
|
97
|
+
it "requests the created builder invoke the provided block" do
|
98
|
+
expect(stub_builder).to receive(:invoke).and_yield
|
99
|
+
expect(block_verifier).to receive(:verify)
|
87
100
|
|
88
101
|
subject
|
89
102
|
end
|
@@ -112,9 +125,7 @@ describe HttpStub::Configurer::DSL::Server do
|
|
112
125
|
|
113
126
|
context "when response defaults have been established" do
|
114
127
|
|
115
|
-
|
116
|
-
|
117
|
-
before(:example) { server.response_defaults = { key: "value" } }
|
128
|
+
include_context "establish response defaults"
|
118
129
|
|
119
130
|
it "creates a scenario builder containing the response defaults" do
|
120
131
|
expect(HttpStub::Configurer::DSL::ScenarioBuilder).to receive(:new).with(response_defaults, anything)
|
@@ -160,6 +171,102 @@ describe HttpStub::Configurer::DSL::Server do
|
|
160
171
|
|
161
172
|
end
|
162
173
|
|
174
|
+
describe "#add_one_stub_scenario!" do
|
175
|
+
|
176
|
+
let(:scenario_name) { "some_scenario_name" }
|
177
|
+
let(:block_verifier) { double("BlockVerifier") }
|
178
|
+
let(:block) { lambda { block_verifier.verify } }
|
179
|
+
|
180
|
+
let(:scenario_builder) { instance_double(HttpStub::Configurer::DSL::ScenarioBuilder) }
|
181
|
+
let(:stub_builder) { instance_double(HttpStub::Configurer::DSL::StubBuilder, invoke: nil) }
|
182
|
+
|
183
|
+
subject { server.add_one_stub_scenario!(scenario_name, &block) }
|
184
|
+
|
185
|
+
before(:each) do
|
186
|
+
allow(server).to receive(:add_scenario!).and_yield(scenario_builder)
|
187
|
+
allow(scenario_builder).to receive(:add_stub!).and_yield(stub_builder)
|
188
|
+
end
|
189
|
+
|
190
|
+
it "adds a scenario with the provided name" do
|
191
|
+
expect(server).to receive(:add_scenario!).with(scenario_name)
|
192
|
+
|
193
|
+
subject
|
194
|
+
end
|
195
|
+
|
196
|
+
it "adds a stub to the scenario" do
|
197
|
+
expect(scenario_builder).to receive(:add_stub!)
|
198
|
+
|
199
|
+
subject
|
200
|
+
end
|
201
|
+
|
202
|
+
it "requests the stub builder invoke the provided block" do
|
203
|
+
expect(stub_builder).to receive(:invoke).and_yield
|
204
|
+
expect(block_verifier).to receive(:verify)
|
205
|
+
|
206
|
+
subject
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#endpoint_template" do
|
212
|
+
|
213
|
+
let(:block_verifier) { double("BlockVerifier") }
|
214
|
+
let(:block) { lambda { block_verifier.verify } }
|
215
|
+
let(:endpoint_template) { instance_double(HttpStub::Configurer::DSL::EndpointTemplate, invoke: nil) }
|
216
|
+
|
217
|
+
subject { server.endpoint_template(&block) }
|
218
|
+
|
219
|
+
before(:example) do
|
220
|
+
allow(HttpStub::Configurer::DSL::EndpointTemplate).to receive(:new).and_return(endpoint_template)
|
221
|
+
end
|
222
|
+
|
223
|
+
it "requests the endpoint template invoke the provided block" do
|
224
|
+
expect(endpoint_template).to receive(:invoke).and_yield
|
225
|
+
expect(block_verifier).to receive(:verify)
|
226
|
+
|
227
|
+
subject
|
228
|
+
end
|
229
|
+
|
230
|
+
it "returns the created endpoint template" do
|
231
|
+
expect(subject).to eql(endpoint_template)
|
232
|
+
end
|
233
|
+
|
234
|
+
it "creates a template for the server" do
|
235
|
+
expect(HttpStub::Configurer::DSL::EndpointTemplate).to(
|
236
|
+
receive(:new).with(server, anything).and_return(endpoint_template)
|
237
|
+
)
|
238
|
+
|
239
|
+
subject
|
240
|
+
end
|
241
|
+
|
242
|
+
context "when response defaults have been established" do
|
243
|
+
|
244
|
+
include_context "establish response defaults"
|
245
|
+
|
246
|
+
it "creates a template with the defaults" do
|
247
|
+
expect(HttpStub::Configurer::DSL::EndpointTemplate).to(
|
248
|
+
receive(:new).with(anything, response_defaults).and_return(endpoint_template)
|
249
|
+
)
|
250
|
+
|
251
|
+
subject
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
255
|
+
|
256
|
+
context "when no response defaults have been established" do
|
257
|
+
|
258
|
+
it "creates a template with empty response defaults" do
|
259
|
+
expect(HttpStub::Configurer::DSL::EndpointTemplate).to(
|
260
|
+
receive(:new).with(anything, {}).and_return(endpoint_template)
|
261
|
+
)
|
262
|
+
|
263
|
+
subject
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
269
|
+
|
163
270
|
describe "#add_activator!" do
|
164
271
|
|
165
272
|
let(:scenario) { instance_double(HttpStub::Configurer::Request::Scenario) }
|
@@ -34,40 +34,20 @@ describe HttpStub::Configurer::DSL::StubBuilderProducer do
|
|
34
34
|
|
35
35
|
context "when a block is provided" do
|
36
36
|
|
37
|
-
|
37
|
+
let(:block) { lambda { |_stub_builder| "some block" } }
|
38
38
|
|
39
|
-
|
39
|
+
subject { producer.build_stub(&block) }
|
40
40
|
|
41
|
-
|
41
|
+
before(:example) { allow(stub_builder).to receive(:invoke) }
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
subject
|
47
|
-
end
|
48
|
-
|
49
|
-
it "returns the created builder" do
|
50
|
-
expect(subject).to eql(stub_builder)
|
51
|
-
end
|
43
|
+
it "requests the stub builder invoke block" do
|
44
|
+
expect(stub_builder).to receive(:invoke).and_yield(block)
|
52
45
|
|
46
|
+
subject
|
53
47
|
end
|
54
48
|
|
55
|
-
|
56
|
-
|
57
|
-
subject { producer.build_stub { match_requests("/some/request/uri") } }
|
58
|
-
|
59
|
-
before(:example) { allow(stub_builder).to receive(:match_requests) }
|
60
|
-
|
61
|
-
it "executes the block in the context of the builder" do
|
62
|
-
expect(stub_builder).to receive(:match_requests).with("/some/request/uri")
|
63
|
-
|
64
|
-
subject
|
65
|
-
end
|
66
|
-
|
67
|
-
it "returns the created builder" do
|
68
|
-
expect(subject).to eql(stub_builder)
|
69
|
-
end
|
70
|
-
|
49
|
+
it "returns the stub builder" do
|
50
|
+
expect(subject).to eql(stub_builder)
|
71
51
|
end
|
72
52
|
|
73
53
|
end
|
@@ -76,7 +56,7 @@ describe HttpStub::Configurer::DSL::StubBuilderProducer do
|
|
76
56
|
|
77
57
|
subject { producer.build_stub }
|
78
58
|
|
79
|
-
it "returns the
|
59
|
+
it "returns the stub builder" do
|
80
60
|
expect(subject).to eql(stub_builder)
|
81
61
|
end
|
82
62
|
|
@@ -84,6 +84,269 @@ describe HttpStub::Configurer::DSL::StubBuilder do
|
|
84
84
|
|
85
85
|
end
|
86
86
|
|
87
|
+
describe "#invoke" do
|
88
|
+
|
89
|
+
context "when the block accepts an argument" do
|
90
|
+
|
91
|
+
subject { builder.invoke { |builder| builder.match_requests("/some_uri") } }
|
92
|
+
|
93
|
+
it "invokes the block with the builder as the argument" do
|
94
|
+
expect(builder).to receive(:match_requests).with("/some_uri")
|
95
|
+
|
96
|
+
subject
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
context "when the block accepts no arguments" do
|
102
|
+
|
103
|
+
subject { builder.invoke { match_requests("/some_uri") } }
|
104
|
+
|
105
|
+
it "invokes the block in the context of the builder" do
|
106
|
+
expect(builder).to receive(:match_requests).with("/some_uri")
|
107
|
+
|
108
|
+
subject
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#merge!" do
|
116
|
+
|
117
|
+
subject { builder.merge!(provided_builder) }
|
118
|
+
|
119
|
+
shared_context "a completely configured provided builder" do
|
120
|
+
|
121
|
+
let(:provided_triggers) { (1..3).map { instance_double(HttpStub::Configurer::DSL::StubBuilder) } }
|
122
|
+
|
123
|
+
let(:provided_builder) do
|
124
|
+
HttpStub::Configurer::DSL::StubBuilder.new({}).tap do |builder|
|
125
|
+
builder.match_requests("/replacement_uri", method: :put,
|
126
|
+
headers: { request_header_key: "replacement request header value",
|
127
|
+
other_request_header_key: "other request header value" },
|
128
|
+
parameters: { parameter_key: "replacement parameter value",
|
129
|
+
other_request_parameter_key: "other request parameter value" })
|
130
|
+
builder.respond_with(status: 203,
|
131
|
+
headers: { response_header_key: "reaplcement response header value",
|
132
|
+
other_response_header_key: "other response header value" },
|
133
|
+
body: "replacement body value",
|
134
|
+
delay_in_seconds: 3)
|
135
|
+
builder.trigger(provided_triggers)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
context "when the builder has been completely configured" do
|
142
|
+
|
143
|
+
let(:original_triggers) { (1..3).map { instance_double(HttpStub::Configurer::DSL::StubBuilder) } }
|
144
|
+
|
145
|
+
before(:example) do
|
146
|
+
builder.match_requests("/original_uri", method: :get,
|
147
|
+
headers: { request_header_key: "original request header value" },
|
148
|
+
parameters: { parameter_key: "original parameter value" })
|
149
|
+
builder.respond_with(status: 202,
|
150
|
+
headers: { response_header_key: "original response header value" },
|
151
|
+
body: "original body",
|
152
|
+
delay_in_seconds: 2)
|
153
|
+
builder.trigger(original_triggers)
|
154
|
+
end
|
155
|
+
|
156
|
+
context "and a builder that is completely configured is provided" do
|
157
|
+
|
158
|
+
include_context "a completely configured provided builder"
|
159
|
+
|
160
|
+
it "replaces the uri" do
|
161
|
+
subject
|
162
|
+
|
163
|
+
expect(builder.request).to include(uri: "/replacement_uri")
|
164
|
+
end
|
165
|
+
|
166
|
+
it "replaces the request method" do
|
167
|
+
subject
|
168
|
+
|
169
|
+
expect(builder.request).to include(method: :put)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "deeply merges the request headers" do
|
173
|
+
subject
|
174
|
+
|
175
|
+
expect(builder.request).to include(headers: { request_header_key: "replacement request header value",
|
176
|
+
other_request_header_key: "other request header value" })
|
177
|
+
end
|
178
|
+
|
179
|
+
it "deeply merges the request parameters" do
|
180
|
+
subject
|
181
|
+
|
182
|
+
expect(builder.request).to(
|
183
|
+
include(parameters: { parameter_key: "replacement parameter value",
|
184
|
+
other_request_parameter_key: "other request parameter value" })
|
185
|
+
)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "replaces the response status" do
|
189
|
+
subject
|
190
|
+
|
191
|
+
expect(builder.response).to include(status: 203)
|
192
|
+
end
|
193
|
+
|
194
|
+
it "deeply merges the response headers" do
|
195
|
+
subject
|
196
|
+
|
197
|
+
expect(builder.response).to include(headers: { response_header_key: "reaplcement response header value",
|
198
|
+
other_response_header_key: "other response header value" })
|
199
|
+
end
|
200
|
+
|
201
|
+
it "replaces the body" do
|
202
|
+
subject
|
203
|
+
|
204
|
+
expect(builder.response).to include(body: "replacement body value")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "replaces the response delay" do
|
208
|
+
subject
|
209
|
+
|
210
|
+
expect(builder.response).to include(delay_in_seconds: 3)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "adds to the triggers" do
|
214
|
+
subject
|
215
|
+
|
216
|
+
expect(builder.triggers).to eql(original_triggers + provided_triggers)
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
context "and a builder that is empty is provided" do
|
222
|
+
|
223
|
+
let(:provided_builder) { HttpStub::Configurer::DSL::StubBuilder.new({}) }
|
224
|
+
|
225
|
+
it "preserves the uri" do
|
226
|
+
subject
|
227
|
+
|
228
|
+
expect(builder.request).to include(uri: "/original_uri")
|
229
|
+
end
|
230
|
+
|
231
|
+
it "preserves the request method" do
|
232
|
+
subject
|
233
|
+
|
234
|
+
expect(builder.request).to include(method: :get)
|
235
|
+
end
|
236
|
+
|
237
|
+
it "preserves the request headers" do
|
238
|
+
subject
|
239
|
+
|
240
|
+
expect(builder.request).to include(headers: { request_header_key: "original request header value" })
|
241
|
+
end
|
242
|
+
|
243
|
+
it "preserves the request parameters" do
|
244
|
+
subject
|
245
|
+
|
246
|
+
expect(builder.request).to include(parameters: { parameter_key: "original parameter value" })
|
247
|
+
end
|
248
|
+
|
249
|
+
it "preserves the response status" do
|
250
|
+
subject
|
251
|
+
|
252
|
+
expect(builder.response).to include(status: 202)
|
253
|
+
end
|
254
|
+
|
255
|
+
it "preserves the response headers" do
|
256
|
+
subject
|
257
|
+
|
258
|
+
expect(builder.response).to include(headers: { response_header_key: "original response header value" })
|
259
|
+
end
|
260
|
+
|
261
|
+
it "preserves the body" do
|
262
|
+
subject
|
263
|
+
|
264
|
+
expect(builder.response).to include(body: "original body")
|
265
|
+
end
|
266
|
+
|
267
|
+
it "preserves the response delay" do
|
268
|
+
subject
|
269
|
+
|
270
|
+
expect(builder.response).to include(delay_in_seconds: 2)
|
271
|
+
end
|
272
|
+
|
273
|
+
it "preserves the triggers" do
|
274
|
+
subject
|
275
|
+
|
276
|
+
expect(builder.triggers).to eql(original_triggers)
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
context "when the builder has not been previously configured" do
|
284
|
+
|
285
|
+
include_context "a completely configured provided builder"
|
286
|
+
|
287
|
+
it "assumes the provided uri" do
|
288
|
+
subject
|
289
|
+
|
290
|
+
expect(builder.request).to include(uri: "/replacement_uri")
|
291
|
+
end
|
292
|
+
|
293
|
+
it "assumes the provided request method" do
|
294
|
+
subject
|
295
|
+
|
296
|
+
expect(builder.request).to include(method: :put)
|
297
|
+
end
|
298
|
+
|
299
|
+
it "assumes the provided request headers" do
|
300
|
+
subject
|
301
|
+
|
302
|
+
expect(builder.request).to include(headers: { request_header_key: "replacement request header value",
|
303
|
+
other_request_header_key: "other request header value" })
|
304
|
+
end
|
305
|
+
|
306
|
+
it "assumes the provided request parameters" do
|
307
|
+
subject
|
308
|
+
|
309
|
+
expect(builder.request).to(
|
310
|
+
include(parameters: { parameter_key: "replacement parameter value",
|
311
|
+
other_request_parameter_key: "other request parameter value" })
|
312
|
+
)
|
313
|
+
end
|
314
|
+
|
315
|
+
it "assumes the provided response status" do
|
316
|
+
subject
|
317
|
+
|
318
|
+
expect(builder.response).to include(status: 203)
|
319
|
+
end
|
320
|
+
|
321
|
+
it "assumes the provided response headers" do
|
322
|
+
subject
|
323
|
+
|
324
|
+
expect(builder.response).to include(headers: { response_header_key: "reaplcement response header value",
|
325
|
+
other_response_header_key: "other response header value" })
|
326
|
+
end
|
327
|
+
|
328
|
+
it "assumes the provided response body" do
|
329
|
+
subject
|
330
|
+
|
331
|
+
expect(builder.response).to include(body: "replacement body value")
|
332
|
+
end
|
333
|
+
|
334
|
+
it "assumes the provided response delay" do
|
335
|
+
subject
|
336
|
+
|
337
|
+
expect(builder.response).to include(delay_in_seconds: 3)
|
338
|
+
end
|
339
|
+
|
340
|
+
it "assumes the provided triggers" do
|
341
|
+
subject
|
342
|
+
|
343
|
+
expect(builder.triggers).to eql(provided_triggers)
|
344
|
+
end
|
345
|
+
|
346
|
+
end
|
347
|
+
|
348
|
+
end
|
349
|
+
|
87
350
|
describe "#build" do
|
88
351
|
|
89
352
|
let(:fixture) { HttpStub::StubFixture.new }
|