pact 1.0.9 → 1.0.10
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.
- data/CHANGELOG.md +20 -0
- data/Gemfile.lock +3 -3
- data/example/animal-service/Gemfile +14 -0
- data/example/animal-service/Gemfile.lock +67 -0
- data/example/animal-service/Rakefile +3 -0
- data/example/animal-service/spec/service_consumers/pact_helper.rb +24 -0
- data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +9 -0
- data/example/zoo-app/Gemfile.lock +2 -15
- data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +21 -6
- data/example/zoo-app/spec/service_providers/animal_service_spec.rb +1 -1
- data/lib/pact/consumer.rb +10 -11
- data/lib/pact/consumer/app_manager.rb +1 -0
- data/lib/pact/consumer/configuration.rb +179 -0
- data/lib/pact/consumer/interaction_builder.rb +1 -2
- data/lib/pact/consumer/mock_service.rb +1 -370
- data/lib/pact/consumer/mock_service/app.rb +70 -0
- data/lib/pact/consumer/mock_service/interaction_delete.rb +28 -0
- data/lib/pact/consumer/mock_service/interaction_list.rb +57 -0
- data/lib/pact/consumer/mock_service/interaction_post.rb +25 -0
- data/lib/pact/consumer/mock_service/interaction_replay.rb +126 -0
- data/lib/pact/consumer/mock_service/missing_interactions_get.rb +26 -0
- data/lib/pact/consumer/mock_service/rack_request_helper.rb +51 -0
- data/lib/pact/consumer/mock_service/startup_poll.rb +22 -0
- data/lib/pact/consumer/mock_service/verification_get.rb +35 -0
- data/lib/pact/consumer/mock_service_client.rb +3 -1
- data/lib/pact/consumer/mock_service_interaction_expectation.rb +33 -0
- data/lib/pact/consumer/request.rb +27 -0
- data/lib/pact/consumer/rspec.rb +1 -4
- data/lib/pact/consumer_contract/consumer_contract.rb +11 -8
- data/lib/pact/consumer_contract/interaction.rb +9 -22
- data/lib/pact/consumer_contract/request.rb +68 -0
- data/lib/pact/consumer_contract/service_consumer.rb +6 -2
- data/lib/pact/consumer_contract/service_provider.rb +6 -2
- data/lib/pact/matchers/index_not_found.rb +20 -0
- data/lib/pact/matchers/matchers.rb +14 -28
- data/lib/pact/matchers/unexpected_index.rb +17 -0
- data/lib/pact/matchers/unexpected_key.rb +17 -0
- data/lib/pact/provider.rb +1 -1
- data/lib/pact/provider/configuration.rb +129 -0
- data/lib/pact/provider/request.rb +59 -0
- data/lib/pact/provider/rspec.rb +4 -5
- data/lib/pact/provider/test_methods.rb +14 -52
- data/lib/pact/shared/dsl.rb +20 -0
- data/lib/pact/shared/key_not_found.rb +24 -0
- data/lib/pact/shared/null_expectation.rb +31 -0
- data/lib/pact/shared/request.rb +68 -0
- data/lib/pact/something_like.rb +7 -1
- data/lib/pact/symbolize_keys.rb +12 -0
- data/lib/pact/tasks.rb +1 -1
- data/lib/pact/tasks/task_helper.rb +23 -0
- data/lib/pact/{verification_task.rb → tasks/verification_task.rb} +4 -4
- data/lib/pact/version.rb +1 -1
- data/lib/tasks/pact.rake +5 -4
- data/pact.gemspec +1 -1
- data/spec/features/consumption_spec.rb +1 -73
- data/spec/features/production_spec.rb +3 -0
- data/spec/integration/consumer_spec.rb +170 -0
- data/spec/integration/pact/consumer_configuration_spec.rb +1 -1
- data/spec/lib/pact/consumer/{dsl_spec.rb → configuration_spec.rb} +10 -9
- data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +2 -2
- data/spec/lib/pact/consumer/interaction_builder_spec.rb +1 -1
- data/spec/lib/pact/consumer/mock_service/interaction_list_spec.rb +66 -0
- data/spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb +82 -0
- data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +54 -0
- data/spec/lib/pact/consumer/request_spec.rb +24 -0
- data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +1 -1
- data/spec/lib/pact/consumer_contract/interaction_spec.rb +0 -34
- data/spec/lib/pact/{request_spec.rb → consumer_contract/request_spec.rb} +45 -121
- data/spec/lib/pact/matchers/matchers_spec.rb +29 -13
- data/spec/lib/pact/provider/configuration_spec.rb +163 -0
- data/spec/lib/pact/provider/request_spec.rb +78 -0
- data/spec/lib/pact/provider/test_methods_spec.rb +0 -30
- data/spec/lib/pact/verification_task_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -0
- data/spec/support/factories.rb +5 -1
- data/spec/support/pact_helper.rb +6 -0
- data/spec/support/shared_examples_for_request.rb +83 -0
- data/spec/support/test_app_fail.json +3 -0
- data/spec/support/test_app_pass.json +18 -1
- metadata +68 -31
- data/lib/pact/consumer/dsl.rb +0 -157
- data/lib/pact/pact_task_helper.rb +0 -21
- data/lib/pact/provider/dsl.rb +0 -115
- data/lib/pact/request.rb +0 -167
- data/spec/lib/pact/consumer/mock_service_spec.rb +0 -143
- data/spec/lib/pact/provider/dsl_spec.rb +0 -179
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer/mock_service/rack_request_helper'
|
3
|
+
|
4
|
+
module Pact::Consumer
|
5
|
+
|
6
|
+
describe RackRequestHelper do
|
7
|
+
class TestSubject
|
8
|
+
include RackRequestHelper
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:rack_env) {
|
12
|
+
{
|
13
|
+
"CONTENT_LENGTH" => "16",
|
14
|
+
"CONTENT_TYPE" => content_type,
|
15
|
+
"GATEWAY_INTERFACE" => "CGI/1.1",
|
16
|
+
"PATH_INFO" => "/donuts",
|
17
|
+
"QUERY_STRING" => "",
|
18
|
+
"REMOTE_ADDR" => "127.0.0.1",
|
19
|
+
"REMOTE_HOST" => "localhost",
|
20
|
+
"REQUEST_METHOD" => "POST",
|
21
|
+
"REQUEST_URI" => "http://localhost:4321/donuts",
|
22
|
+
"SCRIPT_NAME" => "",
|
23
|
+
"SERVER_NAME" => "localhost",
|
24
|
+
"SERVER_PORT" => "4321",
|
25
|
+
"SERVER_PROTOCOL" => "HTTP/1.1",
|
26
|
+
"SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/1.9.3/2013-02-22)",
|
27
|
+
"HTTP_ACCEPT" => "text/plain",
|
28
|
+
"HTTP_USER_AGENT" => "Ruby",
|
29
|
+
"HTTP_HOST" => "localhost:4321",
|
30
|
+
"rack.version" => [1, 2 ],
|
31
|
+
"rack.input" => StringIO.new(body),
|
32
|
+
"rack.errors" => nil,
|
33
|
+
"rack.multithread" => true,
|
34
|
+
"rack.multiprocess" => false,
|
35
|
+
"rack.run_once" => false,
|
36
|
+
"rack.url_scheme" => "http",
|
37
|
+
"HTTP_VERSION" => "HTTP/1.1",
|
38
|
+
"REQUEST_PATH" => "/donuts"
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
subject { TestSubject.new }
|
43
|
+
|
44
|
+
let(:expected_request) {
|
45
|
+
{
|
46
|
+
:query => "",
|
47
|
+
:method => "post",
|
48
|
+
:body => expected_body,
|
49
|
+
:path => "/donuts",
|
50
|
+
:headers => {
|
51
|
+
"Content-Type" => content_type,
|
52
|
+
"Accept" => "text/plain",
|
53
|
+
"User-Agent" => "Ruby",
|
54
|
+
"Host" => "localhost:4321",
|
55
|
+
"Version" => "HTTP/1.1"
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
context "with a text body" do
|
61
|
+
let(:content_type) { "application/x-www-form-urlencoded" }
|
62
|
+
let(:body) { 'this is the body' }
|
63
|
+
let(:expected_body) { body }
|
64
|
+
|
65
|
+
it "extracts the body" do
|
66
|
+
expect(subject.request_as_hash_from(rack_env)).to eq expected_request
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "with a json body" do
|
71
|
+
let(:content_type) { "application/json" }
|
72
|
+
let(:body) { '{"a" : "body" }' }
|
73
|
+
let(:expected_body) { {"a" => "body"} }
|
74
|
+
|
75
|
+
it "extracts the body" do
|
76
|
+
expect(subject.request_as_hash_from(rack_env)).to eq expected_request
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer/mock_service_interaction_expectation'
|
3
|
+
|
4
|
+
describe Pact::Consumer::MockServiceInteractionExpectation do
|
5
|
+
describe "as_json" do
|
6
|
+
let(:options ) { {} }
|
7
|
+
let(:request_as_json) { {a: 'request'} }
|
8
|
+
let(:request) { instance_double('Pact::Request::Expected', :as_json => request_as_json, :options => options)}
|
9
|
+
let(:response) { double('response') }
|
10
|
+
let(:generated_response ) { double('generated_response', :to_json => 'generated_response') }
|
11
|
+
let(:interaction) { instance_double('Pact::Interaction', :description => 'description', :request => request, :response => response, :provider_state => 'some state') }
|
12
|
+
subject { described_class.new(interaction)}
|
13
|
+
let(:expected_hash) { {:response => generated_response, :request => as_json_with_options, :description => '' } }
|
14
|
+
|
15
|
+
before do
|
16
|
+
Pact::Reification.stub(:from_term).with(response).and_return(generated_response)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "generates an actual response" do
|
20
|
+
Pact::Reification.should_receive(:from_term).with(response).and_return(generated_response)
|
21
|
+
expect(subject.as_json[:response]).to eq generated_response
|
22
|
+
end
|
23
|
+
|
24
|
+
it "includes the options in the request" do
|
25
|
+
expect(subject.as_json[:request]).to eq request_as_json
|
26
|
+
end
|
27
|
+
|
28
|
+
it "includes the provider state" do
|
29
|
+
expect(subject.as_json[:provider_state]).to eq 'some state'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "includes the description" do
|
33
|
+
expect(subject.as_json[:description]).to eq 'description'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "doesn't have any other keys" do
|
37
|
+
expect(subject.as_json.keys).to eq [:description, :provider_state, :request, :response]
|
38
|
+
end
|
39
|
+
|
40
|
+
context "without options" do
|
41
|
+
it "does not include the options key" do
|
42
|
+
expect(subject.as_json.key?(:options)).to be_false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with options" do
|
47
|
+
let(:options) { {:opts => 'blah'} }
|
48
|
+
it "includes the options in the request hash" do
|
49
|
+
expect(subject.as_json[:request][:options]).to eq options
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/shared_examples_for_request'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
describe Consumer::Request::Actual do
|
6
|
+
it_behaves_like "a request"
|
7
|
+
|
8
|
+
let(:raw_request) do
|
9
|
+
{
|
10
|
+
'method' => 'get',
|
11
|
+
'path' => '/mallory'
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "from_hash" do
|
16
|
+
context "when field are not defined" do
|
17
|
+
subject { described_class.from_hash(raw_request) }
|
18
|
+
it "raises an error" do
|
19
|
+
expect{subject}.to raise_error KeyError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -45,7 +45,7 @@ module Pact
|
|
45
45
|
describe ".from_json" do
|
46
46
|
let(:loaded_pact) { ConsumerContract.from_json(string) }
|
47
47
|
context "when the top level object is a ConsumerContract" do
|
48
|
-
let(:string) { '{"interactions":[{"request": {"path":"/path", "method" : "get"}}], "consumer": {"name" : "Bob"} }' }
|
48
|
+
let(:string) { '{"interactions":[{"request": {"path":"/path", "method" : "get"}}], "consumer": {"name" : "Bob"} , "provider": {"name" : "Mary"} }' }
|
49
49
|
|
50
50
|
it "should create a Pact" do
|
51
51
|
loaded_pact.should be_instance_of ConsumerContract
|
@@ -39,40 +39,6 @@ module Pact
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
describe "as_json_for_mock_service" do
|
43
|
-
let(:as_json_with_options ) { {:opts => 'blah'} }
|
44
|
-
let(:request) { double(Pact::Request::Expected, :as_json_with_options => {:opts => 'blah'})}
|
45
|
-
let(:response) { double('response') }
|
46
|
-
let(:generated_response ) { double('generated_response', :to_json => 'generated_response') }
|
47
|
-
subject { Interaction.new(:description => 'description', :request => request, :response => response, :provider_state => 'some state')}
|
48
|
-
let(:expected_hash) { {:response => generated_response, :request => as_json_with_options, :description => '' } }
|
49
|
-
|
50
|
-
before do
|
51
|
-
Reification.stub(:from_term).with(response).and_return(generated_response)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "generates an actual response" do
|
55
|
-
Reification.should_receive(:from_term).with(response).and_return(generated_response)
|
56
|
-
expect(subject.as_json_for_mock_service[:response]).to eq generated_response
|
57
|
-
end
|
58
|
-
|
59
|
-
it "includes the options in the request" do
|
60
|
-
expect(subject.as_json_for_mock_service[:request]).to eq as_json_with_options
|
61
|
-
end
|
62
|
-
|
63
|
-
it "includes the provider state" do
|
64
|
-
expect(subject.as_json_for_mock_service[:provider_state]).to eq 'some state'
|
65
|
-
end
|
66
|
-
|
67
|
-
it "includes the description" do
|
68
|
-
expect(subject.as_json_for_mock_service[:description]).to eq 'description'
|
69
|
-
end
|
70
|
-
|
71
|
-
it "doesn't have any other keys" do
|
72
|
-
expect(subject.as_json_for_mock_service.keys).to eq [:response, :request, :description, :provider_state]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
42
|
describe "to JSON" do
|
77
43
|
let(:request) do
|
78
44
|
{
|
@@ -1,107 +1,35 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'pact/request'
|
2
|
+
require 'pact/consumer_contract/request'
|
3
|
+
require 'pact/consumer/request'
|
4
|
+
require 'support/shared_examples_for_request'
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
describe 'matching' do
|
7
|
-
let(:expected) do
|
8
|
-
Pact::Request::Expected.from_hash(
|
9
|
-
{'method' => 'get', 'path' => 'path', 'query' => /b/}
|
10
|
-
)
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:actual) do
|
14
|
-
Pact::Request::Actual.from_hash({'method' => 'get', 'path' => 'path', 'query' => 'blah'})
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should match" do
|
18
|
-
expect(expected.difference(actual)).to eq({})
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'full_path' do
|
23
|
-
context "with empty path" do
|
24
|
-
subject { described_class.from_hash({:path => '', :method => 'get'}) }
|
25
|
-
it "returns the full path"do
|
26
|
-
expect(subject.full_path).to eq "/"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
context "with a path" do
|
30
|
-
subject { described_class.from_hash({:path => '/path', :method => 'get'}) }
|
31
|
-
it "returns the full path"do
|
32
|
-
expect(subject.full_path).to eq "/path"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
context "with a path and query" do
|
36
|
-
subject { described_class.from_hash({:path => '/path', :method => 'get', :query => "something"}) }
|
37
|
-
it "returns the full path"do
|
38
|
-
expect(subject.full_path).to eq "/path?something"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
6
|
+
module Pact
|
42
7
|
|
43
|
-
describe
|
8
|
+
describe Request::Expected do
|
9
|
+
it_behaves_like "a request"
|
44
10
|
|
45
11
|
let(:raw_request) do
|
46
12
|
{
|
47
13
|
'method' => 'get',
|
48
|
-
'path' => '/mallory'
|
49
|
-
'headers' => {
|
50
|
-
'Content-Type' => 'application/json'
|
51
|
-
},
|
52
|
-
'body' => 'hello mallory'
|
14
|
+
'path' => '/mallory'
|
53
15
|
}
|
54
16
|
end
|
55
17
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
it "blows up if method is absent" do
|
64
|
-
raw_request.delete 'method'
|
65
|
-
expect { described_class.from_hash(raw_request) }.to raise_error
|
66
|
-
end
|
67
|
-
|
68
|
-
it "blows up if path is absent" do
|
69
|
-
raw_request.delete 'path'
|
70
|
-
expect { described_class.from_hash(raw_request) }.to raise_error
|
71
|
-
end
|
72
|
-
|
73
|
-
it "does not blow up if body is missing" do
|
74
|
-
raw_request.delete 'body'
|
75
|
-
expect { described_class.from_hash(raw_request) }.to_not raise_error
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
module Pact
|
82
|
-
|
83
|
-
describe Request::Expected do
|
84
|
-
it_behaves_like "a request"
|
85
|
-
|
86
|
-
describe "as_json_with_options" do
|
87
|
-
subject { Request::Expected.new(:get, '/path', {:header => 'value'}, {:body => 'yeah'}, "query", options) }
|
88
|
-
context "with options" do
|
89
|
-
let(:options) { {some: 'options'} }
|
90
|
-
it "includes the options" do
|
91
|
-
expect(subject.as_json_with_options[:options]).to eq options
|
92
|
-
end
|
93
|
-
end
|
94
|
-
context "without options" do
|
95
|
-
let(:options) { {} }
|
96
|
-
it "does not include the options" do
|
97
|
-
expect(subject.as_json_with_options.key?(:options)).to be_false
|
18
|
+
describe "from_hash" do
|
19
|
+
context "when optional field are not defined" do
|
20
|
+
subject { described_class.from_hash(raw_request) }
|
21
|
+
it "sets their values to NullExpectation" do
|
22
|
+
expect(subject.body).to be_instance_of(Pact::NullExpectation)
|
23
|
+
expect(subject.query).to be_instance_of(Pact::NullExpectation)
|
24
|
+
expect(subject.headers).to be_instance_of(Pact::NullExpectation)
|
98
25
|
end
|
99
26
|
end
|
100
|
-
end
|
27
|
+
end
|
28
|
+
|
101
29
|
describe "as_json" do
|
102
30
|
subject { Request::Expected.new(:get, '/path', {:header => 'value'}, {:body => 'yeah'}, "query", {some: 'options'}) }
|
103
31
|
context "with options" do
|
104
|
-
it "does not include the options" do
|
32
|
+
it "does not include the options because they are a temporary hack and should leave no trace of themselves in the pact file" do
|
105
33
|
expect(subject.as_json.key?(:options)).to be_false
|
106
34
|
end
|
107
35
|
end
|
@@ -114,20 +42,20 @@ module Pact
|
|
114
42
|
|
115
43
|
let(:expected_method) { 'get' }
|
116
44
|
let(:expected_path) { '/foo' }
|
117
|
-
let(:expected_headers) {
|
118
|
-
let(:expected_body) {
|
45
|
+
let(:expected_headers) { Pact::NullExpectation.new }
|
46
|
+
let(:expected_body) { Pact::NullExpectation.new }
|
119
47
|
let(:expected_query) { '' }
|
120
48
|
|
121
|
-
let(:actual_request) { Request::Actual.new(actual_method, actual_path, actual_headers, actual_body, actual_query) }
|
49
|
+
let(:actual_request) { Consumer::Request::Actual.new(actual_method, actual_path, actual_headers, actual_body, actual_query) }
|
122
50
|
|
123
51
|
let(:actual_method) { 'get' }
|
124
52
|
let(:actual_path) { '/foo' }
|
125
|
-
let(:actual_headers) {
|
126
|
-
let(:actual_body) {
|
53
|
+
let(:actual_headers) { {} }
|
54
|
+
let(:actual_body) { '' }
|
127
55
|
let(:actual_query) { '' }
|
128
56
|
|
129
57
|
it "matches identical requests" do
|
130
|
-
expect(subject.
|
58
|
+
expect(subject.matches? actual_request).to be_true
|
131
59
|
end
|
132
60
|
|
133
61
|
context "when the methods are the same but one is symbolized" do
|
@@ -135,7 +63,7 @@ module Pact
|
|
135
63
|
let(:actual_method) { 'get' }
|
136
64
|
|
137
65
|
it "matches" do
|
138
|
-
expect(subject.
|
66
|
+
expect(subject.matches? actual_request).to be_true
|
139
67
|
end
|
140
68
|
end
|
141
69
|
|
@@ -144,7 +72,7 @@ module Pact
|
|
144
72
|
let(:actual_method) { 'post' }
|
145
73
|
|
146
74
|
it "does not match" do
|
147
|
-
expect(subject.
|
75
|
+
expect(subject.matches? actual_request).to be_false
|
148
76
|
end
|
149
77
|
end
|
150
78
|
|
@@ -153,7 +81,7 @@ module Pact
|
|
153
81
|
let(:actual_path) { '/bar' }
|
154
82
|
|
155
83
|
it "does not match" do
|
156
|
-
expect(subject.
|
84
|
+
expect(subject.matches? actual_request).to be_false
|
157
85
|
end
|
158
86
|
end
|
159
87
|
|
@@ -162,7 +90,7 @@ module Pact
|
|
162
90
|
let(:actual_path) { '/foo/' }
|
163
91
|
|
164
92
|
it "matches" do
|
165
|
-
expect(subject.
|
93
|
+
expect(subject.matches? actual_request).to be_true
|
166
94
|
end
|
167
95
|
end
|
168
96
|
|
@@ -171,16 +99,16 @@ module Pact
|
|
171
99
|
let(:actual_body) { '' }
|
172
100
|
|
173
101
|
it "does not match" do
|
174
|
-
expect(subject.
|
102
|
+
expect(subject.matches? actual_request).to be_false
|
175
103
|
end
|
176
104
|
end
|
177
105
|
|
178
106
|
context "when the expected body has no expectation and the actual body is empty" do
|
179
|
-
let(:expected_body) {
|
107
|
+
let(:expected_body) { Pact::NullExpectation.new }
|
180
108
|
let(:actual_body) { '' }
|
181
109
|
|
182
110
|
it "matches" do
|
183
|
-
expect(subject.
|
111
|
+
expect(subject.matches? actual_request).to be_true
|
184
112
|
end
|
185
113
|
end
|
186
114
|
|
@@ -194,7 +122,7 @@ module Pact
|
|
194
122
|
let(:actual_body) { nil }
|
195
123
|
|
196
124
|
it "does not match" do
|
197
|
-
expect(subject.
|
125
|
+
expect(subject.matches? actual_request).to be_false
|
198
126
|
end
|
199
127
|
end
|
200
128
|
|
@@ -203,7 +131,7 @@ module Pact
|
|
203
131
|
let(:actual_body) { 'bar' }
|
204
132
|
|
205
133
|
it "does not match" do
|
206
|
-
expect(subject.
|
134
|
+
expect(subject.matches? actual_request).to be_false
|
207
135
|
end
|
208
136
|
end
|
209
137
|
|
@@ -223,7 +151,7 @@ module Pact
|
|
223
151
|
end
|
224
152
|
|
225
153
|
it "matches" do
|
226
|
-
expect(subject.
|
154
|
+
expect(subject.matches? actual_request).to be_true
|
227
155
|
end
|
228
156
|
end
|
229
157
|
|
@@ -243,7 +171,7 @@ module Pact
|
|
243
171
|
end
|
244
172
|
|
245
173
|
it "does not match" do
|
246
|
-
expect(subject.
|
174
|
+
expect(subject.matches? actual_request).to be_false
|
247
175
|
end
|
248
176
|
end
|
249
177
|
|
@@ -263,7 +191,7 @@ module Pact
|
|
263
191
|
end
|
264
192
|
|
265
193
|
it "matches" do
|
266
|
-
expect(subject.
|
194
|
+
expect(subject.matches? actual_request).to be_true
|
267
195
|
end
|
268
196
|
end
|
269
197
|
|
@@ -283,7 +211,7 @@ module Pact
|
|
283
211
|
end
|
284
212
|
|
285
213
|
it "does not match" do
|
286
|
-
expect(subject.
|
214
|
+
expect(subject.matches? actual_request).to be_false
|
287
215
|
end
|
288
216
|
end
|
289
217
|
|
@@ -303,7 +231,7 @@ module Pact
|
|
303
231
|
end
|
304
232
|
|
305
233
|
it "does not match" do
|
306
|
-
expect(subject.
|
234
|
+
expect(subject.matches? actual_request).to be_false
|
307
235
|
end
|
308
236
|
end
|
309
237
|
context "when the expected body contains non-matching hash where one field contains a substring of the other" do
|
@@ -320,7 +248,7 @@ module Pact
|
|
320
248
|
end
|
321
249
|
|
322
250
|
it "does not match" do
|
323
|
-
expect(subject.
|
251
|
+
expect(subject.matches? actual_request).to be_false
|
324
252
|
end
|
325
253
|
end
|
326
254
|
|
@@ -340,7 +268,7 @@ module Pact
|
|
340
268
|
end
|
341
269
|
|
342
270
|
it "does not match" do
|
343
|
-
expect(subject.
|
271
|
+
expect(subject.matches? actual_request).to be_true
|
344
272
|
end
|
345
273
|
end
|
346
274
|
|
@@ -349,16 +277,16 @@ module Pact
|
|
349
277
|
let(:actual_query) { 'bar' }
|
350
278
|
|
351
279
|
it "does not match" do
|
352
|
-
expect(subject.
|
280
|
+
expect(subject.matches? actual_request).to be_false
|
353
281
|
end
|
354
282
|
end
|
355
283
|
|
356
284
|
context 'when there is no query expectation' do
|
357
|
-
let(:expected_query) {
|
285
|
+
let(:expected_query) { Pact::NullExpectation.new }
|
358
286
|
let(:actual_query) { 'bar' }
|
359
287
|
|
360
288
|
it 'matches' do
|
361
|
-
expect(subject.
|
289
|
+
expect(subject.matches? actual_request).to be_true
|
362
290
|
end
|
363
291
|
end
|
364
292
|
|
@@ -367,7 +295,7 @@ module Pact
|
|
367
295
|
let(:expected_body) { { thing: "123" } }
|
368
296
|
|
369
297
|
it 'does not match' do
|
370
|
-
expect(subject.
|
298
|
+
expect(subject.matches? actual_request).to be_false
|
371
299
|
end
|
372
300
|
end
|
373
301
|
|
@@ -377,20 +305,16 @@ module Pact
|
|
377
305
|
context "when allowing unexpected keys" do
|
378
306
|
let(:options) { {'allow_unexpected_keys_in_body' => true} } #From json, these will be strings
|
379
307
|
it "matches" do
|
380
|
-
expect(subject.
|
308
|
+
expect(subject.matches? actual_request).to be_true
|
381
309
|
end
|
382
310
|
end
|
383
311
|
context "when not allowing unexpected keys" do
|
384
312
|
let(:options) { {'allow_unexpected_keys_in_body' => false} }
|
385
313
|
it "does not match" do
|
386
|
-
expect(subject.
|
314
|
+
expect(subject.matches? actual_request).to be_false
|
387
315
|
end
|
388
316
|
end
|
389
317
|
end
|
390
318
|
end
|
391
319
|
end
|
392
|
-
|
393
|
-
describe Request::Actual do
|
394
|
-
it_behaves_like "a request"
|
395
|
-
end
|
396
320
|
end
|