webmock 1.8.6 → 3.14.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 +7 -0
- data/.github/workflows/CI.yml +37 -0
- data/.gitignore +6 -0
- data/CHANGELOG.md +1198 -0
- data/Gemfile +3 -15
- data/README.md +761 -305
- data/Rakefile +13 -40
- data/lib/webmock/api.rb +63 -17
- data/lib/webmock/callback_registry.rb +1 -1
- data/lib/webmock/config.rb +8 -0
- data/lib/webmock/cucumber.rb +2 -0
- data/lib/webmock/errors.rb +8 -24
- data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +216 -0
- data/lib/webmock/http_lib_adapters/curb_adapter.rb +148 -84
- data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +224 -4
- data/lib/webmock/http_lib_adapters/excon_adapter.rb +104 -34
- data/lib/webmock/http_lib_adapters/http_rb/client.rb +17 -0
- data/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
- data/lib/webmock/http_lib_adapters/http_rb/response.rb +64 -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 +152 -86
- data/lib/webmock/http_lib_adapters/manticore_adapter.rb +145 -0
- data/lib/webmock/http_lib_adapters/net_http.rb +155 -46
- data/lib/webmock/http_lib_adapters/net_http_response.rb +1 -1
- data/lib/webmock/http_lib_adapters/patron_adapter.rb +16 -15
- data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +76 -82
- 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 +4 -12
- data/lib/webmock/minitest.rb +29 -3
- data/lib/webmock/rack_response.rb +14 -7
- data/lib/webmock/request_body_diff.rb +64 -0
- data/lib/webmock/request_execution_verifier.rb +38 -17
- data/lib/webmock/request_pattern.rb +158 -38
- data/lib/webmock/request_registry.rb +3 -3
- data/lib/webmock/request_signature.rb +7 -3
- data/lib/webmock/request_signature_snippet.rb +61 -0
- data/lib/webmock/request_stub.rb +9 -6
- data/lib/webmock/response.rb +30 -15
- data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +38 -2
- data/lib/webmock/rspec/matchers/webmock_matcher.rb +23 -2
- data/lib/webmock/rspec/matchers.rb +0 -1
- data/lib/webmock/rspec.rb +11 -2
- data/lib/webmock/stub_registry.rb +31 -10
- data/lib/webmock/stub_request_snippet.rb +14 -6
- data/lib/webmock/test_unit.rb +4 -4
- data/lib/webmock/util/hash_counter.rb +20 -6
- data/lib/webmock/util/hash_keys_stringifier.rb +5 -3
- data/lib/webmock/util/hash_validator.rb +17 -0
- data/lib/webmock/util/headers.rb +23 -2
- data/lib/webmock/util/json.rb +20 -7
- data/lib/webmock/util/query_mapper.rb +281 -0
- data/lib/webmock/util/uri.rb +29 -19
- data/lib/webmock/util/values_stringifier.rb +20 -0
- data/lib/webmock/util/version_checker.rb +40 -2
- data/lib/webmock/version.rb +1 -1
- data/lib/webmock/webmock.rb +56 -17
- data/lib/webmock.rb +56 -46
- data/minitest/test_helper.rb +8 -3
- data/minitest/test_webmock.rb +4 -1
- data/minitest/webmock_spec.rb +16 -6
- data/spec/acceptance/async_http_client/async_http_client_spec.rb +375 -0
- data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +73 -0
- data/spec/acceptance/curb/curb_spec.rb +227 -68
- data/spec/acceptance/curb/curb_spec_helper.rb +11 -8
- data/spec/acceptance/em_http_request/em_http_request_spec.rb +322 -28
- data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +15 -10
- data/spec/acceptance/excon/excon_spec.rb +66 -4
- data/spec/acceptance/excon/excon_spec_helper.rb +21 -7
- data/spec/acceptance/http_rb/http_rb_spec.rb +93 -0
- data/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
- data/spec/acceptance/httpclient/httpclient_spec.rb +152 -11
- data/spec/acceptance/httpclient/httpclient_spec_helper.rb +25 -16
- data/spec/acceptance/manticore/manticore_spec.rb +107 -0
- data/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
- data/spec/acceptance/net_http/net_http_shared.rb +52 -24
- data/spec/acceptance/net_http/net_http_spec.rb +164 -50
- data/spec/acceptance/net_http/net_http_spec_helper.rb +19 -10
- data/spec/acceptance/net_http/real_net_http_spec.rb +1 -1
- data/spec/acceptance/patron/patron_spec.rb +29 -40
- data/spec/acceptance/patron/patron_spec_helper.rb +15 -11
- data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +229 -58
- data/spec/acceptance/shared/callbacks.rb +32 -30
- data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +20 -5
- data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +14 -14
- data/spec/acceptance/shared/precedence_of_stubs.rb +6 -6
- data/spec/acceptance/shared/request_expectations.rb +560 -296
- data/spec/acceptance/shared/returning_declared_responses.rb +180 -138
- data/spec/acceptance/shared/stubbing_requests.rb +385 -154
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +78 -17
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +19 -15
- data/spec/acceptance/webmock_shared.rb +2 -2
- data/spec/fixtures/test.txt +1 -0
- data/spec/quality_spec.rb +27 -3
- data/spec/spec_helper.rb +11 -20
- data/spec/support/failures.rb +9 -0
- data/spec/support/my_rack_app.rb +8 -3
- data/spec/support/network_connection.rb +7 -13
- data/spec/support/webmock_server.rb +8 -3
- data/spec/unit/api_spec.rb +175 -0
- data/spec/unit/errors_spec.rb +116 -19
- data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +1 -1
- data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +2 -2
- 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 +54 -16
- data/spec/unit/request_body_diff_spec.rb +90 -0
- data/spec/unit/request_execution_verifier_spec.rb +147 -39
- data/spec/unit/request_pattern_spec.rb +462 -198
- data/spec/unit/request_registry_spec.rb +29 -9
- data/spec/unit/request_signature_snippet_spec.rb +89 -0
- data/spec/unit/request_signature_spec.rb +91 -49
- data/spec/unit/request_stub_spec.rb +71 -70
- data/spec/unit/response_spec.rb +100 -81
- data/spec/unit/stub_registry_spec.rb +37 -20
- data/spec/unit/stub_request_snippet_spec.rb +51 -31
- data/spec/unit/util/hash_counter_spec.rb +6 -6
- data/spec/unit/util/hash_keys_stringifier_spec.rb +4 -4
- data/spec/unit/util/headers_spec.rb +4 -4
- data/spec/unit/util/json_spec.rb +29 -3
- data/spec/unit/util/query_mapper_spec.rb +157 -0
- data/spec/unit/util/uri_spec.rb +150 -36
- data/spec/unit/util/version_checker_spec.rb +15 -9
- data/spec/unit/webmock_spec.rb +57 -4
- data/test/http_request.rb +3 -3
- data/test/shared_test.rb +45 -13
- data/test/test_helper.rb +1 -1
- data/test/test_webmock.rb +6 -0
- data/webmock.gemspec +30 -11
- metadata +308 -199
- data/.rvmrc +0 -1
- data/.travis.yml +0 -11
- data/Guardfile +0 -24
- data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_0_x.rb +0 -151
- data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +0 -210
@@ -14,9 +14,9 @@ describe WebMock::RequestRegistry do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should clean list of executed requests" do
|
17
|
-
WebMock::RequestRegistry.instance.times_executed(@request_pattern).
|
17
|
+
expect(WebMock::RequestRegistry.instance.times_executed(@request_pattern)).to eq(1)
|
18
18
|
WebMock::RequestRegistry.instance.reset!
|
19
|
-
WebMock::RequestRegistry.instance.times_executed(@request_pattern).
|
19
|
+
expect(WebMock::RequestRegistry.instance.times_executed(@request_pattern)).to eq(0)
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
@@ -33,15 +33,34 @@ describe WebMock::RequestRegistry do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should report 0 if no request matching pattern was requested" do
|
36
|
-
WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, "www.example.net")).
|
36
|
+
expect(WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, "www.example.net"))).to eq(0)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should report number of times matching pattern was requested" do
|
40
|
-
WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, "www.example.com")).
|
40
|
+
expect(WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, "www.example.com"))).to eq(2)
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should report number of times all matching pattern were requested" do
|
44
|
-
WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, /.*example.*/)).
|
44
|
+
expect(WebMock::RequestRegistry.instance.times_executed(WebMock::RequestPattern.new(:get, /.*example.*/))).to eq(3)
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "multithreading" do
|
48
|
+
let(:request_pattern) { WebMock::RequestPattern.new(:get, "www.example.com") }
|
49
|
+
|
50
|
+
# Reproduce a multithreading issue that causes a RuntimeError:
|
51
|
+
# can't add a new key into hash during iteration.
|
52
|
+
it "works normally iterating on the requested signature hash while another thread is setting it" do
|
53
|
+
thread_injected = false
|
54
|
+
allow(request_pattern).to receive(:matches?).and_wrap_original do |m, *args|
|
55
|
+
unless thread_injected
|
56
|
+
thread_injected = true
|
57
|
+
Thread.new { WebMock::RequestRegistry.instance.requested_signatures.put(:abc) }.join(0.1)
|
58
|
+
end
|
59
|
+
m.call(*args)
|
60
|
+
end
|
61
|
+
expect(WebMock::RequestRegistry.instance.times_executed(request_pattern)).to eq(2)
|
62
|
+
sleep 0.1 while !WebMock::RequestRegistry.instance.requested_signatures.hash.key?(:abc)
|
63
|
+
end
|
45
64
|
end
|
46
65
|
end
|
47
66
|
|
@@ -49,8 +68,8 @@ describe WebMock::RequestRegistry do
|
|
49
68
|
it "should return hash of unique request signatures with accumulated number" do
|
50
69
|
WebMock::RequestRegistry.instance.requested_signatures.put(WebMock::RequestSignature.new(:get, "www.example.com"))
|
51
70
|
WebMock::RequestRegistry.instance.requested_signatures.put(WebMock::RequestSignature.new(:get, "www.example.com"))
|
52
|
-
WebMock::RequestRegistry.instance.requested_signatures.
|
53
|
-
get(WebMock::RequestSignature.new(:get, "www.example.com")).
|
71
|
+
expect(WebMock::RequestRegistry.instance.requested_signatures.
|
72
|
+
get(WebMock::RequestSignature.new(:get, "www.example.com"))).to eq(2)
|
54
73
|
end
|
55
74
|
end
|
56
75
|
|
@@ -63,12 +82,13 @@ describe WebMock::RequestRegistry do
|
|
63
82
|
].each do |s|
|
64
83
|
WebMock::RequestRegistry.instance.requested_signatures.put(s)
|
65
84
|
end
|
66
|
-
WebMock::RequestRegistry.instance.to_s.
|
85
|
+
expect(WebMock::RequestRegistry.instance.to_s).to eq(
|
67
86
|
"GET http://www.example.com/ was made 2 times\nPUT http://www.example.org/ was made 1 time\n"
|
87
|
+
)
|
68
88
|
end
|
69
89
|
|
70
90
|
it "should output info if no requests were executed" do
|
71
|
-
WebMock::RequestRegistry.instance.to_s.
|
91
|
+
expect(WebMock::RequestRegistry.instance.to_s).to eq("No requests were made.")
|
72
92
|
end
|
73
93
|
end
|
74
94
|
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe WebMock::RequestSignatureSnippet do
|
4
|
+
it("is real"){expect{subject}.not_to(raise_error)}
|
5
|
+
|
6
|
+
subject { WebMock::RequestSignatureSnippet.new(request_signature) }
|
7
|
+
|
8
|
+
let(:uri) { "http://example.com" }
|
9
|
+
let(:method) { "GET" }
|
10
|
+
|
11
|
+
let(:request_signature) { WebMock::RequestSignature.new(method, uri) }
|
12
|
+
let(:request_signature_body) { {"key" => "different value"}.to_json }
|
13
|
+
|
14
|
+
let(:request_pattern) {
|
15
|
+
WebMock::RequestPattern.new(
|
16
|
+
method, uri, {body: request_signature_body}
|
17
|
+
)
|
18
|
+
}
|
19
|
+
|
20
|
+
before :each do
|
21
|
+
request_signature.headers = {"Content-Type" => "application/json"}
|
22
|
+
request_signature.body = request_signature_body
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#stubbing_instructions" do
|
26
|
+
context "with stubbing instructions turned off" do
|
27
|
+
before :each do
|
28
|
+
WebMock.hide_stubbing_instructions!
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns nil" do
|
32
|
+
expect(subject.stubbing_instructions).to be nil
|
33
|
+
end
|
34
|
+
|
35
|
+
after :each do
|
36
|
+
WebMock.show_stubbing_instructions!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "with stubbing instructions turned on" do
|
41
|
+
it "returns a stub snippet" do
|
42
|
+
expect(subject.stubbing_instructions).to include(
|
43
|
+
"You can stub this request with the following snippet:"
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#request_stubs" do
|
50
|
+
before :each do
|
51
|
+
WebMock.stub_request(:get, "https://www.example.com").with(body: {"a" => "b"})
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when showing the body diff is turned off" do
|
55
|
+
before :each do
|
56
|
+
WebMock.hide_body_diff!
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns does not show the body diff" do
|
60
|
+
result = subject.request_stubs
|
61
|
+
result.sub!("registered request stubs:\n\n", "")
|
62
|
+
expect(result).to eq(
|
63
|
+
"stub_request(:get, \"https://www.example.com/\").\n with(\n body: {\"a\"=>\"b\"})"
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
after :each do
|
68
|
+
WebMock.show_body_diff!
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when showing the body diff is turned on" do
|
73
|
+
it "shows the body diff" do
|
74
|
+
result = subject.request_stubs
|
75
|
+
result.sub!("registered request stubs:\n\n", "")
|
76
|
+
expect(result).to eq(
|
77
|
+
"stub_request(:get, \"https://www.example.com/\").\n with(\n body: {\"a\"=>\"b\"})\n\nBody diff:\n [[\"-\", \"key\", \"different value\"], [\"+\", \"a\", \"b\"]]\n"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "with no request stubs" do
|
83
|
+
it "returns nil" do
|
84
|
+
WebMock.reset!
|
85
|
+
expect(subject.request_stubs).to be nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -4,110 +4,152 @@ describe WebMock::RequestSignature do
|
|
4
4
|
|
5
5
|
describe "initialization" do
|
6
6
|
|
7
|
-
it "
|
8
|
-
WebMock::Util::URI.
|
7
|
+
it "assign the uri to be the normalized uri" do
|
8
|
+
expect(WebMock::Util::URI).to receive(:normalize_uri).and_return("www.example.kom")
|
9
9
|
signature = WebMock::RequestSignature.new(:get, "www.example.com")
|
10
|
-
signature.uri.
|
10
|
+
expect(signature.uri).to eq("www.example.kom")
|
11
11
|
end
|
12
12
|
|
13
|
-
it "
|
14
|
-
WebMock::Util::URI.
|
13
|
+
it "assigns the uri without normalization if uri is already a URI" do
|
14
|
+
expect(WebMock::Util::URI).not_to receive(:normalize_uri)
|
15
15
|
uri = Addressable::URI.parse("www.example.com")
|
16
16
|
signature = WebMock::RequestSignature.new(:get, uri)
|
17
|
-
signature.uri.
|
17
|
+
expect(signature.uri).to eq(uri)
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
21
|
-
WebMock::Util::Headers.
|
22
|
-
|
20
|
+
it "assigns normalized headers" do
|
21
|
+
expect(WebMock::Util::Headers).to receive(:normalize_headers).with('A' => 'a').and_return('B' => 'b')
|
22
|
+
expect(
|
23
|
+
WebMock::RequestSignature.new(:get, "www.example.com", headers: {'A' => 'a'}).headers
|
24
|
+
).to eq({'B' => 'b'})
|
23
25
|
end
|
24
26
|
|
25
|
-
it "
|
26
|
-
WebMock::RequestSignature.new(:get, "www.example.com", :
|
27
|
+
it "assign the body" do
|
28
|
+
expect(WebMock::RequestSignature.new(:get, "www.example.com", body: "abc").body).to eq("abc")
|
27
29
|
end
|
28
30
|
|
31
|
+
it "symbolizes the method" do
|
32
|
+
expect(WebMock::RequestSignature.new('get', "www.example.com", body: "abc").method).to eq(:get)
|
33
|
+
end
|
29
34
|
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
:
|
34
|
-
|
36
|
+
describe "#to_s" do
|
37
|
+
it "describes itself" do
|
38
|
+
expect(WebMock::RequestSignature.new(:get, "www.example.com",
|
39
|
+
body: "abc", headers: {'A' => 'a', 'B' => 'b'}).to_s).to eq(
|
40
|
+
"GET http://www.example.com/ with body 'abc' with headers {'A'=>'a', 'B'=>'b'}"
|
41
|
+
)
|
42
|
+
end
|
35
43
|
end
|
36
44
|
|
37
|
-
describe "hash" do
|
38
|
-
it "
|
45
|
+
describe "#hash" do
|
46
|
+
it "reporst same hash for two signatures with the same values" do
|
39
47
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com",
|
40
|
-
:
|
48
|
+
body: "abc", headers: {'A' => 'a', 'B' => 'b'})
|
41
49
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.com",
|
42
|
-
:
|
43
|
-
signature1.hash.
|
50
|
+
body: "abc", headers: {'A' => 'a', 'B' => 'b'})
|
51
|
+
expect(signature1.hash).to eq(signature2.hash)
|
44
52
|
end
|
45
53
|
|
46
|
-
it "
|
54
|
+
it "reports different hash for two signatures with different method" do
|
47
55
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com")
|
48
56
|
signature2 = WebMock::RequestSignature.new(:put, "www.example.com")
|
49
|
-
signature1.hash.
|
57
|
+
expect(signature1.hash).not_to eq(signature2.hash)
|
50
58
|
end
|
51
59
|
|
52
|
-
it "
|
60
|
+
it "reports different hash for two signatures with different uri" do
|
53
61
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com")
|
54
62
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.org")
|
55
|
-
signature1.hash.
|
63
|
+
expect(signature1.hash).not_to eq(signature2.hash)
|
56
64
|
end
|
57
65
|
|
58
|
-
it "
|
59
|
-
signature1 = WebMock::RequestSignature.new(:get, "www.example.com", :
|
60
|
-
signature2 = WebMock::RequestSignature.new(:get, "www.example.com", :
|
61
|
-
signature1.hash.
|
66
|
+
it "reports different hash for two signatures with different body" do
|
67
|
+
signature1 = WebMock::RequestSignature.new(:get, "www.example.com", body: "abc")
|
68
|
+
signature2 = WebMock::RequestSignature.new(:get, "www.example.com", body: "def")
|
69
|
+
expect(signature1.hash).not_to eq(signature2.hash)
|
62
70
|
end
|
63
71
|
|
64
|
-
it "
|
72
|
+
it "reports different hash for two signatures with different headers" do
|
65
73
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com",
|
66
|
-
:
|
74
|
+
headers: {'A' => 'a'})
|
67
75
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.com",
|
68
|
-
:
|
69
|
-
signature1.hash.
|
76
|
+
headers: {'A' => 'A'})
|
77
|
+
expect(signature1.hash).not_to eq(signature2.hash)
|
70
78
|
end
|
71
79
|
end
|
72
80
|
|
73
|
-
|
74
81
|
[:==, :eql?].each do |method|
|
75
82
|
describe method do
|
76
|
-
it "
|
83
|
+
it "is true for two signatures with the same values" do
|
77
84
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com",
|
78
|
-
:
|
85
|
+
body: "abc", headers: {'A' => 'a', 'B' => 'b'})
|
79
86
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.com",
|
80
|
-
:
|
87
|
+
body: "abc", headers: {'A' => 'a', 'B' => 'b'})
|
81
88
|
|
82
|
-
signature1.send(method, signature2).
|
89
|
+
expect(signature1.send(method, signature2)).to be_truthy
|
83
90
|
end
|
84
91
|
|
85
|
-
it "
|
92
|
+
it "is false for two signatures with different method" do
|
86
93
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com")
|
87
94
|
signature2 = WebMock::RequestSignature.new(:put, "www.example.com")
|
88
|
-
signature1.send(method, signature2).
|
95
|
+
expect(signature1.send(method, signature2)).to be_falsey
|
89
96
|
end
|
90
97
|
|
91
|
-
it "
|
98
|
+
it "is false for two signatures with different uri" do
|
92
99
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com")
|
93
100
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.org")
|
94
|
-
signature1.send(method, signature2).
|
101
|
+
expect(signature1.send(method, signature2)).to be_falsey
|
95
102
|
end
|
96
103
|
|
97
|
-
it "
|
98
|
-
signature1 = WebMock::RequestSignature.new(:get, "www.example.com", :
|
99
|
-
signature2 = WebMock::RequestSignature.new(:get, "www.example.com", :
|
100
|
-
signature1.send(method, signature2).
|
104
|
+
it "is false for two signatures with different body" do
|
105
|
+
signature1 = WebMock::RequestSignature.new(:get, "www.example.com", body: "abc")
|
106
|
+
signature2 = WebMock::RequestSignature.new(:get, "www.example.com", body: "def")
|
107
|
+
expect(signature1.send(method, signature2)).to be_falsey
|
101
108
|
end
|
102
109
|
|
103
|
-
it "
|
110
|
+
it "is false for two signatures with different headers" do
|
104
111
|
signature1 = WebMock::RequestSignature.new(:get, "www.example.com",
|
105
|
-
:
|
112
|
+
headers: {'A' => 'a'})
|
106
113
|
signature2 = WebMock::RequestSignature.new(:get, "www.example.com",
|
107
|
-
:
|
108
|
-
signature1.send(method, signature2).
|
114
|
+
headers: {'A' => 'A'})
|
115
|
+
expect(signature1.send(method, signature2)).to be_falsey
|
109
116
|
end
|
110
117
|
end
|
111
118
|
end
|
112
119
|
|
120
|
+
subject { WebMock::RequestSignature.new(:get, "www.example.com") }
|
121
|
+
|
122
|
+
describe "#url_encoded?" do
|
123
|
+
it "returns true if the headers are urlencoded" do
|
124
|
+
subject.headers = { "Content-Type" => "application/x-www-form-urlencoded" }
|
125
|
+
expect(subject.url_encoded?).to be true
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns false if the headers are NOT urlencoded" do
|
129
|
+
subject.headers = { "Content-Type" => "application/made-up-format" }
|
130
|
+
expect(subject.url_encoded?).to be false
|
131
|
+
end
|
132
|
+
|
133
|
+
it "returns false when no headers are set" do
|
134
|
+
subject.headers = nil
|
135
|
+
expect(subject.url_encoded?).to be false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#json_headers?" do
|
140
|
+
it "returns true if the headers are json" do
|
141
|
+
subject.headers = { "Content-Type" => "application/json" }
|
142
|
+
expect(subject.json_headers?).to be true
|
143
|
+
end
|
144
|
+
|
145
|
+
it "returns false if the headers are NOT json" do
|
146
|
+
subject.headers = { "Content-Type" => "application/made-up-format" }
|
147
|
+
expect(subject.json_headers?).to be false
|
148
|
+
end
|
149
|
+
|
150
|
+
it "returns false when no headers are set" do
|
151
|
+
subject.headers = nil
|
152
|
+
expect(subject.json_headers?).to be false
|
153
|
+
end
|
154
|
+
end
|
113
155
|
end
|
@@ -7,29 +7,30 @@ describe WebMock::RequestStub do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should have request pattern with method and uri" do
|
10
|
-
@request_stub.request_pattern.to_s.
|
10
|
+
expect(@request_stub.request_pattern.to_s).to eq("GET http://www.example.com/")
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should have response" do
|
14
|
-
@request_stub.response.
|
14
|
+
expect(@request_stub.response).to be_a(WebMock::Response)
|
15
15
|
end
|
16
16
|
|
17
17
|
describe "with" do
|
18
18
|
|
19
19
|
it "should assign body to request pattern" do
|
20
|
-
@request_stub.with(:
|
21
|
-
@request_stub.request_pattern.to_s.
|
20
|
+
@request_stub.with(body: "abc")
|
21
|
+
expect(@request_stub.request_pattern.to_s).to eq(WebMock::RequestPattern.new(:get, "www.example.com", body: "abc").to_s)
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should assign normalized headers to request pattern" do
|
25
|
-
@request_stub.with(:
|
26
|
-
@request_stub.request_pattern.to_s.
|
27
|
-
WebMock::RequestPattern.new(:get, "www.example.com", :
|
25
|
+
@request_stub.with(headers: {'A' => 'a'})
|
26
|
+
expect(@request_stub.request_pattern.to_s).to eq(
|
27
|
+
WebMock::RequestPattern.new(:get, "www.example.com", headers: {'A' => 'a'}).to_s
|
28
|
+
)
|
28
29
|
end
|
29
30
|
|
30
31
|
it "should assign given block to request profile" do
|
31
32
|
@request_stub.with { |req| req.body == "abc" }
|
32
|
-
@request_stub.request_pattern.matches?(WebMock::RequestSignature.new(:get, "www.example.com", :
|
33
|
+
expect(@request_stub.request_pattern.matches?(WebMock::RequestSignature.new(:get, "www.example.com", body: "abc"))).to be_truthy
|
33
34
|
end
|
34
35
|
|
35
36
|
end
|
@@ -37,49 +38,49 @@ describe WebMock::RequestStub do
|
|
37
38
|
describe "to_return" do
|
38
39
|
|
39
40
|
it "should assign response with provided options" do
|
40
|
-
@request_stub.to_return(:
|
41
|
-
@request_stub.response.body.
|
42
|
-
@request_stub.response.status.
|
41
|
+
@request_stub.to_return(body: "abc", status: 500)
|
42
|
+
expect(@request_stub.response.body).to eq("abc")
|
43
|
+
expect(@request_stub.response.status).to eq([500, ""])
|
43
44
|
end
|
44
45
|
|
45
46
|
it "should assign responses with provided options" do
|
46
|
-
@request_stub.to_return([{:
|
47
|
-
[@request_stub.response.body, @request_stub.response.body].
|
47
|
+
@request_stub.to_return([{body: "abc"}, {body: "def"}])
|
48
|
+
expect([@request_stub.response.body, @request_stub.response.body]).to eq(["abc", "def"])
|
48
49
|
end
|
49
50
|
|
50
51
|
end
|
51
52
|
|
52
53
|
describe "then" do
|
53
54
|
it "should return stub without any modifications, acting as syntactic sugar" do
|
54
|
-
@request_stub.then.
|
55
|
+
expect(@request_stub.then).to eq(@request_stub)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
58
59
|
describe "response" do
|
59
60
|
|
60
61
|
it "should return responses in a sequence passed as array" do
|
61
|
-
@request_stub.to_return([{:
|
62
|
-
@request_stub.response.body.
|
63
|
-
@request_stub.response.body.
|
62
|
+
@request_stub.to_return([{body: "abc"}, {body: "def"}])
|
63
|
+
expect(@request_stub.response.body).to eq("abc")
|
64
|
+
expect(@request_stub.response.body).to eq("def")
|
64
65
|
end
|
65
66
|
|
66
67
|
it "should repeat returning last response" do
|
67
|
-
@request_stub.to_return([{:
|
68
|
+
@request_stub.to_return([{body: "abc"}, {body: "def"}])
|
68
69
|
@request_stub.response
|
69
70
|
@request_stub.response
|
70
|
-
@request_stub.response.body.
|
71
|
+
expect(@request_stub.response.body).to eq("def")
|
71
72
|
end
|
72
73
|
|
73
74
|
it "should return responses in a sequence passed as comma separated params" do
|
74
|
-
@request_stub.to_return({:
|
75
|
-
@request_stub.response.body.
|
76
|
-
@request_stub.response.body.
|
75
|
+
@request_stub.to_return({body: "abc"}, {body: "def"})
|
76
|
+
expect(@request_stub.response.body).to eq("abc")
|
77
|
+
expect(@request_stub.response.body).to eq("def")
|
77
78
|
end
|
78
79
|
|
79
80
|
it "should return responses declared in multiple to_return declarations" do
|
80
|
-
@request_stub.to_return({:
|
81
|
-
@request_stub.response.body.
|
82
|
-
@request_stub.response.body.
|
81
|
+
@request_stub.to_return({body: "abc"}).to_return({body: "def"})
|
82
|
+
expect(@request_stub.response.body).to eq("abc")
|
83
|
+
expect(@request_stub.response.body).to eq("def")
|
83
84
|
end
|
84
85
|
|
85
86
|
end
|
@@ -88,37 +89,37 @@ describe WebMock::RequestStub do
|
|
88
89
|
|
89
90
|
it "should assign response with exception to be thrown" do
|
90
91
|
@request_stub.to_raise(ArgumentError)
|
91
|
-
|
92
|
+
expect {
|
92
93
|
@request_stub.response.raise_error_if_any
|
93
|
-
}.
|
94
|
+
}.to raise_error(ArgumentError, "Exception from WebMock")
|
94
95
|
end
|
95
96
|
|
96
97
|
it "should assign sequence of responses with response with exception to be thrown" do
|
97
|
-
@request_stub.to_return(:
|
98
|
-
@request_stub.response.body.
|
99
|
-
|
98
|
+
@request_stub.to_return(body: "abc").then.to_raise(ArgumentError)
|
99
|
+
expect(@request_stub.response.body).to eq("abc")
|
100
|
+
expect {
|
100
101
|
@request_stub.response.raise_error_if_any
|
101
|
-
}.
|
102
|
+
}.to raise_error(ArgumentError, "Exception from WebMock")
|
102
103
|
end
|
103
104
|
|
104
105
|
it "should assign a list responses to be thrown in a sequence" do
|
105
106
|
@request_stub.to_raise(ArgumentError, IndexError)
|
106
|
-
|
107
|
+
expect {
|
107
108
|
@request_stub.response.raise_error_if_any
|
108
|
-
}.
|
109
|
-
|
109
|
+
}.to raise_error(ArgumentError, "Exception from WebMock")
|
110
|
+
expect {
|
110
111
|
@request_stub.response.raise_error_if_any
|
111
|
-
}.
|
112
|
+
}.to raise_error(IndexError, "Exception from WebMock")
|
112
113
|
end
|
113
114
|
|
114
115
|
it "should raise exceptions declared in multiple to_raise declarations" do
|
115
116
|
@request_stub.to_raise(ArgumentError).then.to_raise(IndexError)
|
116
|
-
|
117
|
+
expect {
|
117
118
|
@request_stub.response.raise_error_if_any
|
118
|
-
}.
|
119
|
-
|
119
|
+
}.to raise_error(ArgumentError, "Exception from WebMock")
|
120
|
+
expect {
|
120
121
|
@request_stub.response.raise_error_if_any
|
121
|
-
}.
|
122
|
+
}.to raise_error(IndexError, "Exception from WebMock")
|
122
123
|
end
|
123
124
|
|
124
125
|
end
|
@@ -127,20 +128,20 @@ describe WebMock::RequestStub do
|
|
127
128
|
|
128
129
|
it "should assign response with timeout" do
|
129
130
|
@request_stub.to_timeout
|
130
|
-
@request_stub.response.should_timeout.
|
131
|
+
expect(@request_stub.response.should_timeout).to be_truthy
|
131
132
|
end
|
132
133
|
|
133
134
|
it "should assign sequence of responses with response with timeout" do
|
134
|
-
@request_stub.to_return(:
|
135
|
-
@request_stub.response.body.
|
136
|
-
@request_stub.response.should_timeout.
|
135
|
+
@request_stub.to_return(body: "abc").then.to_timeout
|
136
|
+
expect(@request_stub.response.body).to eq("abc")
|
137
|
+
expect(@request_stub.response.should_timeout).to be_truthy
|
137
138
|
end
|
138
139
|
|
139
140
|
it "should allow multiple timeouts to be declared" do
|
140
|
-
@request_stub.to_timeout.then.to_timeout.then.to_return(:
|
141
|
-
@request_stub.response.should_timeout.
|
142
|
-
@request_stub.response.should_timeout.
|
143
|
-
@request_stub.response.body.
|
141
|
+
@request_stub.to_timeout.then.to_timeout.then.to_return(body: "abc")
|
142
|
+
expect(@request_stub.response.should_timeout).to be_truthy
|
143
|
+
expect(@request_stub.response.should_timeout).to be_truthy
|
144
|
+
expect(@request_stub.response.body).to eq("abc")
|
144
145
|
end
|
145
146
|
|
146
147
|
end
|
@@ -149,48 +150,48 @@ describe WebMock::RequestStub do
|
|
149
150
|
describe "times" do
|
150
151
|
|
151
152
|
it "should give error if declared before any response declaration is declared" do
|
152
|
-
|
153
|
+
expect {
|
153
154
|
@request_stub.times(3)
|
154
|
-
}.
|
155
|
+
}.to raise_error("Invalid WebMock stub declaration. times(N) can be declared only after response declaration.")
|
155
156
|
end
|
156
157
|
|
157
158
|
it "should repeat returning last declared response declared number of times" do
|
158
|
-
@request_stub.to_return({:
|
159
|
-
@request_stub.response.body.
|
160
|
-
@request_stub.response.body.
|
161
|
-
@request_stub.response.body.
|
159
|
+
@request_stub.to_return({body: "abc"}).times(2).then.to_return({body: "def"})
|
160
|
+
expect(@request_stub.response.body).to eq("abc")
|
161
|
+
expect(@request_stub.response.body).to eq("abc")
|
162
|
+
expect(@request_stub.response.body).to eq("def")
|
162
163
|
end
|
163
164
|
|
164
165
|
it "should repeat raising last declared exception declared number of times" do
|
165
|
-
@request_stub.to_return({:
|
166
|
-
@request_stub.response.body.
|
167
|
-
@request_stub.response.body.
|
168
|
-
@request_stub.response.body.
|
166
|
+
@request_stub.to_return({body: "abc"}).times(2).then.to_return({body: "def"})
|
167
|
+
expect(@request_stub.response.body).to eq("abc")
|
168
|
+
expect(@request_stub.response.body).to eq("abc")
|
169
|
+
expect(@request_stub.response.body).to eq("def")
|
169
170
|
end
|
170
171
|
|
171
172
|
it "should repeat returning last declared sequence of responses declared number of times" do
|
172
|
-
@request_stub.to_return({:
|
173
|
-
@request_stub.response.body.
|
174
|
-
@request_stub.response.body.
|
175
|
-
@request_stub.response.body.
|
176
|
-
@request_stub.response.body.
|
177
|
-
@request_stub.response.body.
|
173
|
+
@request_stub.to_return({body: "abc"}, {body: "def"}).times(2).then.to_return({body: "ghj"})
|
174
|
+
expect(@request_stub.response.body).to eq("abc")
|
175
|
+
expect(@request_stub.response.body).to eq("def")
|
176
|
+
expect(@request_stub.response.body).to eq("abc")
|
177
|
+
expect(@request_stub.response.body).to eq("def")
|
178
|
+
expect(@request_stub.response.body).to eq("ghj")
|
178
179
|
end
|
179
180
|
|
180
181
|
it "should return self" do
|
181
|
-
@request_stub.to_return({:
|
182
|
+
expect(@request_stub.to_return({body: "abc"}).times(1)).to eq(@request_stub)
|
182
183
|
end
|
183
184
|
|
184
185
|
it "should raise error if argument is not integer" do
|
185
|
-
|
186
|
-
@request_stub.to_return({:
|
187
|
-
}.
|
186
|
+
expect {
|
187
|
+
@request_stub.to_return({body: "abc"}).times("not number")
|
188
|
+
}.to raise_error("times(N) accepts integers >= 1 only")
|
188
189
|
end
|
189
190
|
|
190
191
|
it "should raise error if argument is < 1" do
|
191
|
-
|
192
|
-
@request_stub.to_return({:
|
193
|
-
}.
|
192
|
+
expect {
|
193
|
+
@request_stub.to_return({body: "abc"}).times(0)
|
194
|
+
}.to raise_error("times(N) accepts integers >= 1 only")
|
194
195
|
end
|
195
196
|
|
196
197
|
end
|