http_stub 0.16.0.pre1 → 0.17.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/lib/http_stub.rb +10 -5
- data/lib/http_stub/configurer.rb +1 -21
- data/lib/http_stub/configurer/dsl/{sanctioned.rb → server.rb} +7 -1
- data/lib/http_stub/configurer/dsl/stub_builder.rb +4 -0
- data/lib/http_stub/configurer/request/stub.rb +1 -0
- data/lib/http_stub/configurer/server/command_processor.rb +3 -3
- data/lib/http_stub/rake/server_tasks.rb +1 -1
- data/lib/http_stub/server/daemon.rb +3 -1
- data/lib/http_stub/server/stub/instance.rb +3 -2
- data/lib/http_stub/server/stub/json_request_body.rb +35 -0
- data/lib/http_stub/server/stub/request_body.rb +44 -0
- data/lib/http_stub/server/stub/simple_request_body.rb +23 -0
- data/lib/http_stub/server/stub/truthy_request_matcher.rb +23 -0
- data/lib/http_stub/server/views/_stub.haml +3 -0
- data/lib/http_stub/version.rb +1 -1
- data/spec/acceptance/configurer_initialization_spec.rb +1 -1
- data/spec/acceptance/stub_body_schema_validation_spec.rb +67 -0
- data/spec/acceptance/stub_control_values_spec.rb +2 -2
- data/spec/acceptance/stub_spec.rb +1 -1
- data/spec/lib/http_stub/configurer/dsl/{sanctioned_spec.rb → server_spec.rb} +34 -15
- data/spec/lib/http_stub/configurer/dsl/stub_builder_spec.rb +18 -0
- data/spec/lib/http_stub/configurer/request/stub_spec.rb +52 -20
- data/spec/lib/http_stub/configurer/server/command_processor_integration_spec.rb +7 -4
- data/spec/lib/http_stub/rake/server_tasks_smoke_spec.rb +54 -13
- data/spec/lib/http_stub/server/application_integration_spec.rb +22 -2
- data/spec/lib/http_stub/server/daemon_integration_spec.rb +1 -1
- data/spec/lib/http_stub/server/daemon_spec.rb +50 -2
- data/spec/lib/http_stub/server/stub/instance_spec.rb +44 -10
- data/spec/lib/http_stub/server/stub/json_request_body_spec.rb +102 -0
- data/spec/lib/http_stub/server/stub/request_body_spec.rb +120 -0
- data/spec/lib/http_stub/server/stub/simple_request_body_spec.rb +43 -0
- data/spec/lib/http_stub/server/stub/string_value_matcher_spec.rb +2 -2
- data/spec/lib/http_stub/server/stub/truthy_request_matcher_spec.rb +23 -0
- data/spec/lib/http_stub/server/stub/uri_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -2
- data/spec/support/configurer_integration.rb +2 -2
- data/spec/support/stub_fixture.rb +2 -1
- metadata +307 -281
- data/spec/lib/http_stub/configurer_spec.rb +0 -22
@@ -1,7 +1,7 @@
|
|
1
1
|
describe "Stub basics acceptance" do
|
2
2
|
include_context "configurer integration"
|
3
3
|
|
4
|
-
let(:configurer)
|
4
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithTrivialStub.new }
|
5
5
|
|
6
6
|
before(:example) { configurer.class.initialize! }
|
7
7
|
|
@@ -1,11 +1,30 @@
|
|
1
|
-
describe HttpStub::Configurer::DSL::
|
1
|
+
describe HttpStub::Configurer::DSL::Server do
|
2
2
|
|
3
3
|
let(:server_facade) { instance_double(HttpStub::Configurer::Server::Facade) }
|
4
4
|
|
5
|
-
let(:
|
5
|
+
let(:server) { HttpStub::Configurer::DSL::Server.new(server_facade) }
|
6
6
|
|
7
7
|
it "produces stub builders" do
|
8
|
-
expect(
|
8
|
+
expect(server).to be_a(HttpStub::Configurer::DSL::StubBuilderProducer)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#base_uri" do
|
12
|
+
|
13
|
+
subject { server.base_uri }
|
14
|
+
|
15
|
+
before(:example) do
|
16
|
+
server.host = "some_host"
|
17
|
+
server.port = 8888
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns a uri that combines any established host and port" do
|
21
|
+
expect(subject).to include("some_host:8888")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns a uri accessed via http" do
|
25
|
+
expect(subject).to match(/^http:\/\//)
|
26
|
+
end
|
27
|
+
|
9
28
|
end
|
10
29
|
|
11
30
|
describe "#has_started!" do
|
@@ -13,7 +32,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
13
32
|
it "informs the facade that the server has started" do
|
14
33
|
expect(server_facade).to receive(:server_has_started)
|
15
34
|
|
16
|
-
|
35
|
+
server.has_started!
|
17
36
|
end
|
18
37
|
|
19
38
|
end
|
@@ -43,7 +62,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
43
62
|
|
44
63
|
context "when a stub builder is provided" do
|
45
64
|
|
46
|
-
subject {
|
65
|
+
subject { server.add_stub!(stub_builder) }
|
47
66
|
|
48
67
|
it_behaves_like "adding a stub request"
|
49
68
|
|
@@ -55,7 +74,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
55
74
|
|
56
75
|
before(:example) { allow(HttpStub::Configurer::DSL::StubBuilder).to receive(:new).and_return(stub_builder) }
|
57
76
|
|
58
|
-
subject {
|
77
|
+
subject { server.add_stub!(&block) }
|
59
78
|
|
60
79
|
it "creates a stub builder" do
|
61
80
|
expect(HttpStub::Configurer::DSL::StubBuilder).to receive(:new)
|
@@ -89,13 +108,13 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
89
108
|
allow(HttpStub::Configurer::DSL::ScenarioBuilder).to receive(:new).and_return(scenario_builder)
|
90
109
|
end
|
91
110
|
|
92
|
-
subject {
|
111
|
+
subject { server.add_scenario!(scenario_name, &block) }
|
93
112
|
|
94
113
|
context "when response defaults have been established" do
|
95
114
|
|
96
115
|
let(:response_defaults) { { key: "value" } }
|
97
116
|
|
98
|
-
before(:example) {
|
117
|
+
before(:example) { server.response_defaults = { key: "value" } }
|
99
118
|
|
100
119
|
it "creates a scenario builder containing the response defaults" do
|
101
120
|
expect(HttpStub::Configurer::DSL::ScenarioBuilder).to receive(:new).with(response_defaults, anything)
|
@@ -156,13 +175,13 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
156
175
|
allow(HttpStub::Configurer::DSL::StubActivatorBuilder).to receive(:new).and_return(stub_activator_builder)
|
157
176
|
end
|
158
177
|
|
159
|
-
subject {
|
178
|
+
subject { server.add_activator!(&block) }
|
160
179
|
|
161
180
|
context "when response defaults have been established" do
|
162
181
|
|
163
182
|
let(:response_defaults) { { key: "value" } }
|
164
183
|
|
165
|
-
before(:example) {
|
184
|
+
before(:example) { server.response_defaults = { key: "value" } }
|
166
185
|
|
167
186
|
it "creates a stub activator builder containing the response defaults" do
|
168
187
|
expect(HttpStub::Configurer::DSL::StubActivatorBuilder).to receive(:new).with(response_defaults)
|
@@ -209,7 +228,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
209
228
|
it "delegates to the server facade" do
|
210
229
|
expect(server_facade).to receive(:activate).with(scenario_name)
|
211
230
|
|
212
|
-
|
231
|
+
server.activate!(scenario_name)
|
213
232
|
end
|
214
233
|
|
215
234
|
end
|
@@ -219,7 +238,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
219
238
|
it "delegates to the server facade" do
|
220
239
|
expect(server_facade).to receive(:remember_stubs)
|
221
240
|
|
222
|
-
|
241
|
+
server.remember_stubs
|
223
242
|
end
|
224
243
|
|
225
244
|
end
|
@@ -229,7 +248,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
229
248
|
it "delegates to the server facade" do
|
230
249
|
expect(server_facade).to receive(:recall_stubs)
|
231
250
|
|
232
|
-
|
251
|
+
server.recall_stubs!
|
233
252
|
end
|
234
253
|
|
235
254
|
end
|
@@ -239,7 +258,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
239
258
|
it "delegates to the server facade" do
|
240
259
|
expect(server_facade).to receive(:clear_stubs)
|
241
260
|
|
242
|
-
|
261
|
+
server.clear_stubs!
|
243
262
|
end
|
244
263
|
|
245
264
|
end
|
@@ -249,7 +268,7 @@ describe HttpStub::Configurer::DSL::Sanctioned do
|
|
249
268
|
it "delegates to the server facade" do
|
250
269
|
expect(server_facade).to receive(:clear_scenarios)
|
251
270
|
|
252
|
-
|
271
|
+
server.clear_scenarios!
|
253
272
|
end
|
254
273
|
|
255
274
|
end
|
@@ -38,6 +38,24 @@ describe HttpStub::Configurer::DSL::StubBuilder do
|
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
|
+
describe "#schema" do
|
42
|
+
|
43
|
+
let(:type) { :some_type }
|
44
|
+
|
45
|
+
subject { builder.schema(type, schema_definition) }
|
46
|
+
|
47
|
+
context "when a definition is provided in a ruby hash" do
|
48
|
+
|
49
|
+
let(:schema_definition) { { schema: "definition" } }
|
50
|
+
|
51
|
+
it "returns a hash with a :schema entry containing both the type and schema definition" do
|
52
|
+
expect(subject).to eql(schema: { type: type, definition: schema_definition })
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
41
59
|
describe "#respond_with" do
|
42
60
|
|
43
61
|
subject { builder.respond_with(status: 201) }
|
@@ -47,48 +47,80 @@ describe HttpStub::Configurer::Request::Stub do
|
|
47
47
|
|
48
48
|
before(:example) { allow(HttpStub::Configurer::Request::ControllableValue).to receive(:format) }
|
49
49
|
|
50
|
-
context "when request headers
|
50
|
+
context "when request headers" do
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
context "are provided" do
|
53
|
+
|
54
|
+
it "formats the headers into control values" do
|
55
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with(fixture.request.headers)
|
56
|
+
|
57
|
+
subject
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
context "are not provided" do
|
63
|
+
|
64
|
+
before(:example) { fixture.request.headers = nil }
|
65
|
+
|
66
|
+
it "formats an empty header hash" do
|
67
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with({})
|
68
|
+
|
69
|
+
subject
|
70
|
+
end
|
54
71
|
|
55
|
-
subject
|
56
72
|
end
|
57
73
|
|
58
74
|
end
|
59
75
|
|
60
|
-
context "when
|
76
|
+
context "when request parameters" do
|
77
|
+
|
78
|
+
context "are provided" do
|
79
|
+
|
80
|
+
it "formats the request parameters into control values" do
|
81
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with(fixture.request.parameters)
|
82
|
+
|
83
|
+
subject
|
84
|
+
end
|
61
85
|
|
62
|
-
before(:example) do
|
63
|
-
fixture.request.headers = nil
|
64
86
|
end
|
65
87
|
|
66
|
-
|
67
|
-
|
88
|
+
context "are not provided" do
|
89
|
+
|
90
|
+
before(:example) { fixture.request.parameters = nil }
|
91
|
+
|
92
|
+
it "formats an empty parameter hash" do
|
93
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with({})
|
94
|
+
|
95
|
+
subject
|
96
|
+
end
|
68
97
|
|
69
|
-
subject
|
70
98
|
end
|
71
99
|
|
72
100
|
end
|
73
101
|
|
74
|
-
context "when a request
|
102
|
+
context "when a request body" do
|
75
103
|
|
76
|
-
|
77
|
-
|
104
|
+
context "is provided" do
|
105
|
+
|
106
|
+
it "formats the request body into a control value" do
|
107
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with(fixture.request.body)
|
108
|
+
|
109
|
+
subject
|
110
|
+
end
|
78
111
|
|
79
|
-
subject
|
80
112
|
end
|
81
113
|
|
82
|
-
|
114
|
+
context "is not provided" do
|
83
115
|
|
84
|
-
|
116
|
+
before(:example) { fixture.request.body = nil }
|
85
117
|
|
86
|
-
|
118
|
+
it "formats an empty parameter hash" do
|
119
|
+
expect(HttpStub::Configurer::Request::ControllableValue).to receive(:format).with({})
|
87
120
|
|
88
|
-
|
89
|
-
|
121
|
+
subject
|
122
|
+
end
|
90
123
|
|
91
|
-
subject
|
92
124
|
end
|
93
125
|
|
94
126
|
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
describe HttpStub::Configurer::Server::CommandProcessor do
|
2
2
|
|
3
3
|
let(:command) { HttpStub::Configurer::Server::Command.new(request: request, description: "performing an operation") }
|
4
|
-
let(:
|
5
|
-
|
6
|
-
let(:
|
7
|
-
|
4
|
+
let(:server_host) { "localhost" }
|
5
|
+
let(:server_port) { 8001 }
|
6
|
+
let(:server_base_uri) { "http://#{server_host}:#{server_port}" }
|
7
|
+
let(:stub_server) do
|
8
|
+
instance_double(HttpStub::Configurer::DSL::Server, base_uri: server_base_uri, host: server_host, port: server_port)
|
8
9
|
end
|
9
10
|
|
11
|
+
let(:configurer) { double(HttpStub::Configurer, stub_server: stub_server) }
|
12
|
+
|
10
13
|
let(:command_processor) { HttpStub::Configurer::Server::CommandProcessor.new(configurer) }
|
11
14
|
|
12
15
|
describe "#process" do
|
@@ -1,30 +1,71 @@
|
|
1
1
|
describe HttpStub::Rake::ServerTasks do
|
2
2
|
include Rake::DSL
|
3
3
|
|
4
|
-
|
4
|
+
shared_context "verification of generated tasks" do
|
5
5
|
|
6
|
-
|
6
|
+
before(:example) { HttpStub::Rake::ServerTasks.new(task_args) }
|
7
7
|
|
8
|
-
|
8
|
+
describe "start:foreground task" do
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
let(:task) { Rake::Task["#{task_args[:name]}:start:foreground"] }
|
11
|
+
|
12
|
+
context "when invoked" do
|
13
|
+
|
14
|
+
before(:example) do
|
15
|
+
Thread.new { task.invoke("--trace") }
|
16
|
+
wait_until_server_has_started
|
17
|
+
end
|
18
|
+
|
19
|
+
after(:example) { wait_until_server_has_stopped }
|
20
|
+
|
21
|
+
it "starts a stub server that responds to stub requests" do
|
22
|
+
request = Net::HTTP::Post.new("/stubs")
|
23
|
+
request.body = { "uri" => "/", "response" => { "status" => 302, "body" => "Some Body" } }.to_json
|
14
24
|
|
15
|
-
|
25
|
+
response = Net::HTTP.new("localhost", port).start { |http| http.request(request) }
|
16
26
|
|
17
|
-
|
18
|
-
|
19
|
-
request.body = { "response" => { "status" => 302, "body" => "Some Body" } }.to_json
|
27
|
+
expect(response.code).to eql("200")
|
28
|
+
end
|
20
29
|
|
21
|
-
|
30
|
+
def wait_until_server_has_started
|
31
|
+
::Wait.until!("http stub server #{task_args[:name]} started") do
|
32
|
+
Net::HTTP.get_response("localhost", "/", port)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def wait_until_server_has_stopped
|
37
|
+
HttpStub::Server::Application.stop!
|
38
|
+
end
|
22
39
|
|
23
|
-
expect(response.code).to eql("200")
|
24
40
|
end
|
25
41
|
|
26
42
|
end
|
27
43
|
|
28
44
|
end
|
29
45
|
|
46
|
+
context "when a configurer is provided" do
|
47
|
+
|
48
|
+
let(:port) { 8004 }
|
49
|
+
let(:configurer) do
|
50
|
+
configurer = Class.new.tap do |configurer|
|
51
|
+
configurer.send(:include, HttpStub::Configurer)
|
52
|
+
configurer.stub_server.host = "localhost"
|
53
|
+
configurer.stub_server.port = port
|
54
|
+
end
|
55
|
+
end
|
56
|
+
let(:task_args) { { name: :test_server_with_configurer, configurer: configurer } }
|
57
|
+
|
58
|
+
include_context "verification of generated tasks"
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when a port is provided" do
|
63
|
+
|
64
|
+
let(:port) { 8003 }
|
65
|
+
let(:task_args) { { name: :test_server_with_port, port: port } }
|
66
|
+
|
67
|
+
include_context "verification of generated tasks"
|
68
|
+
|
69
|
+
end
|
70
|
+
|
30
71
|
end
|
@@ -36,8 +36,8 @@ describe HttpStub::Server::Application, "when the server is running" do
|
|
36
36
|
|
37
37
|
before(:context) do
|
38
38
|
configurer = HttpStub::Examples::ConfigurerWithExhaustiveScenarios
|
39
|
-
configurer.host
|
40
|
-
configurer.port
|
39
|
+
configurer.stub_server.host = server_host
|
40
|
+
configurer.stub_server.port = server_port
|
41
41
|
configurer.initialize!
|
42
42
|
end
|
43
43
|
|
@@ -93,6 +93,26 @@ describe HttpStub::Server::Application, "when the server is running" do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
it "returns a response whose body contains the bodies of each stub" do
|
97
|
+
(1..3).each do |stub_number|
|
98
|
+
expect(response.body).to(
|
99
|
+
match(/#{escape_html("\"property_#{stub_number}\":{\"type\":\"property_#{stub_number}_type\"")}/)
|
100
|
+
)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it "returns a response whose body contains the bodies of each stub trigger" do
|
105
|
+
(1..3).each do |stub_number|
|
106
|
+
(1..3).each do |trigger_number|
|
107
|
+
expected_property_name = "property_#{stub_number}_trigger_#{trigger_number}"
|
108
|
+
expected_property_type = "property_#{stub_number}_trigger_#{trigger_number}_type"
|
109
|
+
expect(response.body).to(
|
110
|
+
match(/#{escape_html("\"#{expected_property_name}\":{\"type\":\"#{expected_property_type}\"")}/)
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
96
116
|
it "returns a response whose body contains the response status of each stub" do
|
97
117
|
(1..3).each { |stub_number| expect(response.body).to match(/20#{stub_number}/) }
|
98
118
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
describe HttpStub::Server::Daemon do
|
2
2
|
|
3
|
-
let(:
|
3
|
+
let(:server_port) { 8888 }
|
4
4
|
|
5
|
-
let(:server_daemon) {
|
5
|
+
let(:server_daemon) { create_daemon_without_configurer }
|
6
6
|
|
7
7
|
before(:example) { allow(server_daemon.logger).to receive(:info) }
|
8
8
|
|
@@ -34,6 +34,42 @@ describe HttpStub::Server::Daemon do
|
|
34
34
|
|
35
35
|
end
|
36
36
|
|
37
|
+
describe "constructor" do
|
38
|
+
|
39
|
+
context "when a configurer is provided" do
|
40
|
+
|
41
|
+
let(:server_host) { "some_host" }
|
42
|
+
let(:stub_server) { instance_double(HttpStub::Configurer::DSL::Server, host: server_host, port: server_port) }
|
43
|
+
let(:configurer) { double(HttpStub::Configurer, stub_server: stub_server) }
|
44
|
+
|
45
|
+
let(:server_daemon) { create_daemon_with_configurer }
|
46
|
+
|
47
|
+
it "establishes the daemons host as the configurers server host" do
|
48
|
+
expect(server_daemon.host).to eql(server_host)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "establishes the daemons port as the configurers server port" do
|
52
|
+
expect(server_daemon.port).to eql(server_port)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when a configurer is not provided" do
|
58
|
+
|
59
|
+
let(:server_daemon) { create_daemon_without_configurer }
|
60
|
+
|
61
|
+
it "defaults the daemons host to 'localhost'" do
|
62
|
+
expect(server_daemon.host).to eql("localhost")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "establishes the daemons port as the provided value" do
|
66
|
+
expect(server_daemon.port).to eql(server_port)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
37
73
|
describe "#start!" do
|
38
74
|
|
39
75
|
before(:example) { allow(server_daemon).to receive(:running?).and_return(true) }
|
@@ -42,6 +78,8 @@ describe HttpStub::Server::Daemon do
|
|
42
78
|
|
43
79
|
let(:configurer) { double(HttpStub::Configurer).as_null_object }
|
44
80
|
|
81
|
+
let(:server_daemon) { create_daemon_with_configurer }
|
82
|
+
|
45
83
|
it "initializes the configurer" do
|
46
84
|
expect(configurer).to receive(:initialize!)
|
47
85
|
|
@@ -58,6 +96,8 @@ describe HttpStub::Server::Daemon do
|
|
58
96
|
|
59
97
|
context "when no configurer is provided" do
|
60
98
|
|
99
|
+
let(:server_daemon) { create_daemon_without_configurer }
|
100
|
+
|
61
101
|
it "does not log that the server has been initialized" do
|
62
102
|
expect(server_daemon.logger).not_to receive(:info).with("sample_server_daemon initialized")
|
63
103
|
|
@@ -68,4 +108,12 @@ describe HttpStub::Server::Daemon do
|
|
68
108
|
|
69
109
|
end
|
70
110
|
|
111
|
+
def create_daemon_with_configurer
|
112
|
+
HttpStub::Server::Daemon.new(name: :sample_server_daemon, configurer: configurer)
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_daemon_without_configurer
|
116
|
+
HttpStub::Server::Daemon.new(name: :sample_server_daemon, port: server_port)
|
117
|
+
end
|
118
|
+
|
71
119
|
end
|