http_stub 0.16.0.pre1 → 0.17.0.pre1
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 +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
@@ -21,6 +21,7 @@ describe HttpStub::Server::Stub::Instance do
|
|
21
21
|
"method" => "post",
|
22
22
|
"headers" => { "triggered_header" => "triggered_header_value" },
|
23
23
|
"parameters" => { "triggered_parameter" => "triggered_parameter_value" },
|
24
|
+
"body" => { "schema" => { "json" => "trigger schema definition" } },
|
24
25
|
"response" => {
|
25
26
|
"status" => 203,
|
26
27
|
"body" => "Triggered body"
|
@@ -33,6 +34,7 @@ describe HttpStub::Server::Stub::Instance do
|
|
33
34
|
"method" => stub_method,
|
34
35
|
"headers" => request_header_payload,
|
35
36
|
"parameters" => request_parameter_payload,
|
37
|
+
"body" => { "schema" => { "json" => "stub schema definition" } },
|
36
38
|
"response" => {
|
37
39
|
"status" => 201,
|
38
40
|
"body" => "Some body"
|
@@ -44,6 +46,7 @@ describe HttpStub::Server::Stub::Instance do
|
|
44
46
|
let(:uri) { instance_double(HttpStub::Server::Stub::Uri, match?: true) }
|
45
47
|
let(:request_headers) { instance_double(HttpStub::Server::Stub::RequestHeaders, match?: true) }
|
46
48
|
let(:request_parameters) { instance_double(HttpStub::Server::Stub::RequestParameters, match?: true) }
|
49
|
+
let(:request_body) { double("HttpStub::Server::Stub::SomeRequestBody", match?: true) }
|
47
50
|
let(:response) { instance_double(HttpStub::Server::Stub::Response::Base) }
|
48
51
|
let(:triggers) { instance_double(HttpStub::Server::Stub::Triggers) }
|
49
52
|
|
@@ -54,6 +57,7 @@ describe HttpStub::Server::Stub::Instance do
|
|
54
57
|
allow(HttpStub::Server::Stub::Uri).to receive(:new).and_return(uri)
|
55
58
|
allow(HttpStub::Server::Stub::RequestHeaders).to receive(:new).and_return(request_headers)
|
56
59
|
allow(HttpStub::Server::Stub::RequestParameters).to receive(:new).and_return(request_parameters)
|
60
|
+
allow(HttpStub::Server::Stub::RequestBody).to receive(:create).and_return(request_body)
|
57
61
|
allow(HttpStub::Server::Stub::Response).to receive(:create).and_return(response)
|
58
62
|
allow(HttpStub::Server::Stub::Triggers).to receive(:new).and_return(triggers)
|
59
63
|
end
|
@@ -64,6 +68,8 @@ describe HttpStub::Server::Stub::Instance do
|
|
64
68
|
let(:request_uri) { "/a_request_uri" }
|
65
69
|
let(:request) { instance_double(Rack::Request, :request_method => request_method_payload) }
|
66
70
|
|
71
|
+
subject { the_stub.satisfies?(request) }
|
72
|
+
|
67
73
|
describe "when the request uri matches" do
|
68
74
|
|
69
75
|
before(:example) { allow(uri).to receive(:match?).with(request).and_return(true) }
|
@@ -82,8 +88,18 @@ describe HttpStub::Server::Stub::Instance do
|
|
82
88
|
|
83
89
|
before(:example) { allow(request_parameters).to receive(:match?).with(request).and_return(true) }
|
84
90
|
|
85
|
-
|
86
|
-
|
91
|
+
describe "and a body match is configured" do
|
92
|
+
|
93
|
+
describe "that matches" do
|
94
|
+
|
95
|
+
before(:example) { allow(request_body).to receive(:match?).with(request).and_return(true) }
|
96
|
+
|
97
|
+
it "returns true" do
|
98
|
+
expect(subject).to be(true)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
87
103
|
end
|
88
104
|
|
89
105
|
end
|
@@ -98,22 +114,22 @@ describe HttpStub::Server::Stub::Instance do
|
|
98
114
|
|
99
115
|
end
|
100
116
|
|
101
|
-
describe "when the request
|
117
|
+
describe "when the request uri does not match" do
|
102
118
|
|
103
|
-
before(:example) { allow(
|
119
|
+
before(:example) { allow(uri).to receive(:match?).with(request).and_return(false) }
|
104
120
|
|
105
121
|
it "returns false" do
|
106
|
-
expect(
|
122
|
+
expect(subject).to be(false)
|
107
123
|
end
|
108
124
|
|
109
125
|
end
|
110
126
|
|
111
|
-
describe "when the request
|
127
|
+
describe "when the request method does not match" do
|
112
128
|
|
113
|
-
before(:example) { allow(
|
129
|
+
before(:example) { allow(stub_method).to receive(:match?).with(request).and_return(false) }
|
114
130
|
|
115
131
|
it "returns false" do
|
116
|
-
expect(
|
132
|
+
expect(subject).to be(false)
|
117
133
|
end
|
118
134
|
|
119
135
|
end
|
@@ -123,7 +139,7 @@ describe HttpStub::Server::Stub::Instance do
|
|
123
139
|
before(:example) { allow(request_headers).to receive(:match?).with(request).and_return(false) }
|
124
140
|
|
125
141
|
it "returns false" do
|
126
|
-
expect(
|
142
|
+
expect(subject).to be(false)
|
127
143
|
end
|
128
144
|
|
129
145
|
end
|
@@ -133,7 +149,17 @@ describe HttpStub::Server::Stub::Instance do
|
|
133
149
|
before(:example) { allow(request_parameters).to receive(:match?).with(request).and_return(false) }
|
134
150
|
|
135
151
|
it "returns false" do
|
136
|
-
expect(
|
152
|
+
expect(subject).to be(false)
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "when the bodies do not match" do
|
158
|
+
|
159
|
+
before(:example) { allow(request_body).to receive(:match?).with(request).and_return(false) }
|
160
|
+
|
161
|
+
it "returns false" do
|
162
|
+
expect(subject).to be(false)
|
137
163
|
end
|
138
164
|
|
139
165
|
end
|
@@ -172,6 +198,14 @@ describe HttpStub::Server::Stub::Instance do
|
|
172
198
|
|
173
199
|
end
|
174
200
|
|
201
|
+
describe "#body" do
|
202
|
+
|
203
|
+
it "returns the body model encapsulating the body provided in the request body" do
|
204
|
+
expect(the_stub.body).to eql(request_body)
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
175
209
|
describe "#response" do
|
176
210
|
|
177
211
|
it "exposes the response model encapsulating the response provided in the request body" do
|
@@ -0,0 +1,102 @@
|
|
1
|
+
describe HttpStub::Server::Stub::JsonRequestBody do
|
2
|
+
|
3
|
+
let(:stubbed_schema_definition) { { "type" => "object", "properties" => { "some_property" => "some_type" } } }
|
4
|
+
|
5
|
+
let(:json_request_body) { HttpStub::Server::Stub::JsonRequestBody.new(stubbed_schema_definition) }
|
6
|
+
|
7
|
+
describe "#match?" do
|
8
|
+
|
9
|
+
let(:logger) { double("Logger").as_null_object }
|
10
|
+
let(:raw_request_body) { { "some_json_property" => "some_json_value" }.to_json }
|
11
|
+
let(:request_body) { double("RackRequestBody", read: raw_request_body) }
|
12
|
+
let(:request) { instance_double(Rack::Request, logger: logger, body: request_body) }
|
13
|
+
|
14
|
+
let(:validation_errors) { [] }
|
15
|
+
|
16
|
+
subject { json_request_body.match?(request) }
|
17
|
+
|
18
|
+
before(:example) { allow(JSON::Validator).to receive(:fully_validate).and_return(validation_errors) }
|
19
|
+
|
20
|
+
it "validates the request body using the stubbed schema definition" do
|
21
|
+
expect(JSON::Validator).to receive(:fully_validate).with(stubbed_schema_definition, raw_request_body, anything)
|
22
|
+
|
23
|
+
subject
|
24
|
+
end
|
25
|
+
|
26
|
+
it "validates against raw JSON" do
|
27
|
+
expect(JSON::Validator).to receive(:fully_validate).with(anything, anything, hash_including(json: true))
|
28
|
+
|
29
|
+
subject
|
30
|
+
end
|
31
|
+
|
32
|
+
it "ensures the schema definition is valid" do
|
33
|
+
expect(JSON::Validator).to(
|
34
|
+
receive(:fully_validate).with(anything, anything, hash_including(validate_schema: true))
|
35
|
+
)
|
36
|
+
|
37
|
+
subject
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when body is valid" do
|
41
|
+
|
42
|
+
let(:validation_errors) { [] }
|
43
|
+
|
44
|
+
it "returns true" do
|
45
|
+
expect(subject).to be(true)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "logs nothing" do
|
49
|
+
expect(logger).not_to receive(:info)
|
50
|
+
|
51
|
+
subject
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when the body is invalid" do
|
57
|
+
|
58
|
+
let(:validation_errors) { (1..3).map { |i| "The property '#/#{i}' failed validation"} }
|
59
|
+
|
60
|
+
it "returns false" do
|
61
|
+
expect(subject).to be(false)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "logs each validation error" do
|
65
|
+
validation_errors.each { |validation_error| expect(logger).to receive(:info).with(validation_error) }
|
66
|
+
|
67
|
+
subject
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when an error occurs validating the body" do
|
73
|
+
|
74
|
+
let(:error) { JSON::ParserError.new }
|
75
|
+
|
76
|
+
before(:example) { allow(JSON::Validator).to receive(:fully_validate).and_raise(JSON::ParserError.new) }
|
77
|
+
|
78
|
+
it "returns false" do
|
79
|
+
expect(subject).to be(false)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "logs the error" do
|
83
|
+
expect(logger).to receive(:info).with(error.message)
|
84
|
+
|
85
|
+
subject
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#to_s" do
|
93
|
+
|
94
|
+
subject { json_request_body.to_s }
|
95
|
+
|
96
|
+
it "returns the JSON representation of the schema definition" do
|
97
|
+
expect(subject).to eql(stubbed_schema_definition.to_json)
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
describe HttpStub::Server::Stub::RequestBody do
|
2
|
+
|
3
|
+
describe "::create" do
|
4
|
+
|
5
|
+
subject { HttpStub::Server::Stub::RequestBody.create(stubbed_body) }
|
6
|
+
|
7
|
+
shared_context "a raw request body that causes a simple request body to be created" do
|
8
|
+
|
9
|
+
it "creates a simple request body with the body" do
|
10
|
+
expect(HttpStub::Server::Stub::SimpleRequestBody).to receive(:new).with(stubbed_body)
|
11
|
+
|
12
|
+
subject
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns the created request body" do
|
16
|
+
simple_request_body = instance_double(HttpStub::Server::Stub::SimpleRequestBody)
|
17
|
+
allow(HttpStub::Server::Stub::SimpleRequestBody).to receive(:new).and_return(simple_request_body)
|
18
|
+
|
19
|
+
expect(subject).to eql(simple_request_body)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the stubbed body contains a schema" do
|
25
|
+
|
26
|
+
let(:stubbed_body) { { "schema" => raw_schema } }
|
27
|
+
|
28
|
+
context "that is JSON" do
|
29
|
+
|
30
|
+
let(:json_schema) { "some json schema" }
|
31
|
+
let(:raw_schema) { { "type" => "json", "definition" => json_schema } }
|
32
|
+
|
33
|
+
it "creates a JSON request body with the schema" do
|
34
|
+
expect(HttpStub::Server::Stub::JsonRequestBody).to receive(:new).with(json_schema)
|
35
|
+
|
36
|
+
subject
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns the created request body" do
|
40
|
+
json_request_body = instance_double(HttpStub::Server::Stub::JsonRequestBody)
|
41
|
+
allow(HttpStub::Server::Stub::JsonRequestBody).to receive(:new).and_return(json_request_body)
|
42
|
+
|
43
|
+
expect(subject).to eql(json_request_body)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
context "that is not JSON" do
|
49
|
+
|
50
|
+
let(:raw_schema) { { "type" => "xml", "definition" => "some xml schema" } }
|
51
|
+
|
52
|
+
it "raises an error indicating the body is invalid" do
|
53
|
+
expect { subject }.to(
|
54
|
+
raise_error("Stub request body schema #{raw_schema} is invalid: xml schema is not supported")
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context "that does not have a type" do
|
61
|
+
|
62
|
+
let(:raw_schema) { { "definition" => "some defintion" } }
|
63
|
+
|
64
|
+
it "raises an error indicating the body is invalid" do
|
65
|
+
expect { subject }.to raise_error("Stub request body schema #{raw_schema} is invalid: type expected")
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
context "that does not have a definition" do
|
71
|
+
|
72
|
+
let(:raw_schema) { { "type" => "some type" } }
|
73
|
+
|
74
|
+
it "raises an error indicating the body is invalid" do
|
75
|
+
expect { subject }.to raise_error("Stub request body schema #{raw_schema} is invalid: definition expected")
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when the stubbed body contains a string" do
|
83
|
+
|
84
|
+
let(:stubbed_body) { "some string" }
|
85
|
+
|
86
|
+
it_behaves_like "a raw request body that causes a simple request body to be created"
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when the stubbed body contains a regular expression control value" do
|
91
|
+
|
92
|
+
let(:stubbed_body) { "regexp:some regex" }
|
93
|
+
|
94
|
+
it_behaves_like "a raw request body that causes a simple request body to be created"
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when the stubbed body is empty" do
|
99
|
+
|
100
|
+
let(:stubbed_body) { "" }
|
101
|
+
|
102
|
+
it "returns a truthy request matcher" do
|
103
|
+
expect(subject).to eql(HttpStub::Server::Stub::TruthyRequestMatcher)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
context "when the stubbed body is nil" do
|
109
|
+
|
110
|
+
let(:stubbed_body) { nil }
|
111
|
+
|
112
|
+
it "returns a truthy request matcher" do
|
113
|
+
expect(subject).to eql(HttpStub::Server::Stub::TruthyRequestMatcher)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe HttpStub::Server::Stub::SimpleRequestBody do
|
2
|
+
|
3
|
+
let(:raw_body) { "some body" }
|
4
|
+
let(:value_matcher) { instance_double(HttpStub::Server::Stub::StringValueMatcher).as_null_object }
|
5
|
+
|
6
|
+
let(:simple_request_body) { HttpStub::Server::Stub::SimpleRequestBody.new(raw_body) }
|
7
|
+
|
8
|
+
before(:example) { allow(HttpStub::Server::Stub::StringValueMatcher).to receive(:new).and_return(value_matcher) }
|
9
|
+
|
10
|
+
describe "constructor" do
|
11
|
+
|
12
|
+
it "creates a value matcher for the provided body" do
|
13
|
+
expect(HttpStub::Server::Stub::StringValueMatcher).to receive(:new).with(raw_body)
|
14
|
+
|
15
|
+
simple_request_body
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#match?" do
|
21
|
+
|
22
|
+
let(:request_body) { "some request body" }
|
23
|
+
let(:request) { instance_double(Rack::Request, body: double("Rack::Body", read: request_body)) }
|
24
|
+
|
25
|
+
it "delegates to the value matcher to match the request body" do
|
26
|
+
expect(value_matcher).to receive(:match?).with(request_body).and_return(true)
|
27
|
+
|
28
|
+
expect(simple_request_body.match?(request)).to be(true)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#to_s" do
|
34
|
+
|
35
|
+
it "delegates to the value matcher representation of the provided body" do
|
36
|
+
expect(value_matcher).to receive(:to_s).and_return("some value matcher string")
|
37
|
+
|
38
|
+
expect(simple_request_body.to_s).to eql("some value matcher string")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -65,7 +65,7 @@ describe HttpStub::Server::Stub::StringValueMatcher do
|
|
65
65
|
let(:stub_value) { "some stub value" }
|
66
66
|
let(:expected_stub_match_value) { "some stub value" }
|
67
67
|
|
68
|
-
|
68
|
+
it_behaves_like "a StringValueMatcher that matches an expected stub value"
|
69
69
|
|
70
70
|
end
|
71
71
|
|
@@ -74,7 +74,7 @@ describe HttpStub::Server::Stub::StringValueMatcher do
|
|
74
74
|
let(:stub_value) { 88 }
|
75
75
|
let(:expected_stub_match_value) { "88" }
|
76
76
|
|
77
|
-
|
77
|
+
it_behaves_like "a StringValueMatcher that matches an expected stub value"
|
78
78
|
|
79
79
|
end
|
80
80
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe HttpStub::Server::Stub::TruthyRequestMatcher do
|
2
|
+
|
3
|
+
let(:truthy_request_matcher) { HttpStub::Server::Stub::TruthyRequestMatcher }
|
4
|
+
|
5
|
+
describe "::match?" do
|
6
|
+
|
7
|
+
let(:request) { instance_double(Rack::Request) }
|
8
|
+
|
9
|
+
it "returns true" do
|
10
|
+
expect(truthy_request_matcher.match?(request)).to be(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "::to_s" do
|
16
|
+
|
17
|
+
it "returns an empty string" do
|
18
|
+
expect(truthy_request_matcher.to_s).to eql("")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -25,7 +25,7 @@ describe HttpStub::Server::Stub::Uri do
|
|
25
25
|
it "delegates to the value matcher representation of the provided uri" do
|
26
26
|
expect(value_matcher).to receive(:match?).with(request_uri).and_return(true)
|
27
27
|
|
28
|
-
expect(uri.match?(request)).to
|
28
|
+
expect(uri.match?(request)).to be(true)
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|