pact-support 1.11.0 → 1.12.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/lib/pact/consumer_contract/consumer_contract.rb +11 -0
- data/lib/pact/consumer_contract/interaction.rb +4 -1
- data/lib/pact/consumer_contract/interaction_v2_parser.rb +9 -1
- data/lib/pact/consumer_contract/interaction_v3_parser.rb +10 -1
- data/lib/pact/support/version.rb +1 -1
- metadata +4 -227
- data/.github/ISSUE_TEMPLATE.md +0 -33
- data/.gitignore +0 -32
- data/.rspec +0 -3
- data/.travis.yml +0 -29
- data/Appraisals +0 -7
- data/Gemfile +0 -4
- data/RELEASING.md +0 -5
- data/Rakefile +0 -4
- data/gemfiles/default.gemfile +0 -5
- data/gemfiles/ruby_under_22.gemfile +0 -8
- data/pact-support.gemspec +0 -39
- data/script/release.sh +0 -9
- data/script/update-pact-specification-v2 +0 -9
- data/spec/fixtures/interaction-with-matching-rules.json +0 -27
- data/spec/fixtures/multipart-form-diff.txt +0 -9
- data/spec/fixtures/not-a-pact.json +0 -3
- data/spec/fixtures/pact-http-v2.json +0 -36
- data/spec/fixtures/pact-http-v3.json +0 -36
- data/spec/integration/matching_rules_extract_and_merge_spec.rb +0 -127
- data/spec/lib/pact/array_like_spec.rb +0 -37
- data/spec/lib/pact/configuration_spec.rb +0 -61
- data/spec/lib/pact/consumer/request_spec.rb +0 -25
- data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +0 -58
- data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +0 -142
- data/spec/lib/pact/consumer_contract/file_name_spec.rb +0 -24
- data/spec/lib/pact/consumer_contract/headers_spec.rb +0 -107
- data/spec/lib/pact/consumer_contract/http_consumer_contract_parser_spec.rb +0 -25
- data/spec/lib/pact/consumer_contract/interaction_parser_spec.rb +0 -62
- data/spec/lib/pact/consumer_contract/interaction_spec.rb +0 -121
- data/spec/lib/pact/consumer_contract/interaction_v2_parser_spec.rb +0 -54
- data/spec/lib/pact/consumer_contract/interaction_v3_parser_spec.rb +0 -48
- data/spec/lib/pact/consumer_contract/pact_file_spec.rb +0 -204
- data/spec/lib/pact/consumer_contract/query_hash_spec.rb +0 -154
- data/spec/lib/pact/consumer_contract/query_string_spec.rb +0 -131
- data/spec/lib/pact/consumer_contract/request_spec.rb +0 -486
- data/spec/lib/pact/consumer_contract/response_spec.rb +0 -82
- data/spec/lib/pact/helpers_spec.rb +0 -143
- data/spec/lib/pact/matchers/differ_spec.rb +0 -215
- data/spec/lib/pact/matchers/difference_spec.rb +0 -22
- data/spec/lib/pact/matchers/embedded_diff_formatter_spec.rb +0 -90
- data/spec/lib/pact/matchers/extract_diff_messages_spec.rb +0 -78
- data/spec/lib/pact/matchers/index_not_found_spec.rb +0 -21
- data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +0 -121
- data/spec/lib/pact/matchers/matchers_array_like_spec.rb +0 -222
- data/spec/lib/pact/matchers/matchers_messages_hash_and_array_spec.rb +0 -146
- data/spec/lib/pact/matchers/matchers_messages_mismatched_value_spec.rb +0 -72
- data/spec/lib/pact/matchers/matchers_messages_regexp_spec.rb +0 -103
- data/spec/lib/pact/matchers/matchers_spec.rb +0 -561
- data/spec/lib/pact/matchers/multipart_form_diff_formatter_spec.rb +0 -36
- data/spec/lib/pact/matchers/no_diff_at_index_spec.rb +0 -15
- data/spec/lib/pact/matchers/regexp_difference_spec.rb +0 -20
- data/spec/lib/pact/matchers/type_difference_spec.rb +0 -36
- data/spec/lib/pact/matchers/unexpected_index_spec.rb +0 -20
- data/spec/lib/pact/matchers/unexpected_key_spec.rb +0 -20
- data/spec/lib/pact/matchers/unix_diff_formatter_spec.rb +0 -235
- data/spec/lib/pact/matching_rules/extract_spec.rb +0 -216
- data/spec/lib/pact/matching_rules/merge_spec.rb +0 -436
- data/spec/lib/pact/matching_rules/v3/extract_spec.rb +0 -238
- data/spec/lib/pact/matching_rules/v3/merge_spec.rb +0 -485
- data/spec/lib/pact/matching_rules_spec.rb +0 -82
- data/spec/lib/pact/reification_spec.rb +0 -172
- data/spec/lib/pact/shared/dsl_spec.rb +0 -100
- data/spec/lib/pact/shared/form_differ_spec.rb +0 -71
- data/spec/lib/pact/shared/json_differ_spec.rb +0 -36
- data/spec/lib/pact/shared/key_not_found_spec.rb +0 -20
- data/spec/lib/pact/shared/multipart_form_differ_spec.rb +0 -49
- data/spec/lib/pact/shared/request_spec.rb +0 -235
- data/spec/lib/pact/shared/text_differ_spec.rb +0 -54
- data/spec/lib/pact/something_like_spec.rb +0 -23
- data/spec/lib/pact/support_spec.rb +0 -9
- data/spec/lib/pact/symbolize_keys_spec.rb +0 -15
- data/spec/lib/pact/term_spec.rb +0 -89
- data/spec/pact_specification/compliance-2.0.rb +0 -66
- data/spec/spec_helper.rb +0 -18
- data/spec/support/a_consumer-a_producer.json +0 -32
- data/spec/support/a_consumer-a_provider.json +0 -32
- data/spec/support/active_support_if_configured.rb +0 -6
- data/spec/support/case-insensitive-response-header-matching.json +0 -21
- data/spec/support/consumer_contract_template.json +0 -24
- data/spec/support/dsl_spec_support.rb +0 -7
- data/spec/support/factories.rb +0 -87
- data/spec/support/generated_index.md +0 -4
- data/spec/support/generated_markdown.md +0 -55
- data/spec/support/interaction_view_model.json +0 -63
- data/spec/support/interaction_view_model_with_terms.json +0 -50
- data/spec/support/markdown_pact.json +0 -48
- data/spec/support/missing_provider_states_output.txt +0 -25
- data/spec/support/options.json +0 -21
- data/spec/support/ruby_version_helpers.rb +0 -23
- data/spec/support/shared_examples_for_request.rb +0 -132
- data/spec/support/spec_support.rb +0 -29
- data/spec/support/stubbing.json +0 -22
- data/spec/support/term.json +0 -48
- data/spec/support/test_app_fail.json +0 -61
- data/spec/support/test_app_pass.json +0 -38
- data/spec/support/test_app_with_right_content_type_differ.json +0 -23
- data/tasks/release.rake +0 -5
- data/tasks/spec.rake +0 -14
@@ -1,121 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'pact/reification'
|
3
|
-
require 'pact/consumer_contract/interaction'
|
4
|
-
|
5
|
-
module Pact
|
6
|
-
module Consumer
|
7
|
-
|
8
|
-
describe Interaction do
|
9
|
-
|
10
|
-
let(:request) { {method: 'get', path: 'path'} }
|
11
|
-
let(:response) { {} }
|
12
|
-
|
13
|
-
describe "==" do
|
14
|
-
subject { InteractionFactory.create }
|
15
|
-
context "when other is the same" do
|
16
|
-
let(:other) { InteractionFactory.create }
|
17
|
-
it "returns true" do
|
18
|
-
expect(subject == other).to be true
|
19
|
-
end
|
20
|
-
end
|
21
|
-
context "when other is not the same" do
|
22
|
-
let(:other) { InteractionFactory.create(:request => {:path => '/a_different_path'}) }
|
23
|
-
it "returns false" do
|
24
|
-
expect(subject == other).to be false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
context "with a SomethingLike" do
|
28
|
-
let(:response) { {body: {age: SomethingLike.new(20)} } }
|
29
|
-
let(:other_response) { {body: {age: SomethingLike.new(20)} } }
|
30
|
-
let(:other) { InteractionFactory.create(response: other_response) }
|
31
|
-
subject { InteractionFactory.create response: response }
|
32
|
-
|
33
|
-
it "returns true" do
|
34
|
-
expect(subject == other).to be true
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "matches_criteria?" do
|
40
|
-
subject { InteractionFactory.create(:description => 'a request for food') }
|
41
|
-
|
42
|
-
context "by description" do
|
43
|
-
context "when the interaction matches" do
|
44
|
-
it "returns true" do
|
45
|
-
expect(subject.matches_criteria?(:description => /request.*food/)).to be true
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "when the interaction does not match" do
|
50
|
-
it "returns false" do
|
51
|
-
expect(subject.matches_criteria?(:description => /blah/)).to be false
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "request_modifies_resource_without_checking_response_body?" do
|
58
|
-
let(:interaction) { Interaction.new(request: request, response: response)}
|
59
|
-
|
60
|
-
subject { interaction.request_modifies_resource_without_checking_response_body?}
|
61
|
-
|
62
|
-
context "when the request modifies the resource and the response allows any value in body" do
|
63
|
-
let(:request) { instance_double(Pact::Request::Expected, modifies_resource?: true) }
|
64
|
-
let(:response) { instance_double(Pact::Response, body_allows_any_value?: true) }
|
65
|
-
|
66
|
-
it "returns true" do
|
67
|
-
expect(subject).to be true
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context "when the request modifies the resource and the response does not allow any value in body" do
|
72
|
-
let(:request) { instance_double(Pact::Request::Expected, modifies_resource?: true) }
|
73
|
-
let(:response) { instance_double(Pact::Response, body_allows_any_value?: false) }
|
74
|
-
|
75
|
-
it "returns false" do
|
76
|
-
expect(subject).to be false
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "when the request does not modifies the resource and the response does not allow any value in body" do
|
81
|
-
let(:request) { instance_double(Pact::Request::Expected, modifies_resource?: false) }
|
82
|
-
let(:response) { instance_double(Pact::Response, body_allows_any_value?: false) }
|
83
|
-
|
84
|
-
it "returns false" do
|
85
|
-
expect(subject).to be false
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context "when the request does not modifies the resource and the response allows any value in body" do
|
90
|
-
let(:request) { instance_double(Pact::Request::Expected, modifies_resource?: false) }
|
91
|
-
let(:response) { instance_double(Pact::Response, body_allows_any_value?: true) }
|
92
|
-
|
93
|
-
it "returns false" do
|
94
|
-
expect(subject).to be false
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
describe "#validate!" do
|
100
|
-
let(:interaction) { InteractionFactory.create }
|
101
|
-
|
102
|
-
context "when it lacks necessary data" do
|
103
|
-
before { interaction.description = nil }
|
104
|
-
|
105
|
-
it "raises Pact::InvalidInteractionError" do
|
106
|
-
expect { interaction.validate! }.to(raise_error(Pact::InvalidInteractionError) do |e|
|
107
|
-
expect(e.message).to include("description")
|
108
|
-
expect(e.message).not_to include("request")
|
109
|
-
end)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context "when it has all necessary data" do
|
114
|
-
it "does not raise any errors" do
|
115
|
-
expect { interaction.validate! }.not_to raise_error
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'pact/consumer_contract/interaction_v2_parser'
|
2
|
-
|
3
|
-
module Pact
|
4
|
-
describe InteractionV2Parser do
|
5
|
-
describe ".call" do
|
6
|
-
let(:interaction_hash) do
|
7
|
-
{
|
8
|
-
"description" => "description",
|
9
|
-
"request" => { "method" => "GET", "path" => "/" },
|
10
|
-
"response" => { "status" => 200 },
|
11
|
-
"providerState" => "foo"
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:options) do
|
16
|
-
{
|
17
|
-
pact_specification_version: Pact::SpecificationVersion.new("3.0")
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
subject { InteractionV2Parser.call(interaction_hash, options) }
|
22
|
-
|
23
|
-
describe "provider_states" do
|
24
|
-
it "returns an array of provider states with size 1" do
|
25
|
-
expect(subject.provider_states.size).to eq 1
|
26
|
-
end
|
27
|
-
|
28
|
-
it "sets the name of the provider state to the string provided" do
|
29
|
-
expect(subject.provider_states.first.name)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "sets the params to an empty hash" do
|
33
|
-
expect(subject.provider_states.first.params).to eq({})
|
34
|
-
end
|
35
|
-
|
36
|
-
context "when the providerState is nil" do
|
37
|
-
before do
|
38
|
-
interaction_hash["providerState"] = nil
|
39
|
-
end
|
40
|
-
|
41
|
-
it "returns an empty list" do
|
42
|
-
expect(subject.provider_states).to be_empty
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "provider_state" do
|
48
|
-
it "sets the name from the hash" do
|
49
|
-
expect(subject.provider_state).to eq "foo"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'pact/consumer_contract/interaction_v3_parser'
|
2
|
-
|
3
|
-
module Pact
|
4
|
-
describe InteractionV3Parser do
|
5
|
-
describe ".call" do
|
6
|
-
|
7
|
-
let(:interaction_hash) do
|
8
|
-
{
|
9
|
-
"description" => "description",
|
10
|
-
"request" => { "method" => "GET", "path" => "/" },
|
11
|
-
"response" => { "status" => 200 },
|
12
|
-
"providerStates" => [{
|
13
|
-
"name" => "foo",
|
14
|
-
"params" => {"a" => "b"}
|
15
|
-
}]
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
let(:options) do
|
20
|
-
{
|
21
|
-
pact_specification_version: Pact::SpecificationVersion.new("3.0")
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
subject { InteractionV3Parser.call(interaction_hash, options) }
|
26
|
-
|
27
|
-
describe "provider_states" do
|
28
|
-
it "parses the array of provider states" do
|
29
|
-
expect(subject.provider_states.size).to eq 1
|
30
|
-
end
|
31
|
-
|
32
|
-
it "parses the name of each" do
|
33
|
-
expect(subject.provider_states.first.name)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "parses the params of each" do
|
37
|
-
expect(subject.provider_states.first.params).to eq "a" => "b"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "provider_state" do
|
42
|
-
it "sets the provider_state string to the name of the first providerState for backwards compatibility while we implement v3" do
|
43
|
-
expect(subject.provider_state).to eq "foo"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,204 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'tempfile'
|
3
|
-
require 'pact/consumer_contract/pact_file'
|
4
|
-
require 'base64' # XXX: https://github.com/bblimke/webmock/pull/611
|
5
|
-
|
6
|
-
module Pact
|
7
|
-
describe PactFile do
|
8
|
-
describe 'render_pact' do
|
9
|
-
let(:uri_without_userinfo) { 'http://pactbroker.com'}
|
10
|
-
let(:pact_content) { 'api contract'}
|
11
|
-
|
12
|
-
describe 'from a local file URI' do
|
13
|
-
let(:temp_file) { Tempfile.new('local-pact-file') }
|
14
|
-
let(:file_uri) { temp_file.path }
|
15
|
-
let(:local_pact_content) { 'local pact content' }
|
16
|
-
before do
|
17
|
-
File.write file_uri, local_pact_content
|
18
|
-
end
|
19
|
-
after do
|
20
|
-
temp_file.unlink
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'reads from the local file system' do
|
24
|
-
expect(PactFile.render_pact(file_uri, {})).to eq(local_pact_content)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe 'with backslashes to a local path' do
|
29
|
-
let(:windows_path) { 'spec\support\a_consumer-a_provider.json' }
|
30
|
-
let(:unix_path) { 'spec/support/a_consumer-a_provider.json' }
|
31
|
-
|
32
|
-
it 'transforms them to forward slashes' do
|
33
|
-
expect(PactFile.read(windows_path)).to eq PactFile.read(unix_path)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'without basic authentication' do
|
38
|
-
before do
|
39
|
-
stub_request(:get, uri_without_userinfo).to_return(body: pact_content)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should open uri to get pact file content' do
|
43
|
-
expect(PactFile.render_pact(uri_without_userinfo, {})).to eq(pact_content)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'basic authentication' do
|
48
|
-
let(:username) { 'brokeruser'}
|
49
|
-
let(:password) { 'brokerpassword'}
|
50
|
-
let(:options) do
|
51
|
-
{ username: username, password: password }
|
52
|
-
end
|
53
|
-
before do
|
54
|
-
stub_request(:get, uri_without_userinfo).with(basic_auth: [username, password]).to_return(body: pact_content)
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when userinfo is specified in the option' do
|
58
|
-
it 'should open uri to get pact file content with userinfo in the options' do
|
59
|
-
expect(PactFile.render_pact(uri_without_userinfo, options)).to eq(pact_content)
|
60
|
-
end
|
61
|
-
|
62
|
-
let(:uri_with_userinfo) { 'http://dummyuser:dummyps@pactbroker.com'}
|
63
|
-
|
64
|
-
it 'should use userinfo in options which overwrites userinfo in url' do
|
65
|
-
expect(PactFile.render_pact(uri_with_userinfo, options)).to eq(pact_content)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'when user info is specified in url' do
|
70
|
-
let(:uri_with_userinfo) { "http://#{username}:#{password}@pactbroker.com"}
|
71
|
-
|
72
|
-
it 'should open uri to get pact file content with userinfo in the uri' do
|
73
|
-
expect(PactFile.render_pact(uri_with_userinfo, {})).to eq(pact_content)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'with a token' do
|
79
|
-
let(:token) { 'askfjlksjf'}
|
80
|
-
let(:options) { { token: token } }
|
81
|
-
|
82
|
-
let!(:request) do
|
83
|
-
stub_request(:get, uri_without_userinfo).with(headers: {'Authorization' => 'Bearer askfjlksjf'}).to_return(body: pact_content)
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'sets the Bearer Authorization header' do
|
87
|
-
PactFile.render_pact(uri_without_userinfo, options)
|
88
|
-
expect(request).to have_been_made
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
|
93
|
-
describe 'retry feature' do
|
94
|
-
before { allow(PactFile).to receive(:delay_retry).with(kind_of(Integer)) }
|
95
|
-
|
96
|
-
def render_pact(options = {})
|
97
|
-
PactFile.render_pact(uri_without_userinfo, options)
|
98
|
-
end
|
99
|
-
|
100
|
-
context 'with client error' do
|
101
|
-
before { stub_request(:get, uri_without_userinfo).to_return(status: 400) }
|
102
|
-
|
103
|
-
it 'raises client error without retrying' do
|
104
|
-
expect(PactFile).not_to receive(:delay_retry)
|
105
|
-
expect { render_pact }.to raise_error(PactFile::HttpError, /status=400/)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
context 'with single server error' do
|
110
|
-
before do
|
111
|
-
stub_request(:get, uri_without_userinfo).to_return(status: 500).
|
112
|
-
then.to_return(status: 200, body: pact_content)
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'retries and succeeds' do
|
116
|
-
expect(render_pact).to eq(pact_content)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'with continuous server errors' do
|
121
|
-
before { stub_request(:get, uri_without_userinfo).to_return(status: 500) }
|
122
|
-
|
123
|
-
it 'retries but failed by retry limit' do
|
124
|
-
expect { render_pact }.to raise_error(PactFile::HttpError, /status=500/)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
context 'with single open timeout' do
|
129
|
-
before do
|
130
|
-
stub_request(:get, uri_without_userinfo).to_raise(Net::OpenTimeout).
|
131
|
-
then.to_return(status: 200, body: pact_content)
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'retries and succeeds' do
|
135
|
-
expect(render_pact).to eq(pact_content)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
context 'with continuous open timeouts' do
|
140
|
-
before { stub_request(:get, uri_without_userinfo).to_raise(Net::OpenTimeout) }
|
141
|
-
|
142
|
-
it 'retries but failed by retry limit' do
|
143
|
-
expect { render_pact }.to raise_error(Net::OpenTimeout)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context 'with single read timeout' do
|
148
|
-
before do
|
149
|
-
stub_request(:get, uri_without_userinfo).to_raise(Net::ReadTimeout).
|
150
|
-
then.to_return(status: 200, body: pact_content)
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'retries and succeeds' do
|
154
|
-
expect(render_pact).to eq(pact_content)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
context 'with continuous read timeout' do
|
159
|
-
before { stub_request(:get, uri_without_userinfo).to_raise(Net::ReadTimeout) }
|
160
|
-
|
161
|
-
it 'retries but failed by retry limit' do
|
162
|
-
expect { render_pact }.to raise_error(Net::ReadTimeout)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'with retry_limit option and server error' do
|
167
|
-
before do
|
168
|
-
stub_request(:get, uri_without_userinfo).to_return(status: 500).
|
169
|
-
then.to_return(status: 200, body: pact_content)
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'retries and succeeds' do
|
173
|
-
expect { render_pact(retry_limit: 0) }.to raise_error(PactFile::HttpError, /status=500/)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
context 'with retry_limit option and open timeout error' do
|
178
|
-
before do
|
179
|
-
stub_request(:get, uri_without_userinfo).to_raise(Net::OpenTimeout).
|
180
|
-
then.to_return(status: 200, body: pact_content)
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'retries and succeeds' do
|
184
|
-
expect { render_pact(retry_limit: 0) }.to raise_error(Net::OpenTimeout)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
context 'with retry_limit option which is greater than default retry limit' do
|
189
|
-
before do
|
190
|
-
stub_request(:get, uri_without_userinfo).to_return(status: 500).
|
191
|
-
then.to_return(status: 500).
|
192
|
-
then.to_return(status: 500).
|
193
|
-
then.to_return(status: 500).
|
194
|
-
then.to_return(status: 200, body: pact_content)
|
195
|
-
end
|
196
|
-
|
197
|
-
it 'retries and succeeds' do
|
198
|
-
expect(render_pact(retry_limit: 4)).to eq(pact_content)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
@@ -1,154 +0,0 @@
|
|
1
|
-
require 'pact/consumer_contract/query_hash'
|
2
|
-
require 'pact/consumer_contract/query_string'
|
3
|
-
|
4
|
-
module Pact
|
5
|
-
describe QueryHash do
|
6
|
-
|
7
|
-
subject { QueryHash.new(query) }
|
8
|
-
|
9
|
-
let(:query) { { param: 'thing' } }
|
10
|
-
let(:query_with_array) { { param: ['thing'] } }
|
11
|
-
|
12
|
-
describe "difference" do
|
13
|
-
context "when the other is the same" do
|
14
|
-
|
15
|
-
let(:other) { QueryString.new('param=thing') }
|
16
|
-
|
17
|
-
it 'returns an empty diff' do
|
18
|
-
expect(subject.difference(other)).to be_empty
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "when the other is different" do
|
23
|
-
let(:other) { QueryString.new('param=thing1') }
|
24
|
-
|
25
|
-
it 'returns the diff' do
|
26
|
-
expect(subject.difference(other)).to_not be_empty
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "when the other has an extra param" do
|
31
|
-
let(:other) { QueryString.new('param=thing¶m2=blah') }
|
32
|
-
|
33
|
-
it 'returns the diff' do
|
34
|
-
expect(subject.difference(other)).to_not be_empty
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context "with nested query" do
|
39
|
-
let(:query) { { param: { a: { aa: '11', bb: '22' }, b: '2' } } }
|
40
|
-
|
41
|
-
context "when the other is same" do
|
42
|
-
let(:other) { QueryString.new('param[b]=2¶m[a][aa]=11¶m[a][bb]=22') }
|
43
|
-
|
44
|
-
it 'returns an empty diff' do
|
45
|
-
expect(subject.difference(other)).to be_empty
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "when the other has extra param" do
|
50
|
-
let(:other) { QueryString.new('param[b]=2¶m[c]=1') }
|
51
|
-
|
52
|
-
it 'returns the diff' do
|
53
|
-
expect(subject.difference(other)).not_to be_empty
|
54
|
-
expect(subject.difference(other).keys).to contain_exactly(:"param[a][aa]", :"param[a][bb]", :"param[c]")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context "when the other has different value with value difference" do
|
59
|
-
let(:other) { QueryString.new('param[b]=2¶m[a][aa]=00¶m[a][bb]=22') }
|
60
|
-
|
61
|
-
it 'returns the diff' do
|
62
|
-
expect(subject.difference(other)).not_to be_empty
|
63
|
-
expect(subject.difference(other).keys).to contain_exactly(:"param[a][aa]")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context "when the other has different value without structural difference" do
|
68
|
-
let(:other) { QueryString.new('param[b]=2¶m[a]=11') }
|
69
|
-
|
70
|
-
it 'returns the diff' do
|
71
|
-
expect(subject.difference(other)).not_to be_empty
|
72
|
-
expect(subject.difference(other).keys).to contain_exactly(:"param[a]", :"param[a][aa]", :"param[a][bb]")
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context "when there is an ArrayLike" do
|
77
|
-
let(:query) { { param: Pact.each_like("1") } }
|
78
|
-
let(:other) { QueryString.new('param=1¶m=2') }
|
79
|
-
|
80
|
-
it 'returns an empty diff' do
|
81
|
-
expect(subject.difference(other)).to be_empty
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe "#as_json" do
|
88
|
-
it "returns the query as a Hash" do
|
89
|
-
expect(subject.as_json).to eq query_with_array
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "#to_json" do
|
94
|
-
context "when the query contains an ArrayLike" do
|
95
|
-
let(:query) { { foo: Pact.each_like("1"), bar: "2" } }
|
96
|
-
let(:expected_json) do
|
97
|
-
{
|
98
|
-
foo: Pact.each_like("1"),
|
99
|
-
bar: ["2"]
|
100
|
-
}.to_json
|
101
|
-
end
|
102
|
-
|
103
|
-
it "serialises the ArrayLike without wrapping an array around it" do
|
104
|
-
expect(subject.to_json).to eq expected_json
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context "when the query contains a Pact::Term" do
|
109
|
-
let(:term) { Pact::Term.new(generate: "thing", matcher: /th/) }
|
110
|
-
let(:query) { { param: term } }
|
111
|
-
let(:query_with_array) { { param: [term] } }
|
112
|
-
|
113
|
-
it "serialises the Pact::Term as Ruby specific JSON" do
|
114
|
-
expect(subject.to_json).to eq query_with_array.to_json
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe "#==" do
|
120
|
-
context "when the query is not an identical match" do
|
121
|
-
let(:other) { QueryHash.new(param: 'other thing')}
|
122
|
-
it "returns false" do
|
123
|
-
expect(subject == other).to be false
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
context "when the query is an identical match" do
|
128
|
-
let(:other) { QueryHash.new(query) }
|
129
|
-
it "returns true" do
|
130
|
-
expect(subject == other).to be true
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe "#to_s" do
|
136
|
-
it "returns the query Hash as a string" do
|
137
|
-
expect(subject.to_s).to eq query_with_array.to_s
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
describe "#as_json" do
|
142
|
-
it "returns the query Hash" do
|
143
|
-
expect(subject.as_json).to eq query_with_array
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe "#to_json" do
|
148
|
-
it "returns the query Hash as JSON" do
|
149
|
-
expect(subject.to_json).to eq query_with_array.to_json
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
end
|
154
|
-
end
|