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.
Files changed (138) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/CI.yml +37 -0
  3. data/.gitignore +6 -0
  4. data/CHANGELOG.md +1198 -0
  5. data/Gemfile +3 -15
  6. data/README.md +761 -305
  7. data/Rakefile +13 -40
  8. data/lib/webmock/api.rb +63 -17
  9. data/lib/webmock/callback_registry.rb +1 -1
  10. data/lib/webmock/config.rb +8 -0
  11. data/lib/webmock/cucumber.rb +2 -0
  12. data/lib/webmock/errors.rb +8 -24
  13. data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +216 -0
  14. data/lib/webmock/http_lib_adapters/curb_adapter.rb +148 -84
  15. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +224 -4
  16. data/lib/webmock/http_lib_adapters/excon_adapter.rb +104 -34
  17. data/lib/webmock/http_lib_adapters/http_rb/client.rb +17 -0
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +64 -0
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +29 -0
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +68 -0
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +37 -0
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +152 -86
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +145 -0
  25. data/lib/webmock/http_lib_adapters/net_http.rb +155 -46
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +1 -1
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +16 -15
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +76 -82
  29. data/lib/webmock/matchers/any_arg_matcher.rb +13 -0
  30. data/lib/webmock/matchers/hash_argument_matcher.rb +21 -0
  31. data/lib/webmock/matchers/hash_excluding_matcher.rb +15 -0
  32. data/lib/webmock/matchers/hash_including_matcher.rb +4 -12
  33. data/lib/webmock/minitest.rb +29 -3
  34. data/lib/webmock/rack_response.rb +14 -7
  35. data/lib/webmock/request_body_diff.rb +64 -0
  36. data/lib/webmock/request_execution_verifier.rb +38 -17
  37. data/lib/webmock/request_pattern.rb +158 -38
  38. data/lib/webmock/request_registry.rb +3 -3
  39. data/lib/webmock/request_signature.rb +7 -3
  40. data/lib/webmock/request_signature_snippet.rb +61 -0
  41. data/lib/webmock/request_stub.rb +9 -6
  42. data/lib/webmock/response.rb +30 -15
  43. data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +38 -2
  44. data/lib/webmock/rspec/matchers/webmock_matcher.rb +23 -2
  45. data/lib/webmock/rspec/matchers.rb +0 -1
  46. data/lib/webmock/rspec.rb +11 -2
  47. data/lib/webmock/stub_registry.rb +31 -10
  48. data/lib/webmock/stub_request_snippet.rb +14 -6
  49. data/lib/webmock/test_unit.rb +4 -4
  50. data/lib/webmock/util/hash_counter.rb +20 -6
  51. data/lib/webmock/util/hash_keys_stringifier.rb +5 -3
  52. data/lib/webmock/util/hash_validator.rb +17 -0
  53. data/lib/webmock/util/headers.rb +23 -2
  54. data/lib/webmock/util/json.rb +20 -7
  55. data/lib/webmock/util/query_mapper.rb +281 -0
  56. data/lib/webmock/util/uri.rb +29 -19
  57. data/lib/webmock/util/values_stringifier.rb +20 -0
  58. data/lib/webmock/util/version_checker.rb +40 -2
  59. data/lib/webmock/version.rb +1 -1
  60. data/lib/webmock/webmock.rb +56 -17
  61. data/lib/webmock.rb +56 -46
  62. data/minitest/test_helper.rb +8 -3
  63. data/minitest/test_webmock.rb +4 -1
  64. data/minitest/webmock_spec.rb +16 -6
  65. data/spec/acceptance/async_http_client/async_http_client_spec.rb +375 -0
  66. data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +73 -0
  67. data/spec/acceptance/curb/curb_spec.rb +227 -68
  68. data/spec/acceptance/curb/curb_spec_helper.rb +11 -8
  69. data/spec/acceptance/em_http_request/em_http_request_spec.rb +322 -28
  70. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +15 -10
  71. data/spec/acceptance/excon/excon_spec.rb +66 -4
  72. data/spec/acceptance/excon/excon_spec_helper.rb +21 -7
  73. data/spec/acceptance/http_rb/http_rb_spec.rb +93 -0
  74. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
  75. data/spec/acceptance/httpclient/httpclient_spec.rb +152 -11
  76. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +25 -16
  77. data/spec/acceptance/manticore/manticore_spec.rb +107 -0
  78. data/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
  79. data/spec/acceptance/net_http/net_http_shared.rb +52 -24
  80. data/spec/acceptance/net_http/net_http_spec.rb +164 -50
  81. data/spec/acceptance/net_http/net_http_spec_helper.rb +19 -10
  82. data/spec/acceptance/net_http/real_net_http_spec.rb +1 -1
  83. data/spec/acceptance/patron/patron_spec.rb +29 -40
  84. data/spec/acceptance/patron/patron_spec_helper.rb +15 -11
  85. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +229 -58
  86. data/spec/acceptance/shared/callbacks.rb +32 -30
  87. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +20 -5
  88. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +14 -14
  89. data/spec/acceptance/shared/precedence_of_stubs.rb +6 -6
  90. data/spec/acceptance/shared/request_expectations.rb +560 -296
  91. data/spec/acceptance/shared/returning_declared_responses.rb +180 -138
  92. data/spec/acceptance/shared/stubbing_requests.rb +385 -154
  93. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +78 -17
  94. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +19 -15
  95. data/spec/acceptance/webmock_shared.rb +2 -2
  96. data/spec/fixtures/test.txt +1 -0
  97. data/spec/quality_spec.rb +27 -3
  98. data/spec/spec_helper.rb +11 -20
  99. data/spec/support/failures.rb +9 -0
  100. data/spec/support/my_rack_app.rb +8 -3
  101. data/spec/support/network_connection.rb +7 -13
  102. data/spec/support/webmock_server.rb +8 -3
  103. data/spec/unit/api_spec.rb +175 -0
  104. data/spec/unit/errors_spec.rb +116 -19
  105. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +1 -1
  106. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +2 -2
  107. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +61 -0
  108. data/spec/unit/matchers/hash_including_matcher_spec.rb +87 -0
  109. data/spec/unit/rack_response_spec.rb +54 -16
  110. data/spec/unit/request_body_diff_spec.rb +90 -0
  111. data/spec/unit/request_execution_verifier_spec.rb +147 -39
  112. data/spec/unit/request_pattern_spec.rb +462 -198
  113. data/spec/unit/request_registry_spec.rb +29 -9
  114. data/spec/unit/request_signature_snippet_spec.rb +89 -0
  115. data/spec/unit/request_signature_spec.rb +91 -49
  116. data/spec/unit/request_stub_spec.rb +71 -70
  117. data/spec/unit/response_spec.rb +100 -81
  118. data/spec/unit/stub_registry_spec.rb +37 -20
  119. data/spec/unit/stub_request_snippet_spec.rb +51 -31
  120. data/spec/unit/util/hash_counter_spec.rb +6 -6
  121. data/spec/unit/util/hash_keys_stringifier_spec.rb +4 -4
  122. data/spec/unit/util/headers_spec.rb +4 -4
  123. data/spec/unit/util/json_spec.rb +29 -3
  124. data/spec/unit/util/query_mapper_spec.rb +157 -0
  125. data/spec/unit/util/uri_spec.rb +150 -36
  126. data/spec/unit/util/version_checker_spec.rb +15 -9
  127. data/spec/unit/webmock_spec.rb +57 -4
  128. data/test/http_request.rb +3 -3
  129. data/test/shared_test.rb +45 -13
  130. data/test/test_helper.rb +1 -1
  131. data/test/test_webmock.rb +6 -0
  132. data/webmock.gemspec +30 -11
  133. metadata +308 -199
  134. data/.rvmrc +0 -1
  135. data/.travis.yml +0 -11
  136. data/Guardfile +0 -24
  137. data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_0_x.rb +0 -151
  138. data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +0 -210
@@ -4,29 +4,126 @@ describe "errors" do
4
4
  describe WebMock::NetConnectNotAllowedError do
5
5
  describe "message" do
6
6
  it "should have message with request signature and snippet" do
7
- request_signature = mock(:to_s => "aaa")
8
- request_stub = mock
9
- WebMock::RequestStub.stub!(:from_request_signature).and_return(request_stub)
10
- WebMock::StubRequestSnippet.stub!(:new).
11
- with(request_stub).and_return(mock(:to_s => "bbb"))
12
- expected = "Real HTTP connections are disabled. Unregistered request: aaa" +
13
- "\n\nYou can stub this request with the following snippet:\n\n" +
14
- "bbb\n\n============================================================"
15
- WebMock::NetConnectNotAllowedError.new(request_signature).message.should == expected
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)
16
17
  end
17
18
 
18
19
  it "should have message with registered stubs if available" do
19
- request_signature = mock(:to_s => "aaa")
20
- request_stub = mock
21
- WebMock::StubRegistry.instance.stub!(:request_stubs).and_return([request_stub])
22
- WebMock::RequestStub.stub!(:from_request_signature).and_return(request_stub)
23
- WebMock::StubRequestSnippet.stub!(:new).
24
- with(request_stub).and_return(mock(:to_s => "bbb"))
25
- expected = "Real HTTP connections are disabled. Unregistered request: aaa" +
26
- "\n\nYou can stub this request with the following snippet:\n\n" +
27
- "bbb\n\nregistered request stubs:\n\nbbb\n\n============================================================"
28
- WebMock::NetConnectNotAllowedError.new(request_signature).message.should == expected
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
29
120
  end
30
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"]] }
31
128
  end
32
129
  end
@@ -9,7 +9,7 @@ describe WebMock::HttpLibAdapterRegistry do
9
9
  WebMock::HttpLibAdapterRegistry.instance.each_adapter {|n,a|
10
10
  adapters << [n, a]
11
11
  }
12
- adapters.should include([:my_lib, MyAdapter])
12
+ expect(adapters).to include([:my_lib, MyAdapter])
13
13
  WebMock::HttpLibAdapterRegistry.instance.
14
14
  http_lib_adapters.delete(:my_lib)
15
15
  end
@@ -4,8 +4,8 @@ describe WebMock::HttpLibAdapter do
4
4
  describe "adapter_for" do
5
5
  it "should add adapter to adapter registry" do
6
6
  class MyAdapter < WebMock::HttpLibAdapter; end
7
- WebMock::HttpLibAdapterRegistry.instance.
8
- should_receive(:register).with(:my_lib, MyAdapter)
7
+ expect(WebMock::HttpLibAdapterRegistry.instance).
8
+ to receive(:register).with(:my_lib, MyAdapter)
9
9
  MyAdapter.adapter_for(:my_lib)
10
10
  end
11
11
  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
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ module WebMock
4
+ module Matchers
5
+
6
+ describe HashIncludingMatcher do
7
+
8
+ it "stringifies the given hash keys" do
9
+ expect(HashIncludingMatcher.new(a: 1, b: 2)).to eq("a" => 1, "b" => 2)
10
+ end
11
+
12
+ it "sorts elements in the hash" do
13
+ expect(HashIncludingMatcher.new(b: 2, a: 1)).to eq("a" => 1, "b" => 2)
14
+ end
15
+
16
+ it "describes itself properly" do
17
+ expect(HashIncludingMatcher.new(a: 1).inspect).to eq "hash_including({\"a\"=>1})"
18
+ end
19
+
20
+ describe "success" do
21
+ it "matches the same hash" do
22
+ expect(HashIncludingMatcher.new("a" => 1, "b" => 2)).to eq("a" => 1, "b" => 2)
23
+ end
24
+
25
+ it "matches a hash with extra stuff" do
26
+ expect(HashIncludingMatcher.new(a: 1)).to eq("a" => 1, "b" => 2)
27
+ end
28
+
29
+ describe "when matching anythingized keys" do
30
+ let(:anything) { WebMock::Matchers::AnyArgMatcher.new(nil) }
31
+
32
+ it "matches an int against anything()" do
33
+ expect(HashIncludingMatcher.new(a: anything, b: 2)).to eq({'a' => 1, 'b' => 2})
34
+ end
35
+
36
+ it "matches a string against anything()" do
37
+ expect(HashIncludingMatcher.new(a: anything, b: 2)).to eq({'a' => "1", 'b' => 2})
38
+ end
39
+
40
+ it "matches if the key is present" do
41
+ expect(HashIncludingMatcher.new(a: anything)).to eq({'a' => 1, 'b' => 2})
42
+ end
43
+
44
+ it "matches if more keys are present" do
45
+ expect(HashIncludingMatcher.new(a: anything, b: anything)).to eq({'a' => 1, 'b' => 2, 'c' => 3})
46
+ end
47
+
48
+ it "matches if passed many keys and many key/value pairs" do
49
+ expect(HashIncludingMatcher.new(a: anything, b: anything, c: 3, e: 5)).to eq({'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5})
50
+ end
51
+ end
52
+
53
+ describe "when matching an empty hash" do
54
+ it "matches against any hash" do
55
+ expect(HashIncludingMatcher.new({})).to eq({a: 1, b: 2, c: 3})
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "failing" do
61
+ it "does not match a non-hash" do
62
+ expect(HashIncludingMatcher.new(a: 1)).not_to eq 1
63
+ end
64
+
65
+ it "does not match a hash with a missing key" do
66
+ expect(HashIncludingMatcher.new(a: 1)).not_to eq('b' => 2)
67
+ end
68
+
69
+ it "does not match an empty hash with a given key" do
70
+ expect(HashIncludingMatcher.new(a: 1)).not_to eq({})
71
+ end
72
+
73
+ it "does not match a hash with a missing key when one pair is matching" do
74
+ expect(HashIncludingMatcher.new(a: 1, b: 2)).not_to eq('b' => 2)
75
+ end
76
+
77
+ it "does not match a hash with an incorrect value" do
78
+ expect(HashIncludingMatcher.new(a: 1, b: 2)).not_to eq('a' => 1, 'b' => 3)
79
+ end
80
+
81
+ it "does not match when values are nil but keys are different" do
82
+ expect(HashIncludingMatcher.new(a: nil)).not_to eq('b' => nil)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe WebMock::RackResponse do
@@ -9,26 +10,36 @@ describe WebMock::RackResponse do
9
10
  request = WebMock::RequestSignature.new(:get, 'www.example.com')
10
11
  response = @rack_response.evaluate(request)
11
12
 
12
- response.status.first.should == 200
13
- response.body.should include('This is my root!')
13
+ expect(response.status.first).to eq(200)
14
+ expect(response.body).to include('This is my root!')
15
+ end
16
+
17
+ it "should set the reason phrase based on the status code" do
18
+ request = WebMock::RequestSignature.new(:get, 'www.example.com')
19
+ response = @rack_response.evaluate(request)
20
+ expect(response.status).to eq([200, "OK"])
21
+
22
+ request = WebMock::RequestSignature.new(:get, 'www.example.com/error')
23
+ response = @rack_response.evaluate(request)
24
+ expect(response.status).to eq([500, "Internal Server Error"])
14
25
  end
15
26
 
16
27
  it "should behave correctly when the rack response is not a simple array of strings" do
17
28
  request = WebMock::RequestSignature.new(:get, 'www.example.com/non_array_response')
18
29
  response = @rack_response.evaluate(request)
19
30
 
20
- response.status.first.should == 200
21
- response.body.should include('This is not in an array!')
31
+ expect(response.status.first).to eq(200)
32
+ expect(response.body).to include('This is not in an array!')
22
33
  end
23
34
 
24
35
  it "should shouldn't blow up when hitting a locked resource twice" do
25
36
  @locked_rack_response = WebMock::RackResponse.new(MyLockedRackApp)
26
- request = WebMock::RequestSignature.new(:get, 'www.example.com/locked')
27
- response = @locked_rack_response.evaluate(request)
37
+ request = WebMock::RequestSignature.new(:get, 'www.example.com/locked')
38
+ @locked_rack_response.evaluate(request)
28
39
  response2 = @locked_rack_response.evaluate(request)
29
40
 
30
- response2.body.should include('Single threaded response.')
31
- response2.status.first.should == 200
41
+ expect(response2.body).to include('Single threaded response.')
42
+ expect(response2.status.first).to eq(200)
32
43
  end
33
44
 
34
45
  it "should send along params" do
@@ -36,17 +47,44 @@ describe WebMock::RackResponse do
36
47
 
37
48
  response = @rack_response.evaluate(request)
38
49
 
39
- response.status.first.should == 200
40
- response.body.should include('Hello, Johnny')
50
+ expect(response.status.first).to eq(200)
51
+ expect(response.body).to include('Hello, Johnny')
41
52
  end
42
53
 
43
54
  it "should send along POST params" do
44
55
  request = WebMock::RequestSignature.new(:post, 'www.example.com/greet',
45
- :body => 'name=Jimmy'
56
+ body: 'name=Jimmy'
46
57
  )
47
58
 
48
59
  response = @rack_response.evaluate(request)
49
- response.body.should include('Good to meet you, Jimmy!')
60
+ expect(response.body).to include('Good to meet you, Jimmy!')
61
+ end
62
+
63
+ it "should send params with proper content length if params have non-ascii symbols" do
64
+ request = WebMock::RequestSignature.new(:post, 'www.example.com/greet',
65
+ body: 'name=Олег'
66
+ )
67
+
68
+ response = @rack_response.evaluate(request)
69
+ expect(response.body).to include('Good to meet you, Олег!')
70
+ end
71
+
72
+ describe 'rack error output' do
73
+ before :each do
74
+ @original_stderr = $stderr
75
+ $stderr = StringIO.new
76
+ end
77
+
78
+ after :each do
79
+ $stderr = @original_stderr
80
+ end
81
+
82
+ it 'should behave correctly when an app uses rack.errors' do
83
+ request = WebMock::RequestSignature.new(:get, 'www.example.com/error')
84
+
85
+ expect { @rack_response.evaluate(request) }.to_not raise_error
86
+ expect($stderr.length).to_not eq 0
87
+ end
50
88
  end
51
89
 
52
90
  describe 'basic auth request' do
@@ -60,15 +98,15 @@ describe WebMock::RackResponse do
60
98
  it 'should be failure when wrong credentials' do
61
99
  request = WebMock::RequestSignature.new(:get, 'foo:bar@www.example.com')
62
100
  response = @rack_response_with_basic_auth.evaluate(request)
63
- response.status.first.should == 401
64
- response.body.should_not include('This is my root!')
101
+ expect(response.status.first).to eq(401)
102
+ expect(response.body).not_to include('This is my root!')
65
103
  end
66
104
 
67
105
  it 'should be success when valid credentials' do
68
106
  request = WebMock::RequestSignature.new(:get, 'username:password@www.example.com')
69
107
  response = @rack_response_with_basic_auth.evaluate(request)
70
- response.status.first.should == 200
71
- response.body.should include('This is my root!')
108
+ expect(response.status.first).to eq(200)
109
+ expect(response.body).to include('This is my root!')
72
110
  end
73
111
  end
74
112
  end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe WebMock::RequestBodyDiff do
4
+ subject { WebMock::RequestBodyDiff.new(request_signature, request_stub) }
5
+
6
+ let(:uri) { "http://example.com" }
7
+ let(:method) { "GET" }
8
+
9
+ let(:request_stub) { WebMock::RequestStub.new(method, uri) }
10
+ let(:request_signature) { WebMock::RequestSignature.new(method, uri) }
11
+
12
+ let(:request_stub_body) { { "key" => "value"} }
13
+ let(:request_signature_body) { {"key" => "different value"}.to_json }
14
+
15
+ let(:request_pattern) {
16
+ WebMock::RequestPattern.new(
17
+ method, uri, {body: request_stub_body}
18
+ )
19
+ }
20
+
21
+ before :each do
22
+ request_stub.request_pattern = request_pattern
23
+ request_signature.headers = {"Content-Type" => "application/json"}
24
+ request_signature.body = request_signature_body
25
+ end
26
+
27
+ describe "#body_diff" do
28
+ context "request signature is unparseable json" do
29
+ let(:request_signature_body) { "youcan'tparsethis!" }
30
+
31
+ it "returns an empty hash" do
32
+ expect(subject.body_diff).to eq({})
33
+ end
34
+ end
35
+
36
+ context "request stub body as unparseable json" do
37
+ let(:request_stub_body) { "youcan'tparsethis!" }
38
+
39
+ it "returns an empty hash" do
40
+ expect(subject.body_diff).to eq({})
41
+ end
42
+ end
43
+
44
+ context "request stub body pattern is hash" do
45
+ let(:request_stub_body) { { "key" => "value"} }
46
+
47
+ it "generates a diff" do
48
+ expect(subject.body_diff).to eq(
49
+ [["~", "key", "different value", "value"]]
50
+ )
51
+ end
52
+ end
53
+
54
+ context "request signature doesn't have json headers" do
55
+ before :each do
56
+ request_signature.headers = {"Content-Type" => "application/xml"}
57
+ end
58
+
59
+ it "returns an empty hash" do
60
+ expect(subject.body_diff).to eq({})
61
+ end
62
+ end
63
+
64
+ context "request stub body pattern is a string" do
65
+ let(:request_stub_body) { { "key" => "value"}.to_json }
66
+
67
+ it "generates a diff" do
68
+ expect(subject.body_diff).to eq(
69
+ [["~", "key", "different value", "value"]]
70
+ )
71
+ end
72
+ end
73
+
74
+ context "stub request has no request pattern" do
75
+ let(:request_signature_body) { nil }
76
+
77
+ it "returns an empty hash" do
78
+ expect(subject.body_diff).to eq({})
79
+ end
80
+ end
81
+
82
+ context "stub request has no body pattern" do
83
+ let(:request_stub_body) { nil }
84
+
85
+ it "returns an empty hash" do
86
+ expect(subject.body_diff).to eq({})
87
+ end
88
+ end
89
+ end
90
+ end