http_stub 0.13.5 → 0.14.0.rc1

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/lib/http_stub.rb +13 -4
  3. data/lib/http_stub/configurer.rb +9 -63
  4. data/lib/http_stub/configurer/deprecated_dsl.rb +57 -0
  5. data/lib/http_stub/configurer/request/stub.rb +7 -13
  6. data/lib/http_stub/configurer/request/stub_activator.rb +8 -4
  7. data/lib/http_stub/configurer/request/stub_activator_payload_builder.rb +25 -0
  8. data/lib/http_stub/configurer/request/stub_payload_builder.rb +44 -0
  9. data/lib/http_stub/configurer/server/buffered_command_processor.rb +24 -0
  10. data/lib/http_stub/configurer/server/command.rb +18 -0
  11. data/lib/http_stub/configurer/server/command_processor.rb +38 -0
  12. data/lib/http_stub/configurer/server/dsl.rb +56 -0
  13. data/lib/http_stub/configurer/server/facade.rb +57 -0
  14. data/lib/http_stub/configurer/server/request_processor.rb +30 -0
  15. data/lib/http_stub/models/registry.rb +4 -0
  16. data/lib/http_stub/models/stub.rb +2 -1
  17. data/lib/http_stub/models/stub_registry.rb +29 -0
  18. data/lib/http_stub/models/stub_triggers.rb +23 -0
  19. data/lib/http_stub/rake/server_tasks.rb +2 -5
  20. data/lib/http_stub/server.rb +14 -4
  21. data/lib/http_stub/version.rb +1 -1
  22. data/lib/http_stub/views/_stub.haml +7 -0
  23. data/spec/lib/http_stub/configurer/deprecated_dsl_spec.rb +232 -0
  24. data/spec/lib/http_stub/configurer/request/controllable_value_spec.rb +8 -8
  25. data/spec/lib/http_stub/configurer/request/omittable_spec.rb +8 -8
  26. data/spec/lib/http_stub/configurer/request/regexpable_spec.rb +14 -14
  27. data/spec/lib/http_stub/configurer/request/stub_activator_payload_builder_spec.rb +74 -0
  28. data/spec/lib/http_stub/configurer/request/stub_activator_spec.rb +19 -26
  29. data/spec/lib/http_stub/configurer/request/stub_payload_builder_spec.rb +203 -0
  30. data/spec/lib/http_stub/configurer/request/stub_spec.rb +18 -157
  31. data/spec/lib/http_stub/configurer/server/buffered_command_processor_spec.rb +35 -0
  32. data/spec/lib/http_stub/configurer/server/command_processor_integration_spec.rb +62 -0
  33. data/spec/lib/http_stub/configurer/server/command_spec.rb +25 -0
  34. data/spec/lib/http_stub/configurer/server/dsl_spec.rb +241 -0
  35. data/spec/lib/http_stub/configurer/server/facade_spec.rb +253 -0
  36. data/spec/lib/http_stub/configurer/server/request_processor_spec.rb +99 -0
  37. data/spec/lib/http_stub/configurer_integration_spec.rb +172 -122
  38. data/spec/lib/http_stub/configurer_spec.rb +4 -4
  39. data/spec/lib/http_stub/controllers/stub_activator_controller_spec.rb +25 -25
  40. data/spec/lib/http_stub/controllers/stub_controller_spec.rb +22 -22
  41. data/spec/lib/http_stub/hash_extensions_spec.rb +24 -24
  42. data/spec/lib/http_stub/models/exact_value_matcher_spec.rb +4 -4
  43. data/spec/lib/http_stub/models/hash_with_string_value_matchers_spec.rb +29 -29
  44. data/spec/lib/http_stub/models/headers_spec.rb +10 -10
  45. data/spec/lib/http_stub/models/omitted_value_matcher_spec.rb +8 -8
  46. data/spec/lib/http_stub/models/regexp_value_matcher_spec.rb +6 -6
  47. data/spec/lib/http_stub/models/registry_spec.rb +71 -28
  48. data/spec/lib/http_stub/models/request_header_parser_spec.rb +4 -4
  49. data/spec/lib/http_stub/models/request_pipeline_spec.rb +2 -2
  50. data/spec/lib/http_stub/models/response_spec.rb +38 -38
  51. data/spec/lib/http_stub/models/string_value_matcher_spec.rb +25 -25
  52. data/spec/lib/http_stub/models/stub_activator_spec.rb +15 -15
  53. data/spec/lib/http_stub/models/stub_headers_spec.rb +18 -18
  54. data/spec/lib/http_stub/models/stub_parameters_spec.rb +16 -16
  55. data/spec/lib/http_stub/models/stub_registry_integration_spec.rb +62 -0
  56. data/spec/lib/http_stub/models/stub_registry_spec.rb +152 -0
  57. data/spec/lib/http_stub/models/stub_spec.rb +67 -43
  58. data/spec/lib/http_stub/models/stub_triggers_spec.rb +64 -0
  59. data/spec/lib/http_stub/models/stub_uri_spec.rb +9 -9
  60. data/spec/lib/http_stub/rake/server_daemon_tasks_smoke_spec.rb +7 -7
  61. data/spec/lib/http_stub/rake/server_tasks_smoke_spec.rb +5 -5
  62. data/spec/lib/http_stub/rake/server_tasks_spec.rb +17 -15
  63. data/spec/lib/http_stub/server_daemon_spec.rb +16 -16
  64. data/spec/lib/http_stub/server_integration_spec.rb +112 -65
  65. data/spec/lib/http_stub/server_spec.rb +134 -96
  66. data/spec/spec_helper.rb +1 -1
  67. data/spec/support/http_stub/configurer/request/stub_payload_builder_shared_context.rb +27 -0
  68. data/spec/support/server_integration.rb +2 -2
  69. metadata +69 -30
  70. data/lib/http_stub/configurer/command.rb +0 -26
  71. data/lib/http_stub/configurer/command_processor.rb +0 -36
  72. data/lib/http_stub/configurer/impatient_command_chain.rb +0 -13
  73. data/lib/http_stub/configurer/patient_command_chain.rb +0 -25
  74. data/spec/lib/http_stub/configurer/command_processor_integration_spec.rb +0 -63
  75. data/spec/lib/http_stub/configurer/command_spec.rb +0 -40
  76. data/spec/lib/http_stub/configurer/impatient_command_chain_spec.rb +0 -17
  77. data/spec/lib/http_stub/configurer/patient_command_chain_spec.rb +0 -73
@@ -2,179 +2,40 @@ describe HttpStub::Configurer::Request::Stub do
2
2
 
3
3
  describe "#initialize" do
4
4
 
5
- context "when provided a uri and stub arguments" do
6
-
7
- let(:uri) { "/some/uri" }
8
- let(:stub_method) { "Some Method" }
9
- let(:request_headers) { { "request_header_name" => "value" } }
10
- let(:request_parameters) { { "parameter_name" => "value" } }
11
- let(:response_status) { 500 }
12
- let(:response_headers) { { "response_header_name" => "value" } }
13
- let(:response_body) { "Some body" }
14
- let(:response_delay_in_seconds) { 7 }
15
-
16
- let(:stub_args) do
17
- {
18
- method: stub_method,
19
- headers: request_headers,
20
- parameters: request_parameters,
21
- response: {
22
- status: response_status,
23
- headers: response_headers,
24
- body: response_body,
25
- delay_in_seconds: response_delay_in_seconds
26
- }
27
- }
28
- end
5
+ context "when provided a payload" do
29
6
 
30
- let(:request) { HttpStub::Configurer::Request::Stub.new(uri, stub_args) }
31
- let(:request_body) { JSON.parse(request.body) }
7
+ let(:payload) { { payload_key: "payload value" } }
32
8
 
33
- before(:each) { HttpStub::Configurer::Request::ControllableValue.stub(:format) }
9
+ let(:request) { HttpStub::Configurer::Request::Stub.new(payload) }
34
10
 
35
- it "should create a HTTP POST request" do
36
- request.method.should eql("POST")
11
+ it "creates a HTTP POST request" do
12
+ expect(request.method).to eql("POST")
37
13
  end
38
14
 
39
- it "should submit the request to '/stubs'" do
40
- request.path.should eql("/stubs")
15
+ it "submits the request to '/stubs'" do
16
+ expect(request.path).to eql("/stubs")
41
17
  end
42
18
 
43
- it "should set the content type to json" do
44
- request.content_type.should eql("application/json")
19
+ it "sets the content type to json" do
20
+ expect(request.content_type).to eql("application/json")
45
21
  end
46
22
 
47
- context "when a request header argument is provided" do
48
-
49
- it "should format the headers into control values" do
50
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format).with(request_headers)
51
-
52
- request
53
- end
54
-
23
+ it "sets the body to the JSON representation of the provided payload" do
24
+ expect(request.body).to eql(payload.to_json)
55
25
  end
56
26
 
57
- context "when no request header is provided" do
58
-
59
- let(:request_headers) { nil }
60
-
61
- it "should format an empty header hash" do
62
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format).with({})
63
-
64
- request
65
- end
66
-
67
- end
68
-
69
- context "when a request parameter argument is provided" do
70
-
71
- it "should format the request parameters into control values" do
72
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format).with(request_parameters)
73
-
74
- request
75
- end
76
-
77
- end
78
-
79
- context "when no request parameter argument is provided" do
80
-
81
- let(:request_parameters) { nil }
82
-
83
- it "should format an empty parameter hash" do
84
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format).with({})
85
-
86
- request
87
- end
88
-
89
- end
90
-
91
- context "generates a JSON body which" do
92
-
93
- it "should have an entry containing the control value representation of the uri" do
94
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format).with(uri).and_return("uri as a string")
95
-
96
- request_body.should include("uri" => "uri as a string")
97
- end
98
-
99
- it "should have an entry for the method argument" do
100
- request_body.should include("method" => stub_method)
101
- end
102
-
103
- it "should have an entry containing the string representation of the request headers" do
104
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format)
105
- .with(request_headers).and_return("request headers as string")
106
-
107
- request_body.should include("headers" => "request headers as string")
108
- end
109
-
110
- it "should have an entry containing the string representation of the request parameters" do
111
- HttpStub::Configurer::Request::ControllableValue.should_receive(:format)
112
- .with(request_parameters).and_return("request parameters as string")
113
-
114
- request_body.should include("parameters" => "request parameters as string")
115
- end
116
-
117
- context "when a status response argument is provided" do
118
-
119
- it "should have a response entry for the argument" do
120
- request_body["response"].should include("status" => response_status)
121
- end
122
-
123
- end
124
-
125
- context "when no status response argument is provided" do
126
-
127
- let(:response_status) { nil }
128
-
129
- it "should have a response entry with an empty status code" do
130
- request_body["response"].should include("status" => "")
131
- end
132
-
133
- end
134
-
135
- it "should have an entry for the response body argument" do
136
- request_body["response"].should include("body" => response_body)
137
- end
138
-
139
- context "when a delay argument is provided" do
140
-
141
- it "should have a response entry for the argument" do
142
- request_body["response"].should include("delay_in_seconds" => response_delay_in_seconds)
143
- end
144
-
145
- end
146
-
147
- context "when a delay argument is not provided" do
148
-
149
- let(:response_delay_in_seconds) { nil }
150
-
151
- it "should have a response entry with an empty delay" do
152
- request_body["response"].should include("delay_in_seconds" => "")
153
- end
154
-
155
- end
156
-
157
- context "when response headers are provided" do
158
-
159
- let(:response_headers) { { "response_header_name" => "value" } }
160
-
161
- it "should have a headers response entry containing the the provided headers" do
162
- request_body["response"]["headers"].should eql(response_headers)
163
- end
164
-
165
- end
27
+ end
166
28
 
167
- context "when response headers are not provided" do
29
+ end
168
30
 
169
- let (:response_headers) { nil }
31
+ describe "#stub_uri" do
170
32
 
171
- it "should have a headers response entry containing an empty hash" do
172
- request_body["response"]["headers"].should eql({})
173
- end
174
- end
33
+ let(:stub_uri) { "/some/stub/uri" }
175
34
 
176
- end
35
+ let(:request) { HttpStub::Configurer::Request::Stub.new(uri: stub_uri) }
177
36
 
37
+ it "should return the uri from the payload" do
38
+ expect(request.stub_uri).to eql(stub_uri)
178
39
  end
179
40
 
180
41
  end
@@ -0,0 +1,35 @@
1
+ describe HttpStub::Configurer::Server::BufferedCommandProcessor do
2
+
3
+ let(:command_processor) { instance_double(HttpStub::Configurer::Server::CommandProcessor) }
4
+
5
+ let(:buffered_command_processor) { HttpStub::Configurer::Server::BufferedCommandProcessor.new(command_processor) }
6
+
7
+ describe "#flush" do
8
+
9
+ subject { buffered_command_processor.flush }
10
+
11
+ describe "when a number of commands have been buffered via processing" do
12
+
13
+ let(:commands) { (1..3).map { instance_double(HttpStub::Configurer::Server::Command) } }
14
+
15
+ before(:example) { commands.each { |command| buffered_command_processor.process(command) } }
16
+
17
+ it "processes the buffered commands via the command processor" do
18
+ commands.each { |command| expect(command_processor).to receive(:process).with(command) }
19
+
20
+ subject
21
+ end
22
+
23
+ end
24
+
25
+ describe "when no commands have been buffered" do
26
+
27
+ it "executes without error" do
28
+ expect { subject }.not_to raise_error
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,62 @@
1
+ describe HttpStub::Configurer::Server::CommandProcessor do
2
+
3
+ let(:command) { HttpStub::Configurer::Server::Command.new(request: request, description: "performing an operation") }
4
+ let(:server_base_uri) { "http://localhost:8001" }
5
+
6
+ let(:configurer) do
7
+ double(HttpStub::Configurer, get_base_uri: server_base_uri, get_host: "localhost", get_port: 8001)
8
+ end
9
+
10
+ let(:command_processor) { HttpStub::Configurer::Server::CommandProcessor.new(configurer) }
11
+
12
+ describe "#process" do
13
+
14
+ subject { command_processor.process(command) }
15
+
16
+ context "when the server is running" do
17
+
18
+ include_context "server integration"
19
+
20
+ describe "and the server responds with a 200 response" do
21
+
22
+ let(:request) { Net::HTTP::Get.new("/stubs") }
23
+
24
+ it "executes without error" do
25
+ expect { subject }.not_to raise_error
26
+ end
27
+
28
+ end
29
+
30
+ describe "and the server responds with a non-200 response" do
31
+
32
+ let(:request) { Net::HTTP::Get.new("/causes_error") }
33
+
34
+ it "raises an exception that includes the server base URI" do
35
+ expect { subject }.to raise_error(/#{server_base_uri}/)
36
+ end
37
+
38
+ it "raises an exception that includes the commands description" do
39
+ expect { subject }.to raise_error(/performing an operation/)
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ context "when the server is unavailable" do
47
+
48
+ let(:request) { Net::HTTP::Get.new("/does/not/exist") }
49
+
50
+ it "raises an exception that includes the server base URI" do
51
+ expect { subject }.to raise_error(/#{server_base_uri}/)
52
+ end
53
+
54
+ it "raises an exception that includes the commands description" do
55
+ expect { subject }.to raise_error(/performing an operation/)
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,25 @@
1
+ describe HttpStub::Configurer::Server::Command do
2
+
3
+ let(:request) { double("HttpRequest") }
4
+ let(:description) { "Some Description" }
5
+ let(:args) { { request: request, description: description } }
6
+
7
+ let(:command) { HttpStub::Configurer::Server::Command.new(args) }
8
+
9
+ describe "#request" do
10
+
11
+ it "exposes the provided request" do
12
+ expect(command.request).to eql(request)
13
+ end
14
+
15
+ end
16
+
17
+ describe "#description" do
18
+
19
+ it "exposes the provided description" do
20
+ expect(command.description).to eql(description)
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,241 @@
1
+ describe HttpStub::Configurer::Server::DSL do
2
+
3
+ let(:server_facade) { instance_double(HttpStub::Configurer::Server::Facade) }
4
+
5
+ let(:dsl) { HttpStub::Configurer::Server::DSL.new(server_facade) }
6
+
7
+ describe "#has_started!" do
8
+
9
+ it "informs the facade that the server has started" do
10
+ expect(server_facade).to receive(:server_has_started)
11
+
12
+ dsl.has_started!
13
+ end
14
+
15
+ end
16
+
17
+ describe "#build_stub" do
18
+
19
+ let(:stub_payload_builder) { instance_double(HttpStub::Configurer::Request::StubPayloadBuilder) }
20
+
21
+ before(:example) do
22
+ allow(HttpStub::Configurer::Request::StubPayloadBuilder).to receive(:new).and_return(stub_payload_builder)
23
+ end
24
+
25
+ it "creates a stub payload builder" do
26
+ expect(HttpStub::Configurer::Request::StubPayloadBuilder).to receive(:new)
27
+
28
+ dsl.build_stub
29
+ end
30
+
31
+ context "when a block is provided" do
32
+
33
+ let(:block) { lambda { |_stub| "some block" } }
34
+
35
+ subject { dsl.build_stub(&block) }
36
+
37
+ it "yields the created builder to the provided block" do
38
+ expect(block).to receive(:call).with(stub_payload_builder)
39
+
40
+ subject
41
+ end
42
+
43
+ it "returns the created builder" do
44
+ expect(subject).to eql(stub_payload_builder)
45
+ end
46
+
47
+ end
48
+
49
+ context "when a block is not provided" do
50
+
51
+ subject { dsl.build_stub }
52
+
53
+ it "returns the built stub" do
54
+ expect(subject).to eql(stub_payload_builder)
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ describe "#add_stub!" do
62
+
63
+ let(:stub_payload) { { stub_payload_key: "stub payload value" } }
64
+ let(:stub_payload_builder) do
65
+ instance_double(HttpStub::Configurer::Request::StubPayloadBuilder, build: stub_payload)
66
+ end
67
+ let(:stub_request) { instance_double(HttpStub::Configurer::Request::Stub) }
68
+
69
+ before(:example) do
70
+ allow(HttpStub::Configurer::Request::Stub).to receive(:new).and_return(stub_request)
71
+ allow(server_facade).to receive(:stub_response)
72
+ end
73
+
74
+ shared_examples_for "adding a stub payload" do
75
+
76
+ it "builds the stub payload" do
77
+ expect(stub_payload_builder).to receive(:build).and_return(stub_payload)
78
+
79
+ subject
80
+ end
81
+
82
+ it "creates a stub request with the built payload" do
83
+ expect(HttpStub::Configurer::Request::Stub).to receive(:new).with(stub_payload).and_return(stub_request)
84
+
85
+ subject
86
+ end
87
+
88
+ it "informs the server facade to stub the response" do
89
+ expect(server_facade).to receive(:stub_response).with(stub_request)
90
+
91
+ subject
92
+ end
93
+
94
+ end
95
+
96
+ context "when a stub payload builder is provided" do
97
+
98
+ subject { dsl.add_stub!(stub_payload_builder) }
99
+
100
+ it_behaves_like "adding a stub payload"
101
+
102
+ end
103
+
104
+ context "when a stub payload builder is not provided" do
105
+
106
+ let(:block) { lambda { |_stub| "some block" } }
107
+
108
+ before(:example) do
109
+ allow(HttpStub::Configurer::Request::StubPayloadBuilder).to receive(:new).and_return(stub_payload_builder)
110
+ end
111
+
112
+ subject { dsl.add_stub!(&block) }
113
+
114
+ it "creates a stub payload builder" do
115
+ expect(HttpStub::Configurer::Request::StubPayloadBuilder).to receive(:new)
116
+
117
+ subject
118
+ end
119
+
120
+ it "yields the created builder to the provided block" do
121
+ expect(block).to receive(:call).with(stub_payload_builder)
122
+
123
+ subject
124
+ end
125
+
126
+ it_behaves_like "adding a stub payload"
127
+
128
+ end
129
+
130
+ end
131
+
132
+ describe "#add_activator!" do
133
+
134
+ let(:stub_activator_payload) { { activator_payload_key: "activator payload value" } }
135
+ let(:stub_activator_payload_builder) do
136
+ instance_double(HttpStub::Configurer::Request::StubActivatorPayloadBuilder, build: stub_activator_payload)
137
+ end
138
+ let(:stub_activator_request) { instance_double(HttpStub::Configurer::Request::StubActivator) }
139
+
140
+ before(:example) do
141
+ allow(HttpStub::Configurer::Request::StubActivator).to receive(:new).and_return(stub_activator_request)
142
+ allow(server_facade).to receive(:stub_activator)
143
+ end
144
+
145
+ let(:block) { lambda { |_activator| "some block" } }
146
+
147
+ before(:example) do
148
+ allow(HttpStub::Configurer::Request::StubActivatorPayloadBuilder).to(
149
+ receive(:new).and_return(stub_activator_payload_builder)
150
+ )
151
+ end
152
+
153
+ subject { dsl.add_activator!(&block) }
154
+
155
+ it "creates a stub activator payload builder" do
156
+ expect(HttpStub::Configurer::Request::StubActivatorPayloadBuilder).to receive(:new)
157
+
158
+ subject
159
+ end
160
+
161
+ it "yields the created builder to the provided block" do
162
+ expect(block).to receive(:call).with(stub_activator_payload_builder)
163
+
164
+ subject
165
+ end
166
+
167
+ it "builds the stub activator payload" do
168
+ expect(stub_activator_payload_builder).to receive(:build).and_return(stub_activator_payload)
169
+
170
+ subject
171
+ end
172
+
173
+ it "creates a stub activator request with the built payload" do
174
+ expect(HttpStub::Configurer::Request::StubActivator).to(
175
+ receive(:new).with(stub_activator_payload).and_return(stub_activator_request)
176
+ )
177
+
178
+ subject
179
+ end
180
+
181
+ it "informs the server facade to submit the stub activator request" do
182
+ expect(server_facade).to receive(:stub_activator).with(stub_activator_request)
183
+
184
+ subject
185
+ end
186
+
187
+ end
188
+
189
+ describe "#activate!" do
190
+
191
+ let(:uri) { "/some/activation/uri" }
192
+
193
+ it "delegates to the server facade" do
194
+ expect(server_facade).to receive(:activate).with(uri)
195
+
196
+ dsl.activate!(uri)
197
+ end
198
+
199
+ end
200
+
201
+ describe "#remember_stubs" do
202
+
203
+ it "delegates to the server facade" do
204
+ expect(server_facade).to receive(:remember_stubs)
205
+
206
+ dsl.remember_stubs
207
+ end
208
+
209
+ end
210
+
211
+ describe "#recall_stubs!" do
212
+
213
+ it "delegates to the server facade" do
214
+ expect(server_facade).to receive(:recall_stubs)
215
+
216
+ dsl.recall_stubs!
217
+ end
218
+
219
+ end
220
+
221
+ describe "#clear_stubs!" do
222
+
223
+ it "delegates to the server facade" do
224
+ expect(server_facade).to receive(:clear_stubs)
225
+
226
+ dsl.clear_stubs!
227
+ end
228
+
229
+ end
230
+
231
+ describe "#clear_activators!" do
232
+
233
+ it "delegates to the server facade" do
234
+ expect(server_facade).to receive(:clear_activators)
235
+
236
+ dsl.clear_activators!
237
+ end
238
+
239
+ end
240
+
241
+ end