shared_context "request expectations" do |*adapter_info|
describe "when request expectations are set" do
describe "when net connect is not allowed" do
before(:each) do
WebMock.disable_net_connect!
stub_request(:any, "http://www.example.com")
stub_request(:any, "https://www.example.com")
end
it "should satisfy expectation if request was executed with the same uri and method" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.once
}.not_to raise_error
end
it "should satisfy expectation declared on WebMock.resuest" do
expect {
http_request(:get, "http://www.example.com/")
expect(WebMock.request(:get, "http://www.example.com")).to have_been_made.once
}.not_to raise_error
end
it "should satisfy expectation if request was not expected and not executed" do
expect {
expect(a_request(:get, "http://www.example.com")).not_to have_been_made
}.not_to raise_error
end
it "should fail if request was not expected but executed" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).not_to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
it "should fail resulting with failure with a message and executed requests listed" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).not_to have_been_made
}.to fail_with(%r{The following requests were made:\n\nGET http://www.example.com/.+was made 1 time})
end
it "should fail if request was not executed" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed to different uri" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.org")).to have_been_made
}.to fail_with(%r(The request GET http://www.example.org/ was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed with different method" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:get, "http://www.example.com")).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times))
end
it "should satisfy expectation if request was executed with different form of uri" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "www.example.com")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with different form of uri without port " do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "www.example.com:80")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with different form of uri with port" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "www.example.com:80")).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed to a different port" do
expect {
http_request(:get, "http://www.example.com:80/")
expect(a_request(:get, "www.example.com:90")).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com:90/ was expected to execute 1 time but it executed 0 times))
end
it "should satisfy expectation if request was executed with different form of uri with https port" do
expect {
http_request(:get, "https://www.example.com/")
expect(a_request(:get, "https://www.example.com:443/")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectations even if requests were executed in different order than expectations were declared" do
stub_request(:post, "http://www.example.com")
http_request(:post, "http://www.example.com/", body: "def")
http_request(:post, "http://www.example.com/", body: "abc")
expect(WebMock).to have_requested(:post, "www.example.com").with(body: "abc")
expect(WebMock).to have_requested(:post, "www.example.com").with(body: "def")
end
describe "when matching requests with escaped or unescaped uris" do
before(:each) do
WebMock.disable_net_connect!
stub_request(:any, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
end
it "should satisfy expectation if request was executed with escaped params" do
expect {
http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
expect(a_request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with non escaped params" do
expect {
http_request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
expect(a_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with escaped params and uri matching regexp was expected" do
expect {
http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
expect(a_request(:get, /.*example.*/)).to have_been_made
}.not_to raise_error
end
end
describe "when matching requests with query params" do
before(:each) do
stub_request(:any, /.*example.*/)
end
it "should satisfy expectation if the request was executed with query params declared as a hash in a query option" do
expect {
http_request(:get, "http://www.example.com/?a[]=b&a[]=c")
expect(a_request(:get, "www.example.com").with(query: {"a" => ["b", "c"]})).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if the request was executed with query params declared as string in query option" do
expect {
http_request(:get, "http://www.example.com/?a[]=b&a[]=c")
expect(a_request(:get, "www.example.com").with(query: "a[]=b&a[]=c")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if the request was executed with query params both in uri and in query option" do
expect {
http_request(:get, "http://www.example.com/?x=3&a[]=b&a[]=c")
expect(a_request(:get, "www.example.com/?x=3").with(query: {"a" => ["b", "c"]})).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if the request was executed with only part query params declared as a hash in a query option" do
expect {
http_request(:get, "http://www.example.com/?a[]=b&a[]=c&b=1")
expect(a_request(:get, "www.example.com").with(query: hash_including({"a" => ["b", "c"]}))).to have_been_made
}.not_to raise_error
end
end
context "when using flat array notation" do
before :all do
WebMock::Config.instance.query_values_notation = :flat_array
end
it "should satisfy expectation if request includes different repeated query params in flat array notation" do
expect {
stub_request(:get, "http://www.example.com/?a=1&a=2")
http_request(:get, "http://www.example.com/?a=1&a=2")
expect(a_request(:get, "http://www.example.com/?a=1&a=2")).to have_been_made
}.not_to raise_error
end
after :all do
WebMock::Config.instance.query_values_notation = nil
end
end
describe "at_most_times" do
it "fails if request was made more times than maximum" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_times(2)
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute at most 2 times but it executed 3 times))
end
it "passes if request was made the maximum number of times" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_times(2)
}.not_to raise_error
end
it "passes if request was made fewer than the maximum number of times" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_times(2)
}.not_to raise_error
end
it "passes if request was not made at all" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_times(2)
}.not_to raise_error
end
end
describe "at_least_times" do
it "fails if request was made fewer times than minimum" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_times(2)
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute at least 2 times but it executed 1 time))
end
it "passes if request was made the minimum number of times" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_times(2)
}.not_to raise_error
end
it "passes if request was made more than the minimum number of times" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_times(2)
}.not_to raise_error
end
context "descriptive at_most_ matcher" do
context "at_most_once" do
it "succeeds if no request was executed" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_once
}.not_to raise_error
end
it "satisfies expectation if request was executed with the same uri and method once" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_once
}.not_to raise_error
end
it "fails if request was executed with the same uri and method twice" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_once
}.to fail
end
end
context "at_most_twice" do
it "succeeds if no request was executed" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_twice
}.not_to raise_error
end
it "succeeds if too few requests were executed" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_twice
}.not_to raise_error
end
it "satisfies expectation if request was executed with the same uri and method twice" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_twice
}.not_to raise_error
end
it "fails if request was executed with the same uri and method three times" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_most_twice
}.to fail
end
end
end
context "descriptive at_least_ matcher" do
context "at_least_once" do
it "fails if no request was executed" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_once
}.to fail
end
it "satisfies expectation if request was executed with the same uri and method once" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_once
}.not_to raise_error
end
it "satisfies expectation if request was executed with the same uri and method twice" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_once
}.not_to raise_error
end
end
context "at_least_twice" do
it "fails if no request was executed" do
expect {
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_twice
}.to fail
end
it "fails if too few requests were executed" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_twice
}.to fail
end
it "satisfies expectation if request was executed with the same uri and method twice" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_twice
}.not_to raise_error
end
it "satisfies expectation if request was executed with the same uri and method three times" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.at_least_twice
}.not_to raise_error
end
end
end
end
it "should fail if request was made more times than expected" do
expect {
http_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 1 time but it executed 2 times))
end
it "should fail if request was made less times than expected" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.twice
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 2 times but it executed 1 time))
end
it "should fail if request was made less times than expected when 3 times expected" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.times(3)
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 3 times but it executed 1 time))
end
it "should satisfy expectation if request was executed with the same body" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:post, "www.example.com").with(body: "abc")).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed with different body" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:post, "www.example.com").
with(body: "def")).to have_been_made
}.to fail_with(%r(The request POST http://www.example.com/ with body "def" was expected to execute 1 time but it executed 0 times))
end
describe "when expected request body is declared as a regexp" do
it "should satisfy expectation if request was executed with body matching regexp" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:post, "www.example.com").with(body: /^abc$/)).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed with body not matching regexp" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:post, "www.example.com").
with(body: /^xabc/)).to have_been_made
}.to fail_with(%r(The request POST http://www.example.com/ with body /\^xabc/ was expected to execute 1 time but it executed 0 times))
end
end
describe "when expected reqest body is declared as a hash" do
let(:body_hash) { {:a => '1', :b => 'five', 'c' => {'d' => ['e', 'f']}} }
let(:fail_message) {%r(The request POST http://www.example.com/ with body .+ was expected to execute 1 time but it executed 0 times)}
describe "when request is made with url encoded body matching hash" do
it "should satisfy expectation" do
expect {
http_request(:post, "http://www.example.com/", body: 'a=1&c[d][]=e&c[d][]=f&b=five')
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if url encoded params have different order" do
expect {
http_request(:post, "http://www.example.com/", body: 'a=1&c[d][]=e&b=five&c[d][]=f')
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should fail if request is executed with url encoded body not matching hash" do
expect {
http_request(:post, "http://www.example.com/", body: 'c[d][]=f&a=1&c[d][]=e')
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.to fail_with(fail_message)
end
end
describe "when request is executed with json body matching hash and Content-Type is set to json" do
it "should satisfy expectation" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
body: "{\"a\":\"1\",\"c\":{\"d\":[\"e\",\"f\"]},\"b\":\"five\"}")
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if json body is in different form" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
body: "{\"a\":\"1\",\"b\":\"five\",\"c\":{\"d\":[\"e\",\"f\"]}}")
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if json body contains date string" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
body: "{\"foo\":\"2010-01-01\"}")
expect(a_request(:post, "www.example.com").with(body: {"foo" => "2010-01-01"})).to have_been_made
}.not_to raise_error
end
end
describe "when request is executed with xml body matching hash and content type is set to xml" do
let(:body_hash) { { "opt" => {:a => "1", :b => 'five', 'c' => {'d' => ['e', 'f']}} }}
it "should satisfy expectation" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/xml'},
body: "\n \n e\n f\n \n\n")
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if xml body is in different form" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/xml'},
body: "\n \n e\n f\n \n\n")
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if xml body contains date string" do
expect {
http_request(:post, "http://www.example.com/", headers: {'Content-Type' => 'application/xml'},
body: "\n\n")
expect(a_request(:post, "www.example.com").with(body: {"opt" => {"foo" => "2010-01-01"}})).to have_been_made
}.not_to raise_error
end
end
end
describe "when expected reqest body is declared as a partial hash matcher" do
let(:body_hash) { hash_including({:a => '1', 'c' => {'d' => ['e', 'f']}}) }
let(:fail_message) {%r(The request POST http://www.example.com/ with body hash_including(.+) was expected to execute 1 time but it executed 0 times)}
describe "when request is made with url encoded body matching hash" do
it "should satisfy expectation" do
expect {
http_request(:post, "http://www.example.com/", body: 'a=1&c[d][]=e&c[d][]=f&b=five')
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.not_to raise_error
end
it "should fail if request is executed with url encoded body not matching hash" do
expect {
http_request(:post, "http://www.example.com/", body: 'c[d][]=f&a=1&c[d][]=e')
expect(a_request(:post, "www.example.com").with(body: body_hash)).to have_been_made
}.to fail_with(fail_message)
end
end
end
describe "when request with headers is expected" do
it "should satisfy expectation if request was executed with the same headers" do
expect {
http_request(:get, "http://www.example.com/", headers: SAMPLE_HEADERS)
expect(a_request(:get, "www.example.com").
with(headers: SAMPLE_HEADERS)).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with the same headers but with header value declared as array" do
expect {
http_request(:get, "http://www.example.com/", headers: {"a" => "b"})
expect(a_request(:get, "www.example.com").
with(headers: {"a" => ["b"]})).to have_been_made
}.not_to raise_error
end
describe "when multiple headers with the same key are passed" do
it "should satisfy expectation" do
expect {
http_request(:get, "http://www.example.com/", headers: {"a" => ["b", "c"]})
expect(a_request(:get, "www.example.com").
with(headers: {"a" => ["b", "c"]})).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation even if request was executed with the same headers but different order" do
expect {
http_request(:get, "http://www.example.com/", headers: {"a" => ["b", "c"]})
expect(a_request(:get, "www.example.com").
with(headers: {"a" => ["c", "b"]})).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed with different headers" do
expect {
http_request(:get, "http://www.example.com/", headers: {"a" => ["b", "c"]})
expect(a_request(:get, "www.example.com").
with(headers: {"a" => ["b", "d"]})).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ with headers \{'A'=>\['b', 'd'\]\} was expected to execute 1 time but it executed 0 times))
end
end
it "should fail if request was executed with different headers" do
expect {
http_request(:get, "http://www.example.com/", headers: SAMPLE_HEADERS)
expect(a_request(:get, "www.example.com").
with(headers: { 'Content-Length' => '9999'})).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ with headers \{'Content-Length'=>'9999'\} was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed with less headers" do
expect {
http_request(:get, "http://www.example.com/", headers: {'A' => 'a'})
expect(a_request(:get, "www.example.com").
with(headers: {'A' => 'a', 'B' => 'b'})).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ with headers \{'A'=>'a', 'B'=>'b'\} was expected to execute 1 time but it executed 0 times))
end
it "should satisfy expectation if request was executed with more headers" do
expect {
http_request(:get, "http://www.example.com/",
headers: {'A' => 'a', 'B' => 'b'}
)
expect(a_request(:get, "www.example.com").
with(headers: {'A' => 'a'})).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with body and headers but they were not specified in expectantion" do
expect {
http_request(:post, "http://www.example.com/",
body: "abc",
headers: SAMPLE_HEADERS
)
expect(a_request(:post, "www.example.com")).to have_been_made
}.not_to raise_error
end
it "should satisfy expectation if request was executed with headers matching regular expressions" do
expect {
http_request(:get, "http://www.example.com/", headers: { 'some-header' => 'MyAppName' })
expect(a_request(:get, "www.example.com").
with(headers: { some_header: /^MyAppName$/ })).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed with headers not matching regular expression" do
expect {
http_request(:get, "http://www.example.com/", headers: { 'some-header' => 'xMyAppName' })
expect(a_request(:get, "www.example.com").
with(headers: { some_header: /^MyAppName$/ })).to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ with headers \{'Some-Header'=>/\^MyAppName\$/\} was expected to execute 1 time but it executed 0 times))
end
end
describe "when expectation contains a request matching block" do
it "should satisfy expectation if request was executed and block evaluated to true" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
expect(a_request(:post, "www.example.com").with { |req| req.body == "wadus" }).to have_been_made
}.not_to raise_error
end
it "should fail if request was executed and block evaluated to false" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(a_request(:post, "www.example.com").with { |req| req.body == "wadus" }).to have_been_made
}.to fail_with(%r(The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was not expected but it executed and block matched request" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
expect(a_request(:post, "www.example.com").with { |req| req.body == "wadus" }).not_to have_been_made
}.to fail_with(%r(The request POST http://www.example.com/ with given block was not expected to execute but it executed 1 time))
end
end
describe "with userinfo", unless: (adapter_info.include?(:no_url_auth)) do
before(:each) do
stub_request(:any, "http://user:pass@www.example.com")
stub_request(:any, "http://user:pazz@www.example.com")
end
it "should satisfy expectation if request was executed with expected credentials" do
expect {
http_request(:get, "http://user:pass@www.example.com/")
expect(a_request(:get, "http://user:pass@www.example.com")).to have_been_made.once
}.not_to raise_error
end
it "should fail if request was executed with different credentials than expected" do
expect {
http_request(:get, "http://user:pass@www.example.com/")
expect(a_request(:get, "http://user:pazz@www.example.com")).to have_been_made.once
}.to fail_with(%r(The request GET http://user:pazz@www.example.com/ was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed without credentials and credentials were expected" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://user:pass@www.example.com")).to have_been_made.once
}.to fail_with(%r(The request GET http://user:pass@www.example.com/ was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed with credentials but expected without credentials" do
expect {
http_request(:get, "http://user:pass@www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made.once
}.to fail_with(%r(The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed with basic auth header but expected with credentials in userinfo" do
expect {
http_request(:get, "http://www.example.com/", basic_auth: ['user', 'pass'])
expect(a_request(:get, "http://user:pass@www.example.com")).to have_been_made.once
}.to fail_with(%r(The request GET http://user:pass@www.example.com/ was expected to execute 1 time but it executed 0 times))
end
end
describe "with basic authentication header" do
before(:each) do
stub_request(:any, "http://www.example.com").with(basic_auth: ['user', 'pass'])
stub_request(:any, "http://www.example.com").with(basic_auth: ['user', 'pazz'])
end
it "should satisfy expectation if request was executed with expected credentials" do
expect {
http_request(:get, "http://www.example.com/", basic_auth: ['user', 'pass'])
expect(a_request(:get, "http://www.example.com").with(basic_auth: ['user', 'pass'])).to have_been_made.once
}.not_to raise_error
end
it "should satisfy expectation if request was executed with expected credentials passed directly as header" do
expect {
http_request(:get, "http://www.example.com/", headers: {'Authorization'=>'Basic dXNlcjpwYXNz'})
expect(a_request(:get, "http://www.example.com").with(basic_auth: ['user', 'pass'])).to have_been_made.once
}.not_to raise_error
end
it "should fail if request was executed with different credentials than expected" do
expect {
http_request(:get, "http://www.example.com/", basic_auth: ['user', 'pass'])
expect(a_request(:get, "http://www.example.com").with(basic_auth: ['user', 'pazz'])).to have_been_made.once
}.to fail_with(%r(The request GET http://www.example.com/ with headers {'Authorization'=>'Basic dXNlcjpwYXp6'} was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was executed without credentials and credentials were expected" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com").with(basic_auth: ['user', 'pass'])).to have_been_made.once
}.to fail_with(%r(The request GET http://www.example.com/ with headers {'Authorization'=>'Basic dXNlcjpwYXNz'} was expected to execute 1 time but it executed 0 times))
end
it "should not fail if request was executed with credentials but expected despite credentials" do
expect {
http_request(:get, "http://www.example.com/", basic_auth: ['user', 'pass'])
expect(a_request(:get, "http://www.example.com")).to have_been_made.once
}.not_to raise_error
end
it "should fail if request was executed with basic auth header and credentials were provided in url", unless: (adapter_info.include?(:no_url_auth)) do
expect {
stub_request(:any, "http://user:pass@www.example.com")
http_request(:get, "http://user:pass@www.example.com/")
expect(a_request(:get, "http://www.example.com").with(basic_auth: ['user', 'pass'])).to have_been_made.once
}.to fail_with(%r(The request GET http://www.example.com/ with headers {'Authorization'=>'Basic dXNlcjpwYXNz'} was expected to execute 1 time but it executed 0 times))
end
end
describe "when expectations were set on WebMock object" do
it "should satisfy expectation if expected request was made" do
expect {
http_request(:get, "http://www.example.com/")
expect(WebMock).to have_requested(:get, "http://www.example.com").once
}.not_to raise_error
end
it "should satisfy expectation if request with body and headers was expected and request was made" do
expect {
http_request(:post, "http://www.example.com/", body: "abc", headers: {'A' => 'a'})
expect(WebMock).to have_requested(:post, "http://www.example.com").with(body: "abc", headers: {'A' => 'a'}).once
}.not_to raise_error
end
it "should fail if request expected not to be made was made" do
expect {
http_request(:get, "http://www.example.com/")
expect(WebMock).not_to have_requested(:get, "http://www.example.com")
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
it "should satisfy expectation if request was executed and expectation had block which evaluated to true" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
expect(WebMock).to have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
}.not_to raise_error
end
it "should fail if request was executed and expectation had block which evaluated to false" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
expect(WebMock).to have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
}.to fail_with(%r(The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times))
end
it "should fail if request was expected not to be made but was made and block matched request" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
expect(WebMock).not_to have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
}.to fail_with(%r(The request POST http://www.example.com/ with given block was not expected to execute but it executed 1 time))
end
end
describe "when expectation is declared using assert_requested" do
it "should satisfy expectation if requests was made" do
expect {
http_request(:get, "http://www.example.com/")
assert_requested(:get, "http://www.example.com", times: 1)
assert_requested(:get, "http://www.example.com")
}.not_to raise_error
end
it "should satisfy expectation if request was made with body and headers" do
expect {
http_request(:post, "http://www.example.com/", body: "abc", headers: {'A' => 'a'})
assert_requested(:post, "http://www.example.com", body: "abc", headers: {'A' => 'a'})
}.not_to raise_error
end
it "should fail if request expected not to be made was not wade" do
expect {
http_request(:get, "http://www.example.com/")
assert_not_requested(:get, "http://www.example.com")
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
it "should fail if request expected not to be made was made and expectation block evaluated to true" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
assert_not_requested(:post, "www.example.com") { |req| req.body == "wadus" }
}.to fail_with(%r(The request POST http://www.example.com/ with given block was not expected to execute but it executed 1 time))
end
it "should satisfy expectation if request was made and expectation block evaluated to true" do
expect {
http_request(:post, "http://www.example.com/", body: "wadus")
assert_requested(:post, "www.example.com") { |req| req.body == "wadus" }
}.not_to raise_error
end
it "should fail if request was made and expectation block evaluated to false" do
expect {
http_request(:post, "http://www.example.com/", body: "abc")
assert_requested(:post, "www.example.com") { |req| req.body == "wadus" }
}.to fail_with(%r(The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times))
end
end
describe "when expectation is declared using assert_requested" do
it "should satisfy expectation if requests was made" do
stub_http = stub_http_request(:get, "http://www.example.com")
expect {
http_request(:get, "http://www.example.com/")
assert_requested(stub_http, times: 1)
assert_requested(stub_http)
}.not_to raise_error
end
it "should fail if request expected not to be made was not wade" do
stub_http = stub_http_request(:get, "http://www.example.com")
expect {
http_request(:get, "http://www.example.com/")
assert_not_requested(stub_http)
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
end
end
describe "expectation is set on the request stub" do
it "should satisfy expectation if expected request was made" do
stub = stub_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(stub).to have_been_requested.once
end
it "should satisfy expectations if subsequent requests were made" do
stub = stub_request(:get, "http://www.example.com/")
http_request(:get, "http://www.example.com/")
expect(stub).to have_been_requested.once
http_request(:get, "http://www.example.com/")
expect(stub).to have_been_requested.twice
end
it "should satisfy expectation if expected request with body and headers was made" do
stub = stub_request(:post, "http://www.example.com").with(body: "abc", headers: {'A' => 'a'})
http_request(:post, "http://www.example.com/", body: "abc", headers: {'A' => 'a'})
expect(stub).to have_been_requested.once
end
it "should fail if request not expected to be made was made" do
expect {
stub = stub_request(:get, "http://www.example.com")
http_request(:get, "http://www.example.com/")
expect(stub).not_to have_been_requested
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
it "should fail request not expected to be made was made and expectation block evaluated to true" do
expect {
stub = stub_request(:post, "www.example.com").with { |req| req.body == "wadus" }
http_request(:post, "http://www.example.com/", body: "wadus")
expect(stub).not_to have_been_requested
}.to fail_with(%r(The request POST http://www.example.com/ with given block was not expected to execute but it executed 1 time))
end
it "should satisfy expectation if request was made and expectation block evaluated to true" do
stub = stub_request(:post, "www.example.com").with { |req| req.body == "wadus" }
http_request(:post, "http://www.example.com/", body: "wadus")
expect(stub).to have_been_requested
end
it "should satisfy expectation if request was made and expectation block evaluated to false" do
expect {
stub_request(:any, /.+/) #stub any request
stub = stub_request(:post, "www.example.com").with { |req| req.body == "wadus" }
http_request(:post, "http://www.example.com/", body: "abc")
expect(stub).to have_been_requested
}.to fail_with(%r(The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times))
end
end
describe "when net connect is allowed", net_connect: true do
before(:each) do
WebMock.allow_net_connect!
end
it "should satisfy expectation if expected requests was made" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).to have_been_made
}.not_to raise_error
end
it "should fail request expected not to be made, was made" do
expect {
http_request(:get, "http://www.example.com/")
expect(a_request(:get, "http://www.example.com")).not_to have_been_made
}.to fail_with(%r(The request GET http://www.example.com/ was not expected to execute but it executed 1 time))
end
end
end
end