webmock 3.7.1
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 +7 -0
- data/.gemtest +0 -0
- data/.gitignore +34 -0
- data/.rspec-tm +2 -0
- data/.travis.yml +19 -0
- data/CHANGELOG.md +1698 -0
- data/Gemfile +9 -0
- data/LICENSE +20 -0
- data/README.md +1125 -0
- data/Rakefile +28 -0
- data/lib/webmock.rb +59 -0
- data/lib/webmock/api.rb +109 -0
- data/lib/webmock/assertion_failure.rb +11 -0
- data/lib/webmock/callback_registry.rb +35 -0
- data/lib/webmock/config.rb +18 -0
- data/lib/webmock/cucumber.rb +10 -0
- data/lib/webmock/deprecation.rb +9 -0
- data/lib/webmock/errors.rb +17 -0
- data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +214 -0
- data/lib/webmock/http_lib_adapters/curb_adapter.rb +347 -0
- data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +228 -0
- data/lib/webmock/http_lib_adapters/excon_adapter.rb +162 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
- data/lib/webmock/http_lib_adapters/http_rb/client.rb +14 -0
- data/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
- data/lib/webmock/http_lib_adapters/http_rb/response.rb +43 -0
- data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +29 -0
- data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +68 -0
- data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +37 -0
- data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +242 -0
- data/lib/webmock/http_lib_adapters/manticore_adapter.rb +130 -0
- data/lib/webmock/http_lib_adapters/net_http.rb +361 -0
- data/lib/webmock/http_lib_adapters/net_http_response.rb +34 -0
- data/lib/webmock/http_lib_adapters/patron_adapter.rb +130 -0
- data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +174 -0
- data/lib/webmock/matchers/any_arg_matcher.rb +13 -0
- data/lib/webmock/matchers/hash_argument_matcher.rb +21 -0
- data/lib/webmock/matchers/hash_excluding_matcher.rb +15 -0
- data/lib/webmock/matchers/hash_including_matcher.rb +17 -0
- data/lib/webmock/minitest.rb +41 -0
- data/lib/webmock/rack_response.rb +69 -0
- data/lib/webmock/request_body_diff.rb +64 -0
- data/lib/webmock/request_execution_verifier.rb +77 -0
- data/lib/webmock/request_pattern.rb +370 -0
- data/lib/webmock/request_registry.rb +35 -0
- data/lib/webmock/request_signature.rb +54 -0
- data/lib/webmock/request_signature_snippet.rb +61 -0
- data/lib/webmock/request_stub.rb +100 -0
- data/lib/webmock/response.rb +153 -0
- data/lib/webmock/responses_sequence.rb +40 -0
- data/lib/webmock/rspec.rb +41 -0
- data/lib/webmock/rspec/matchers.rb +27 -0
- data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +78 -0
- data/lib/webmock/rspec/matchers/webmock_matcher.rb +67 -0
- data/lib/webmock/stub_registry.rb +67 -0
- data/lib/webmock/stub_request_snippet.rb +38 -0
- data/lib/webmock/test_unit.rb +22 -0
- data/lib/webmock/util/hash_counter.rb +39 -0
- data/lib/webmock/util/hash_keys_stringifier.rb +25 -0
- data/lib/webmock/util/hash_validator.rb +17 -0
- data/lib/webmock/util/headers.rb +64 -0
- data/lib/webmock/util/json.rb +67 -0
- data/lib/webmock/util/query_mapper.rb +281 -0
- data/lib/webmock/util/uri.rb +110 -0
- data/lib/webmock/util/values_stringifier.rb +20 -0
- data/lib/webmock/util/version_checker.rb +111 -0
- data/lib/webmock/version.rb +3 -0
- data/lib/webmock/webmock.rb +161 -0
- data/minitest/test_helper.rb +34 -0
- data/minitest/test_webmock.rb +9 -0
- data/minitest/webmock_spec.rb +60 -0
- data/spec/acceptance/async_http_client/async_http_client_spec.rb +349 -0
- data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +73 -0
- data/spec/acceptance/curb/curb_spec.rb +492 -0
- data/spec/acceptance/curb/curb_spec_helper.rb +147 -0
- data/spec/acceptance/em_http_request/em_http_request_spec.rb +406 -0
- data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +77 -0
- data/spec/acceptance/excon/excon_spec.rb +77 -0
- data/spec/acceptance/excon/excon_spec_helper.rb +50 -0
- data/spec/acceptance/http_rb/http_rb_spec.rb +82 -0
- data/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
- data/spec/acceptance/httpclient/httpclient_spec.rb +217 -0
- data/spec/acceptance/httpclient/httpclient_spec_helper.rb +57 -0
- data/spec/acceptance/manticore/manticore_spec.rb +56 -0
- data/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
- data/spec/acceptance/net_http/net_http_shared.rb +153 -0
- data/spec/acceptance/net_http/net_http_spec.rb +331 -0
- data/spec/acceptance/net_http/net_http_spec_helper.rb +64 -0
- data/spec/acceptance/net_http/real_net_http_spec.rb +20 -0
- data/spec/acceptance/patron/patron_spec.rb +125 -0
- data/spec/acceptance/patron/patron_spec_helper.rb +54 -0
- data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +313 -0
- data/spec/acceptance/shared/callbacks.rb +148 -0
- data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +36 -0
- data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +95 -0
- data/spec/acceptance/shared/precedence_of_stubs.rb +15 -0
- data/spec/acceptance/shared/request_expectations.rb +930 -0
- data/spec/acceptance/shared/returning_declared_responses.rb +409 -0
- data/spec/acceptance/shared/stubbing_requests.rb +643 -0
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +135 -0
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +60 -0
- data/spec/acceptance/webmock_shared.rb +41 -0
- data/spec/fixtures/test.txt +1 -0
- data/spec/quality_spec.rb +84 -0
- data/spec/spec_helper.rb +48 -0
- data/spec/support/example_curl_output.txt +22 -0
- data/spec/support/failures.rb +9 -0
- data/spec/support/my_rack_app.rb +53 -0
- data/spec/support/network_connection.rb +19 -0
- data/spec/support/webmock_server.rb +70 -0
- data/spec/unit/api_spec.rb +175 -0
- data/spec/unit/errors_spec.rb +129 -0
- data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +17 -0
- data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
- data/spec/unit/matchers/hash_excluding_matcher_spec.rb +61 -0
- data/spec/unit/matchers/hash_including_matcher_spec.rb +87 -0
- data/spec/unit/rack_response_spec.rb +112 -0
- data/spec/unit/request_body_diff_spec.rb +90 -0
- data/spec/unit/request_execution_verifier_spec.rb +208 -0
- data/spec/unit/request_pattern_spec.rb +601 -0
- data/spec/unit/request_registry_spec.rb +95 -0
- data/spec/unit/request_signature_snippet_spec.rb +89 -0
- data/spec/unit/request_signature_spec.rb +155 -0
- data/spec/unit/request_stub_spec.rb +199 -0
- data/spec/unit/response_spec.rb +282 -0
- data/spec/unit/stub_registry_spec.rb +103 -0
- data/spec/unit/stub_request_snippet_spec.rb +115 -0
- data/spec/unit/util/hash_counter_spec.rb +39 -0
- data/spec/unit/util/hash_keys_stringifier_spec.rb +27 -0
- data/spec/unit/util/headers_spec.rb +28 -0
- data/spec/unit/util/json_spec.rb +33 -0
- data/spec/unit/util/query_mapper_spec.rb +157 -0
- data/spec/unit/util/uri_spec.rb +361 -0
- data/spec/unit/util/version_checker_spec.rb +65 -0
- data/spec/unit/webmock_spec.rb +19 -0
- data/test/http_request.rb +24 -0
- data/test/shared_test.rb +108 -0
- data/test/test_helper.rb +23 -0
- data/test/test_webmock.rb +6 -0
- data/webmock.gemspec +45 -0
- metadata +496 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'timeout'
|
|
2
|
+
require 'socket'
|
|
3
|
+
|
|
4
|
+
module NetworkConnection
|
|
5
|
+
def self.connect_to(host, port, timeout=10)
|
|
6
|
+
Timeout.timeout(timeout) do
|
|
7
|
+
TCPSocket.new(host, port)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.is_network_available?
|
|
12
|
+
begin
|
|
13
|
+
self.connect_to("8.8.8.8", 53, 5)
|
|
14
|
+
true
|
|
15
|
+
rescue
|
|
16
|
+
false
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'webrick'
|
|
2
|
+
require 'logger'
|
|
3
|
+
require 'singleton'
|
|
4
|
+
|
|
5
|
+
class WebMockServer
|
|
6
|
+
include Singleton
|
|
7
|
+
|
|
8
|
+
attr_reader :port, :started
|
|
9
|
+
|
|
10
|
+
def host_with_port
|
|
11
|
+
"localhost:#{port}"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def concurrent
|
|
15
|
+
unless RUBY_PLATFORM =~ /java/
|
|
16
|
+
@pid = Process.fork do
|
|
17
|
+
yield
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
Thread.new { yield }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def start
|
|
25
|
+
@started = true
|
|
26
|
+
server = WEBrick::GenericServer.new(Port: 0, Logger: Logger.new("/dev/null"))
|
|
27
|
+
server.logger.level = 0
|
|
28
|
+
@port = server.config[:Port]
|
|
29
|
+
|
|
30
|
+
concurrent do
|
|
31
|
+
['TERM', 'INT'].each do |signal|
|
|
32
|
+
trap(signal) do
|
|
33
|
+
Thread.new do
|
|
34
|
+
server.shutdown
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
server.start do |socket|
|
|
39
|
+
socket.read(1)
|
|
40
|
+
socket.puts <<-EOT.gsub(/^\s+\|/, '')
|
|
41
|
+
|HTTP/1.1 200 OK\r
|
|
42
|
+
|Date: Fri, 31 Dec 1999 23:59:59 GMT\r
|
|
43
|
+
|Content-Type: text/html\r
|
|
44
|
+
|Content-Length: 11\r
|
|
45
|
+
|Set-Cookie: bar\r
|
|
46
|
+
|Set-Cookie: foo\r
|
|
47
|
+
|\r
|
|
48
|
+
|hello world
|
|
49
|
+
EOT
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
loop do
|
|
55
|
+
begin
|
|
56
|
+
TCPSocket.new("localhost", port)
|
|
57
|
+
sleep 0.1
|
|
58
|
+
break
|
|
59
|
+
rescue Errno::ECONNREFUSED
|
|
60
|
+
sleep 0.1
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def stop
|
|
66
|
+
if @pid
|
|
67
|
+
Process.kill('INT', @pid)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe WebMock::API do
|
|
4
|
+
describe '#hash_including' do
|
|
5
|
+
subject { klass.new.hash_including(args) }
|
|
6
|
+
let(:args) { { data: :one } }
|
|
7
|
+
|
|
8
|
+
context 'when mixed into a class that does not define `hash_including`' do
|
|
9
|
+
let(:klass) do
|
|
10
|
+
Class.new do
|
|
11
|
+
include WebMock::API
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'uses WebMock::Matchers::HashIncludingMatcher' do
|
|
16
|
+
expect(subject).to be_a(WebMock::Matchers::HashIncludingMatcher)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# by testing equality for HashIncludingMatcher (which stringifies the passed hash) we are
|
|
20
|
+
# testing HashIncludingMatcher.initialize behavior as well
|
|
21
|
+
context "when args correspond to an hash" do
|
|
22
|
+
it "creates 'HashIncludingMatcher'" do
|
|
23
|
+
expect(subject).to eq("data" => :one)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "when args are one or many keys" do
|
|
28
|
+
subject {klass.new.hash_including(:foo, :bar)}
|
|
29
|
+
let(:anything) { WebMock::Matchers::AnyArgMatcher.new(nil) }
|
|
30
|
+
|
|
31
|
+
it "creates 'HashIncludingMatcher' with keys anythingized" do
|
|
32
|
+
expect(subject).to eq("foo" => anything, "bar" => anything )
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when args are both keys and key/value pairs" do
|
|
37
|
+
subject {klass.new.hash_including(:foo, :bar, data: :one)}
|
|
38
|
+
let(:anything) { WebMock::Matchers::AnyArgMatcher.new(nil) }
|
|
39
|
+
|
|
40
|
+
it "creates 'HashIncludingMatcher' with keys anythingized" do
|
|
41
|
+
expect(subject).to eq("foo" => anything, "bar" => anything, "data" => :one)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context "when args are an empty hash" do
|
|
46
|
+
subject {klass.new.hash_including({})}
|
|
47
|
+
|
|
48
|
+
it "creates 'HashIncludingMatcher' with an empty hash" do
|
|
49
|
+
expect(subject).to eq({})
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
context 'when mixed into a class with a parent that defines `hash_including`' do
|
|
56
|
+
subject { klass.new.hash_including(*args) }
|
|
57
|
+
let(:args) { %w(:foo, :bar, {:data => :one}) }
|
|
58
|
+
let(:klass) do
|
|
59
|
+
Class.new(
|
|
60
|
+
Class.new do
|
|
61
|
+
def hash_including(*args)
|
|
62
|
+
args
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
) { include WebMock::API }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'uses super and passes the args untampered' do
|
|
69
|
+
expect(subject).to eq(args)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe '#hash_excluding' do
|
|
75
|
+
subject { klass.new.hash_excluding(args) }
|
|
76
|
+
let(:args) { { data: :one } }
|
|
77
|
+
|
|
78
|
+
context 'when mixed into a class that does not define `hash_including`' do
|
|
79
|
+
let(:klass) do
|
|
80
|
+
Class.new do
|
|
81
|
+
include WebMock::API
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'uses WebMock::Matchers::HashIncludingMatcher' do
|
|
86
|
+
expect(subject).to be_a(WebMock::Matchers::HashExcludingMatcher)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# by testing equality for HashIncludingMatcher (which stringifies the passed hash) we are
|
|
90
|
+
# testing HashIncludingMatcher.initialize behavior as well
|
|
91
|
+
context 'when args correspond to an hash' do
|
|
92
|
+
context 'creates "HashExcludingMatcher"' do
|
|
93
|
+
it 'equals hash with similar key but different value' do
|
|
94
|
+
expect(subject).to eq('data' => :two)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'equals hash with similar value but different key' do
|
|
98
|
+
expect(subject).to eq('data2' => :one)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'equals hash with defferent value and key' do
|
|
102
|
+
expect(subject).to eq('data2' => :two)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'not equals with similar value and key' do
|
|
106
|
+
expect(subject).not_to eq('data' => :one)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context 'when args are one or many keys' do
|
|
112
|
+
subject { klass.new.hash_excluding(:foo, :bar) }
|
|
113
|
+
let(:anything) { WebMock::Matchers::AnyArgMatcher.new(nil) }
|
|
114
|
+
|
|
115
|
+
it "creates 'HashExcludingMatcher' with keys anythingized" do
|
|
116
|
+
expect(subject).not_to eq('foo' => anything, 'bar' => anything )
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context 'when args are both keys and key/value pairs' do
|
|
121
|
+
subject { klass.new.hash_excluding(:foo, :bar, data: :one) }
|
|
122
|
+
let(:anything) { WebMock::Matchers::AnyArgMatcher.new(nil) }
|
|
123
|
+
|
|
124
|
+
it 'creates "HashExcludingMatcher" with keys anythingized' do
|
|
125
|
+
expect(subject).not_to eq('foo' => anything, 'bar' => anything, 'data' => :one)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context 'when args are an empty hash' do
|
|
130
|
+
subject { klass.new.hash_excluding({}) }
|
|
131
|
+
|
|
132
|
+
it 'creates "HashExcludingMatcher" with an empty hash' do
|
|
133
|
+
expect(subject).to eq({})
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context 'when mixed into a class with a parent that defines `hash_excluding`' do
|
|
139
|
+
subject { klass.new.hash_excluding(*args) }
|
|
140
|
+
let(:args) { %w(:foo, :bar, {:data => :one}) }
|
|
141
|
+
let(:klass) do
|
|
142
|
+
Class.new(
|
|
143
|
+
Class.new do
|
|
144
|
+
def hash_excluding(*args)
|
|
145
|
+
args
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
) { include WebMock::API }
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'uses super and passes the args untampered' do
|
|
152
|
+
expect(subject).to eq(args)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
describe '#reset_executed_requests!' do
|
|
158
|
+
subject { WebMock::API.reset_executed_requests! }
|
|
159
|
+
|
|
160
|
+
let(:request_signature) { WebMock::RequestSignature.new(:get, "www.example.com") }
|
|
161
|
+
let(:request_pattern) { WebMock::RequestPattern.new(:get, "www.example.com") }
|
|
162
|
+
|
|
163
|
+
before do
|
|
164
|
+
WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it 'resets request registry counter' do
|
|
168
|
+
expect{
|
|
169
|
+
subject
|
|
170
|
+
}.to change{
|
|
171
|
+
WebMock::RequestRegistry.instance.times_executed(request_pattern)
|
|
172
|
+
}.from(1).to(0)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "errors" do
|
|
4
|
+
describe WebMock::NetConnectNotAllowedError do
|
|
5
|
+
describe "message" do
|
|
6
|
+
it "should have message with request signature and snippet" do
|
|
7
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
8
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
9
|
+
with(request_stub).and_return(stub_result)
|
|
10
|
+
|
|
11
|
+
expected = \
|
|
12
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
13
|
+
"\n\nYou can stub this request with the following snippet:" \
|
|
14
|
+
"\n\n#{stub_result}" \
|
|
15
|
+
"\n\n============================================================"
|
|
16
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should have message with registered stubs if available" do
|
|
20
|
+
allow(WebMock::StubRegistry.instance).to receive(:request_stubs).and_return([request_stub])
|
|
21
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
22
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
23
|
+
with(request_stub).and_return(stub_result)
|
|
24
|
+
allow_any_instance_of(WebMock::RequestBodyDiff).to receive(:body_diff).and_return({})
|
|
25
|
+
|
|
26
|
+
expected = \
|
|
27
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
28
|
+
"\n\nYou can stub this request with the following snippet:" \
|
|
29
|
+
"\n\n#{stub_result}" \
|
|
30
|
+
"\n\nregistered request stubs:" \
|
|
31
|
+
"\n\n#{stub_result}" \
|
|
32
|
+
"\n\n============================================================"
|
|
33
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should not be caught by a rescue block without arguments" do
|
|
37
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
38
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
39
|
+
with(request_stub).and_return(stub_result)
|
|
40
|
+
|
|
41
|
+
exception = WebMock::NetConnectNotAllowedError.new(request_signature)
|
|
42
|
+
|
|
43
|
+
expect do
|
|
44
|
+
begin
|
|
45
|
+
raise exception
|
|
46
|
+
rescue
|
|
47
|
+
raise "exception should not be caught"
|
|
48
|
+
end
|
|
49
|
+
end.to raise_exception exception
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should print body diff if available" do
|
|
53
|
+
allow(WebMock::StubRegistry.instance).to receive(:request_stubs).and_return([request_stub])
|
|
54
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
55
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
56
|
+
with(request_stub).and_return(stub_result)
|
|
57
|
+
allow_any_instance_of(WebMock::RequestBodyDiff).to receive(:body_diff).and_return(body_diff)
|
|
58
|
+
expected = \
|
|
59
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
60
|
+
"\n\nYou can stub this request with the following snippet:" \
|
|
61
|
+
"\n\n#{stub_result}" \
|
|
62
|
+
"\n\nregistered request stubs:" \
|
|
63
|
+
"\n\n#{stub_result}" \
|
|
64
|
+
"\n\nBody diff:\n [[\"+\", \"test\", \"test2\"], [\"-\", \"test3\"], [\"~\", \"test5\", \"test6\"]]" \
|
|
65
|
+
"\n\n\n============================================================"
|
|
66
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "WebMock.show_body_diff? is false" do
|
|
70
|
+
before do
|
|
71
|
+
WebMock.hide_body_diff!
|
|
72
|
+
end
|
|
73
|
+
it "should not show body diff" do
|
|
74
|
+
allow(WebMock::StubRegistry.instance).to receive(:request_stubs).and_return([request_stub])
|
|
75
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
76
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
77
|
+
with(request_stub).and_return(stub_result)
|
|
78
|
+
expect_any_instance_of(WebMock::RequestBodyDiff).to_not receive(:body_diff)
|
|
79
|
+
expected = \
|
|
80
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
81
|
+
"\n\nYou can stub this request with the following snippet:" \
|
|
82
|
+
"\n\n#{stub_result}" \
|
|
83
|
+
"\n\nregistered request stubs:" \
|
|
84
|
+
"\n\n#{stub_result}" \
|
|
85
|
+
"\n\n============================================================"
|
|
86
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "WebMock.show_stubbing_instructions? is false" do
|
|
91
|
+
before do
|
|
92
|
+
WebMock.hide_stubbing_instructions!
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should have message with request signature and snippet" do
|
|
96
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
97
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
98
|
+
with(request_stub).and_return(stub_result)
|
|
99
|
+
|
|
100
|
+
expected = \
|
|
101
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
102
|
+
"\n\n============================================================"
|
|
103
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should have message with registered stubs if available" do
|
|
107
|
+
allow(WebMock::StubRegistry.instance).to receive(:request_stubs).and_return([request_stub])
|
|
108
|
+
allow(WebMock::RequestStub).to receive(:from_request_signature).and_return(request_stub)
|
|
109
|
+
allow(WebMock::StubRequestSnippet).to receive(:new).
|
|
110
|
+
with(request_stub).and_return(stub_result)
|
|
111
|
+
allow(request_stub).to receive(:request_pattern).and_return(body_pattern)
|
|
112
|
+
|
|
113
|
+
expected = \
|
|
114
|
+
"Real HTTP connections are disabled. Unregistered request: #{request_signature}" \
|
|
115
|
+
"\n\nregistered request stubs:" \
|
|
116
|
+
"\n\n#{stub_result}" \
|
|
117
|
+
"\n\n============================================================"
|
|
118
|
+
expect(WebMock::NetConnectNotAllowedError.new(request_signature).message).to eq(expected)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
let(:request_signature) { double(:request_signature, to_s: rand(10**20).to_s) }
|
|
124
|
+
let(:stub_result) { double(:stub_result, to_s: rand(10**20).to_s) }
|
|
125
|
+
let(:request_stub) { double(:request_stub) }
|
|
126
|
+
let(:body_pattern) { double(:body_pattern, body_pattern: nil)}
|
|
127
|
+
let(:body_diff) { [["+", "test", "test2"], ["-", "test3"], ["~", "test5", "test6"]] }
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe WebMock::HttpLibAdapterRegistry do
|
|
4
|
+
describe "each_adapter" do
|
|
5
|
+
it "should yield block over each adapter" do
|
|
6
|
+
class MyAdapter < WebMock::HttpLibAdapter; end
|
|
7
|
+
WebMock::HttpLibAdapterRegistry.instance.register(:my_lib, MyAdapter)
|
|
8
|
+
adapters = []
|
|
9
|
+
WebMock::HttpLibAdapterRegistry.instance.each_adapter {|n,a|
|
|
10
|
+
adapters << [n, a]
|
|
11
|
+
}
|
|
12
|
+
expect(adapters).to include([:my_lib, MyAdapter])
|
|
13
|
+
WebMock::HttpLibAdapterRegistry.instance.
|
|
14
|
+
http_lib_adapters.delete(:my_lib)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe WebMock::HttpLibAdapter do
|
|
4
|
+
describe "adapter_for" do
|
|
5
|
+
it "should add adapter to adapter registry" do
|
|
6
|
+
class MyAdapter < WebMock::HttpLibAdapter; end
|
|
7
|
+
expect(WebMock::HttpLibAdapterRegistry.instance).
|
|
8
|
+
to receive(:register).with(:my_lib, MyAdapter)
|
|
9
|
+
MyAdapter.adapter_for(:my_lib)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module WebMock
|
|
4
|
+
module Matchers
|
|
5
|
+
describe HashExcludingMatcher do
|
|
6
|
+
it 'stringifies the given hash keys' do
|
|
7
|
+
expect(HashExcludingMatcher.new(a: 1, b: 2)).not_to eq('a' => 1, 'b' => 2)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'sorts elements in the hash' do
|
|
11
|
+
expect(HashExcludingMatcher.new(b: 2, a: 1)).not_to eq('a' => 1, 'b' => 2)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'describes itself properly' do
|
|
15
|
+
expect(HashExcludingMatcher.new(a: 1).inspect).to eq 'hash_excluding({"a"=>1})'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe 'success' do
|
|
19
|
+
it 'match with hash with a missing key' do
|
|
20
|
+
expect(HashExcludingMatcher.new(a: 1)).to eq('b' => 2)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'match an empty hash with a given key' do
|
|
24
|
+
expect(HashExcludingMatcher.new(a: 1)).to eq({})
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'match when values are nil but keys are different' do
|
|
28
|
+
expect(HashExcludingMatcher.new(a: nil)).to eq('b' => nil)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'when matching an empty hash' do
|
|
32
|
+
it 'does not matches against any hash' do
|
|
33
|
+
expect(HashExcludingMatcher.new({})).to eq(a: 1, b: 2, c: 3)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe 'failing' do
|
|
39
|
+
it 'does not match a hash with a one missing key when one pair is matching' do
|
|
40
|
+
expect(HashExcludingMatcher.new(a: 1, b: 2)).not_to eq('b' => 2)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'match a hash with an incorrect value' do
|
|
44
|
+
expect(HashExcludingMatcher.new(a: 1, b: 2)).not_to eq('a' => 1, 'b' => 3)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'does not matches the same hash' do
|
|
48
|
+
expect(HashExcludingMatcher.new('a' => 1, 'b' => 2)).not_to eq('a' => 1, 'b' => 2)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'does not matches a hash with extra stuff' do
|
|
52
|
+
expect(HashExcludingMatcher.new(a: 1)).not_to eq('a' => 1, 'b' => 2)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'does not match a non-hash' do
|
|
56
|
+
expect(HashExcludingMatcher.new(a: 1)).not_to eq 1
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|