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
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NTA4YjMxNzYyNGI4YTM3MzI1M2Y4YTRjYTUzOTIzZjgwMTBkODAxYQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7e6b513e163138fb09f45fcd3ad25690c0e49720
|
4
|
+
data.tar.gz: d01a275fbc644b47ca4c13f38082112ad99d9810
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YWI3YmQ1YTkxZDA0ODE1MDgzYmM1OGEyYWY5OTIyMDI4MmNmMjQ2MmI3MmQ4
|
11
|
-
NGVkNjljOThkMTkyMTYzNjRkOWNiZTljNTQ0ZDIyZGJkZGUwYjM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OGZkOTY0YWRlZDAwZjYwZGE0ODA0ZmE3YTEyNDA0ZWRmYmQzZTIwYzQwNjcw
|
14
|
-
OTE0NmNhZmUwNWYxMjliZDBiZTdiYWRkNjc5YjExMDc0YjJmOThjNzQyMGRj
|
15
|
-
YzAwZjU2N2NmMzk2ZGZjYThlNjZlOGU1YWQ2ZGYyMDE1NGI3OGQ=
|
6
|
+
metadata.gz: c73d28013f716113eeda47db419e4e4b7bd6c2c25152369ec9d9570c388e4fa7f3a8585b64314be7cca267aba2bdb11b73be2a29d492e9ab816a69544740cbd3
|
7
|
+
data.tar.gz: 4ee8e85dd25bd6c87ae6b501e6d4f9012d49d036c43c84897779e33725db7dc7eee9b71b1bd650cc01935d1665fd6029595f1784f1169baed93a292cdc27a66a
|
data/lib/http_stub.rb
CHANGED
@@ -74,7 +74,9 @@ require_relative 'http_stub/configurer/dsl/stub_builder'
|
|
74
74
|
require_relative 'http_stub/configurer/dsl/stub_builder_producer'
|
75
75
|
require_relative 'http_stub/configurer/dsl/scenario_activator'
|
76
76
|
require_relative 'http_stub/configurer/dsl/scenario_builder'
|
77
|
+
require_relative 'http_stub/configurer/dsl/endpoint_template'
|
77
78
|
require_relative 'http_stub/configurer/dsl/stub_activator_builder'
|
78
79
|
require_relative 'http_stub/configurer/dsl/server'
|
79
80
|
require_relative 'http_stub/configurer/dsl/deprecated'
|
81
|
+
require_relative 'http_stub/configurer/part'
|
80
82
|
require_relative 'http_stub/configurer'
|
data/lib/http_stub/configurer.rb
CHANGED
@@ -21,6 +21,14 @@ module HttpStub
|
|
21
21
|
@initialized = true
|
22
22
|
end
|
23
23
|
|
24
|
+
def parts=(parts)
|
25
|
+
parts.each do |name, part|
|
26
|
+
part.configure(self)
|
27
|
+
self.define_singleton_method(name) { part }
|
28
|
+
self.send(:define_method, name) { part }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
24
32
|
private
|
25
33
|
|
26
34
|
def server_facade
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module HttpStub
|
2
|
+
module Configurer
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
class EndpointTemplate
|
6
|
+
|
7
|
+
delegate :match_requests, :schema, :respond_with, :trigger, :invoke, to: :@default_stub_builder
|
8
|
+
|
9
|
+
def initialize(server, response_defaults)
|
10
|
+
@server = server
|
11
|
+
@default_stub_builder = HttpStub::Configurer::DSL::StubBuilder.new(response_defaults)
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_scenario!(name, response_overrides={}, &block)
|
15
|
+
@server.add_one_stub_scenario!(name) do |stub_builder|
|
16
|
+
stub_builder.merge!(@default_stub_builder)
|
17
|
+
stub_builder.respond_with(response_overrides)
|
18
|
+
stub_builder.invoke(&block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -36,6 +36,18 @@ module HttpStub
|
|
36
36
|
@server_facade.define_scenario(builder.build)
|
37
37
|
end
|
38
38
|
|
39
|
+
def add_one_stub_scenario!(name, &block)
|
40
|
+
add_scenario!(name) do |scenario|
|
41
|
+
scenario.add_stub! { |stub| stub.invoke(&block) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def endpoint_template(&block)
|
46
|
+
HttpStub::Configurer::DSL::EndpointTemplate.new(self, @response_defaults).tap do |template|
|
47
|
+
template.invoke(&block)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
39
51
|
def add_activator!(&block)
|
40
52
|
builder = HttpStub::Configurer::DSL::StubActivatorBuilder.new(@response_defaults)
|
41
53
|
block.call(builder)
|
@@ -3,6 +3,10 @@ module HttpStub
|
|
3
3
|
module DSL
|
4
4
|
|
5
5
|
class StubBuilder
|
6
|
+
|
7
|
+
attr_reader :request, :response, :triggers
|
8
|
+
|
9
|
+
public
|
6
10
|
|
7
11
|
def initialize(response_defaults)
|
8
12
|
@response = response_defaults ? response_defaults.clone : {}
|
@@ -28,6 +32,16 @@ module HttpStub
|
|
28
32
|
self
|
29
33
|
end
|
30
34
|
|
35
|
+
def invoke(&block)
|
36
|
+
block.arity == 0 ? self.instance_eval(&block) : block.call(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def merge!(stub_builder)
|
40
|
+
@request = (@request || {}).deep_merge(stub_builder.request || {})
|
41
|
+
self.respond_with(stub_builder.response)
|
42
|
+
self.trigger(stub_builder.triggers)
|
43
|
+
end
|
44
|
+
|
31
45
|
def build
|
32
46
|
HttpStub::Configurer::Request::Stub.new(request: @request, response: @response, triggers: @triggers)
|
33
47
|
end
|
@@ -6,7 +6,7 @@ module HttpStub
|
|
6
6
|
|
7
7
|
def build_stub(&block)
|
8
8
|
builder = HttpStub::Configurer::DSL::StubBuilder.new(@response_defaults)
|
9
|
-
|
9
|
+
builder.invoke(&block) if block_given?
|
10
10
|
builder
|
11
11
|
end
|
12
12
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module HttpStub
|
2
|
+
module Configurer
|
3
|
+
|
4
|
+
module Part
|
5
|
+
|
6
|
+
def configure(configurer)
|
7
|
+
@configurer = configurer
|
8
|
+
configure_methods = self.methods.find_all { |method| method.to_s =~ /^configure_.+_(stub|scenario)s?$/ }
|
9
|
+
configure_methods.each { |configure_method| self.send(configure_method) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(name, *args, &block)
|
13
|
+
@configurer.send(name, *args, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/http_stub/version.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
describe "Configurer Part acceptance" do
|
2
|
+
include_context "configurer integration"
|
3
|
+
|
4
|
+
context "when a configurer contains a part" do
|
5
|
+
|
6
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithParts.new }
|
7
|
+
|
8
|
+
before(:example) { configurer.class.initialize! }
|
9
|
+
|
10
|
+
context "that contains a configure stub method" do
|
11
|
+
|
12
|
+
let(:response) { issue_request("registered_in_configure_stub_method") }
|
13
|
+
|
14
|
+
it "invokes the method" do
|
15
|
+
expect(response.body).to eql("configure stub response")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
context "that contains a configure stubs methods" do
|
21
|
+
|
22
|
+
let(:response) { issue_request("registered_in_configure_stubs_method") }
|
23
|
+
|
24
|
+
it "invokes the method" do
|
25
|
+
expect(response.body).to eql("configure stubs response")
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
context "that contains a configure scenario methods" do
|
31
|
+
|
32
|
+
let(:response) { issue_request("registered_in_configure_scenario_method") }
|
33
|
+
|
34
|
+
it "invokes the method" do
|
35
|
+
expect(response.body).to eql("configure scenario response")
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
context "that contains a configure scenarios methods" do
|
41
|
+
|
42
|
+
let(:response) { issue_request("registered_in_configure_scenarios_method") }
|
43
|
+
|
44
|
+
it "invokes the method" do
|
45
|
+
expect(response.body).to eql("configure scenarios response")
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
context "that contains a part referencing another part" do
|
51
|
+
|
52
|
+
let(:response) { issue_request("registered_in_another_part") }
|
53
|
+
|
54
|
+
it "resolves the other part successfully" do
|
55
|
+
expect(response.body).to eql("response from another part")
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def issue_request(uri)
|
61
|
+
HTTParty.get("#{server_uri}/#{uri}")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
describe "Endpoint Template acceptance" do
|
2
|
+
include_context "configurer integration"
|
3
|
+
|
4
|
+
context "when a configurer contains an endpoint template" do
|
5
|
+
|
6
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithEndpointTemplate.new }
|
7
|
+
|
8
|
+
before(:example) { configurer.class.initialize! }
|
9
|
+
|
10
|
+
it "does not register a stub when the template is defined" do
|
11
|
+
response = issue_request("template_uri")
|
12
|
+
|
13
|
+
expect(response.code).to eql(404)
|
14
|
+
end
|
15
|
+
|
16
|
+
context "and a templated scenario is activated" do
|
17
|
+
|
18
|
+
before(:example) { stub_server.activate!(scenario_name) }
|
19
|
+
|
20
|
+
context "that customises the request matching rules" do
|
21
|
+
|
22
|
+
let(:scenario_name) { "custom_request" }
|
23
|
+
|
24
|
+
let(:response) { issue_request("custom_uri") }
|
25
|
+
|
26
|
+
it "registers a templated stub for the scenario" do
|
27
|
+
expect(response.code).to eql(200)
|
28
|
+
expect(response.body).to eql("template body")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context "that customises the response" do
|
34
|
+
|
35
|
+
let(:scenario_name) { "custom_response" }
|
36
|
+
|
37
|
+
let(:response) { issue_request("template_uri") }
|
38
|
+
|
39
|
+
it "registers a templated stub for the scenario" do
|
40
|
+
expect(response.code).to eql(202)
|
41
|
+
expect(response.body).to eql("custom body")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def issue_request(uri)
|
51
|
+
HTTParty.get("#{server_uri}/#{uri}")
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
describe HttpStub::Configurer::DSL::EndpointTemplate do
|
2
|
+
|
3
|
+
let(:stub_fixture) { HttpStub::StubFixture.new }
|
4
|
+
|
5
|
+
let(:server) { instance_double(HttpStub::Configurer::DSL::Server) }
|
6
|
+
let(:response_defaults) { {} }
|
7
|
+
let(:default_stub_builder) { instance_double(HttpStub::Configurer::DSL::StubBuilder) }
|
8
|
+
|
9
|
+
let(:endpoint_template) { HttpStub::Configurer::DSL::EndpointTemplate.new(server, response_defaults) }
|
10
|
+
|
11
|
+
before(:example) do
|
12
|
+
allow(HttpStub::Configurer::DSL::StubBuilder).to(
|
13
|
+
receive(:new).with(response_defaults).and_return(default_stub_builder)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#match_requests" do
|
18
|
+
|
19
|
+
let(:uri) { "/some/uri" }
|
20
|
+
let(:args) { { key: :value } }
|
21
|
+
|
22
|
+
subject { endpoint_template.match_requests(uri, args) }
|
23
|
+
|
24
|
+
it "delegates to the default stub builder" do
|
25
|
+
expect(default_stub_builder).to receive(:match_requests).with(uri, args)
|
26
|
+
|
27
|
+
subject
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#schema" do
|
33
|
+
|
34
|
+
let(:type) { :some_type }
|
35
|
+
let(:definition) { { key: :value } }
|
36
|
+
|
37
|
+
subject { endpoint_template.schema(type, definition) }
|
38
|
+
|
39
|
+
it "delegates to the default stub builder" do
|
40
|
+
expect(default_stub_builder).to receive(:schema).with(type, definition)
|
41
|
+
|
42
|
+
subject
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#respond_with" do
|
48
|
+
|
49
|
+
let(:args) { { status: 204 } }
|
50
|
+
|
51
|
+
subject { endpoint_template.respond_with(args) }
|
52
|
+
|
53
|
+
it "delegates to the default stub builder" do
|
54
|
+
expect(default_stub_builder).to receive(:respond_with).with(args)
|
55
|
+
|
56
|
+
subject
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#trigger" do
|
62
|
+
|
63
|
+
let(:trigger) { instance_double(HttpStub::Configurer::DSL::StubBuilder) }
|
64
|
+
|
65
|
+
subject { endpoint_template.trigger(trigger) }
|
66
|
+
|
67
|
+
it "delegates to the default stub builder" do
|
68
|
+
expect(default_stub_builder).to receive(:trigger).with(trigger)
|
69
|
+
|
70
|
+
subject
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#invoke" do
|
76
|
+
|
77
|
+
let(:block_verifier) { double("BlockVerifier") }
|
78
|
+
let(:block) { lambda { block_verifier.verify } }
|
79
|
+
|
80
|
+
subject { endpoint_template.invoke(&block) }
|
81
|
+
|
82
|
+
it "delegates to the default stub builder" do
|
83
|
+
expect(default_stub_builder).to receive(:invoke).and_yield
|
84
|
+
expect(block_verifier).to receive(:verify)
|
85
|
+
|
86
|
+
subject
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#add_scenario!" do
|
92
|
+
|
93
|
+
let(:name) { "some_scenario_name" }
|
94
|
+
let(:response_overrides) { {} }
|
95
|
+
let(:block_verifier) { double("BlockVerifier") }
|
96
|
+
let(:block) { lambda { block_verifier.verify } }
|
97
|
+
|
98
|
+
let(:stub_builder) { instance_double(HttpStub::Configurer::DSL::StubBuilder).as_null_object }
|
99
|
+
|
100
|
+
before(:example) { allow(server).to receive(:add_one_stub_scenario!).and_yield(stub_builder) }
|
101
|
+
|
102
|
+
subject { endpoint_template.add_scenario!(name, response_overrides, &block) }
|
103
|
+
|
104
|
+
it "add a one stub scenario to the server" do
|
105
|
+
expect(server).to receive(:add_one_stub_scenario!).with(name)
|
106
|
+
|
107
|
+
subject
|
108
|
+
end
|
109
|
+
|
110
|
+
it "merges the added stub with the default stub builder" do
|
111
|
+
expect(stub_builder).to receive(:merge!).with(default_stub_builder)
|
112
|
+
|
113
|
+
subject
|
114
|
+
end
|
115
|
+
|
116
|
+
context "when response overrides are provided" do
|
117
|
+
|
118
|
+
let(:response_overrides) { { status: 302 } }
|
119
|
+
|
120
|
+
it "informs the stub builder to respond with the response overrides" do
|
121
|
+
expect(stub_builder).to receive(:respond_with).with(response_overrides)
|
122
|
+
|
123
|
+
subject
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
context "when response overrides are not provided" do
|
129
|
+
|
130
|
+
subject { endpoint_template.add_scenario!(name, &block) }
|
131
|
+
|
132
|
+
it "does not change the stub builder by requesting it respond with an empty hash" do
|
133
|
+
expect(stub_builder).to receive(:respond_with).with({})
|
134
|
+
|
135
|
+
subject
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
it "merges the response defaults before applying the response overrides" do
|
141
|
+
expect(stub_builder).to receive(:merge!).ordered
|
142
|
+
expect(stub_builder).to receive(:respond_with).ordered
|
143
|
+
|
144
|
+
subject
|
145
|
+
end
|
146
|
+
|
147
|
+
it "requests the added stub builder invoke the provided block" do
|
148
|
+
expect(stub_builder).to receive(:invoke).and_yield
|
149
|
+
expect(block_verifier).to receive(:verify)
|
150
|
+
|
151
|
+
subject
|
152
|
+
end
|
153
|
+
|
154
|
+
it "applies the response overrides before invoking the provided block" do
|
155
|
+
expect(stub_builder).to receive(:respond_with).ordered
|
156
|
+
expect(stub_builder).to receive(:invoke).ordered
|
157
|
+
|
158
|
+
subject
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|