pact 1.3.3 → 1.4.0.rc2
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 +16 -1
- data/Gemfile +5 -0
- data/Gemfile.lock +34 -13
- data/README.md +3 -2
- data/example/animal-service/lib/animal_service/api.rb +1 -0
- data/example/zoo-app/lib/zoo_app/animal_service_client.rb +0 -9
- data/example/zoo-app/lib/zoo_app/models/alligator.rb +2 -0
- data/lib/pact.rb +6 -5
- data/lib/pact/cli.rb +0 -26
- data/lib/pact/consumer/configuration.rb +0 -1
- data/lib/pact/consumer/configuration/configuration_extensions.rb +51 -0
- data/lib/pact/consumer/consumer_contract_builder.rb +1 -2
- data/lib/pact/consumer/interaction_builder.rb +2 -4
- data/lib/pact/doc/interaction_view_model.rb +9 -6
- data/lib/pact/doc/sort_interactions.rb +1 -1
- data/lib/pact/provider/rspec.rb +11 -9
- data/lib/pact/version.rb +1 -1
- data/pact.gemspec +5 -0
- data/spec/lib/pact/consumer/interaction_builder_spec.rb +4 -8
- data/spec/support/case-insensitive-response-header-matching.json +21 -0
- data/spec/support/case-insensitive-response-header-matching.rb +15 -0
- data/tasks/pact-test.rake +5 -0
- metadata +42 -122
- data/lib/pact/configuration.rb +0 -195
- data/lib/pact/consumer/app_manager.rb +0 -158
- data/lib/pact/consumer/interactions_filter.rb +0 -48
- data/lib/pact/consumer/mock_service.rb +0 -2
- data/lib/pact/consumer/mock_service/app.rb +0 -82
- data/lib/pact/consumer/mock_service/interaction_delete.rb +0 -33
- data/lib/pact/consumer/mock_service/interaction_list.rb +0 -76
- data/lib/pact/consumer/mock_service/interaction_mismatch.rb +0 -73
- data/lib/pact/consumer/mock_service/interaction_post.rb +0 -31
- data/lib/pact/consumer/mock_service/interaction_replay.rb +0 -139
- data/lib/pact/consumer/mock_service/log_get.rb +0 -28
- data/lib/pact/consumer/mock_service/missing_interactions_get.rb +0 -30
- data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +0 -31
- data/lib/pact/consumer/mock_service/pact_post.rb +0 -33
- data/lib/pact/consumer/mock_service/rack_request_helper.rb +0 -51
- data/lib/pact/consumer/mock_service/verification_get.rb +0 -68
- data/lib/pact/consumer/mock_service_client.rb +0 -65
- data/lib/pact/consumer/mock_service_interaction_expectation.rb +0 -37
- data/lib/pact/consumer/request.rb +0 -27
- data/lib/pact/consumer/server.rb +0 -90
- data/lib/pact/consumer_contract.rb +0 -1
- data/lib/pact/consumer_contract/consumer_contract.rb +0 -115
- data/lib/pact/consumer_contract/consumer_contract_writer.rb +0 -84
- data/lib/pact/consumer_contract/file_name.rb +0 -19
- data/lib/pact/consumer_contract/headers.rb +0 -51
- data/lib/pact/consumer_contract/interaction.rb +0 -67
- data/lib/pact/consumer_contract/pact_file.rb +0 -24
- data/lib/pact/consumer_contract/request.rb +0 -73
- data/lib/pact/consumer_contract/service_consumer.rb +0 -28
- data/lib/pact/consumer_contract/service_provider.rb +0 -28
- data/lib/pact/logging.rb +0 -14
- data/lib/pact/matchers.rb +0 -1
- data/lib/pact/matchers/actual_type.rb +0 -16
- data/lib/pact/matchers/base_difference.rb +0 -37
- data/lib/pact/matchers/differ.rb +0 -153
- data/lib/pact/matchers/difference.rb +0 -13
- data/lib/pact/matchers/difference_indicator.rb +0 -26
- data/lib/pact/matchers/embedded_diff_formatter.rb +0 -62
- data/lib/pact/matchers/expected_type.rb +0 -35
- data/lib/pact/matchers/index_not_found.rb +0 -15
- data/lib/pact/matchers/list_diff_formatter.rb +0 -101
- data/lib/pact/matchers/matchers.rb +0 -139
- data/lib/pact/matchers/no_diff_indicator.rb +0 -18
- data/lib/pact/matchers/regexp_difference.rb +0 -13
- data/lib/pact/matchers/type_difference.rb +0 -16
- data/lib/pact/matchers/unexpected_index.rb +0 -11
- data/lib/pact/matchers/unexpected_key.rb +0 -11
- data/lib/pact/matchers/unix_diff_formatter.rb +0 -114
- data/lib/pact/reification.rb +0 -28
- data/lib/pact/rspec.rb +0 -53
- data/lib/pact/shared/active_support_support.rb +0 -51
- data/lib/pact/shared/dsl.rb +0 -76
- data/lib/pact/shared/jruby_support.rb +0 -18
- data/lib/pact/shared/json_differ.rb +0 -15
- data/lib/pact/shared/key_not_found.rb +0 -15
- data/lib/pact/shared/null_expectation.rb +0 -31
- data/lib/pact/shared/request.rb +0 -80
- data/lib/pact/shared/text_differ.rb +0 -14
- data/lib/pact/something_like.rb +0 -49
- data/lib/pact/symbolize_keys.rb +0 -12
- data/lib/pact/term.rb +0 -85
- data/spec/lib/pact/consumer/request_spec.rb +0 -24
- data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +0 -58
- data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +0 -180
- data/spec/lib/pact/consumer_contract/headers_spec.rb +0 -107
- data/spec/lib/pact/consumer_contract/interaction_spec.rb +0 -107
- data/spec/lib/pact/consumer_contract/request_spec.rb +0 -329
- data/spec/lib/pact/matchers/differ_spec.rb +0 -214
- 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/index_not_found_spec.rb +0 -21
- data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +0 -114
- data/spec/lib/pact/matchers/matchers_spec.rb +0 -500
- data/spec/lib/pact/matchers/regexp_difference_spec.rb +0 -20
- data/spec/lib/pact/matchers/type_difference_spec.rb +0 -34
- 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 -216
- data/spec/lib/pact/reification_spec.rb +0 -67
- data/spec/lib/pact/shared/dsl_spec.rb +0 -86
- 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/request_spec.rb +0 -111
- data/spec/lib/pact/shared/text_differ_spec.rb +0 -54
- data/spec/lib/pact/something_like_spec.rb +0 -21
- data/spec/lib/pact/term_spec.rb +0 -89
- data/spec/support/dsl_spec_support.rb +0 -7
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pact/matchers/difference'
|
|
3
|
-
|
|
4
|
-
module Pact
|
|
5
|
-
module Matchers
|
|
6
|
-
describe Difference do
|
|
7
|
-
|
|
8
|
-
describe "#as_json" do
|
|
9
|
-
|
|
10
|
-
context "when something other than a regexp is expected" do
|
|
11
|
-
|
|
12
|
-
subject { Difference.new("apple", 'pear').as_json }
|
|
13
|
-
|
|
14
|
-
it "indicates that the actual was intended 'to eq'" do
|
|
15
|
-
expect(subject).to eq({:EXPECTED => "apple", :ACTUAL => "pear"})
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pact/matchers/embedded_diff_formatter'
|
|
3
|
-
require 'pact/matchers/type_difference'
|
|
4
|
-
require 'pact/matchers/expected_type'
|
|
5
|
-
require 'pact/matchers/actual_type'
|
|
6
|
-
|
|
7
|
-
module Pact
|
|
8
|
-
module Matchers
|
|
9
|
-
describe EmbeddedDiffFormatter do
|
|
10
|
-
|
|
11
|
-
let(:diff) do
|
|
12
|
-
{
|
|
13
|
-
:something => TypeDifference.new(ExpectedType.new("Fred"), ActualType.new(1))
|
|
14
|
-
}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
subject { EmbeddedDiffFormatter.call(diff, options) }
|
|
18
|
-
|
|
19
|
-
let(:options) { { colour: colour }}
|
|
20
|
-
let(:expected_coloured) { '"' + ::Term::ANSIColor.red("expected_type") + '":'}
|
|
21
|
-
let(:actual_coloured) { '"' + ::Term::ANSIColor.green("actual_type") + '":'}
|
|
22
|
-
|
|
23
|
-
describe ".call" do
|
|
24
|
-
|
|
25
|
-
let(:colour) { false }
|
|
26
|
-
|
|
27
|
-
context "when color_enabled is true" do
|
|
28
|
-
|
|
29
|
-
let(:colour) { true }
|
|
30
|
-
|
|
31
|
-
it "returns nicely formatted json" do
|
|
32
|
-
expect(subject.split("\n").size).to eq 6
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "returns a string displaying the diff in colour" do
|
|
36
|
-
expect(subject).to include expected_coloured
|
|
37
|
-
expect(subject).to include actual_coloured
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
context "when color_enabled is false" do
|
|
42
|
-
|
|
43
|
-
let(:colour) { false }
|
|
44
|
-
|
|
45
|
-
it "returns nicely formatted json" do
|
|
46
|
-
expect(subject.split("\n").size).to eq 6
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "returns a string displaying the diff without colour" do
|
|
50
|
-
expect(subject).to_not include expected_coloured
|
|
51
|
-
expect(subject).to_not include actual_coloured
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
context "with a Pact::Term" do
|
|
56
|
-
let(:diff) { {thing: Difference.new(Pact::Term.new(generate: "Joe", matcher: /Jo/), "Mary")} }
|
|
57
|
-
|
|
58
|
-
xit "displays the matcher from the Pact::Term" do
|
|
59
|
-
expect(subject).to_not include("Pact::Term")
|
|
60
|
-
expect(subject).to include("/Jo/")
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
context "when no options are specified" do
|
|
66
|
-
subject { EmbeddedDiffFormatter.call(diff) }
|
|
67
|
-
|
|
68
|
-
context "when Pact.configuration.color_enabled is true" do
|
|
69
|
-
it "returns a string displaying the diff in colour" do
|
|
70
|
-
expect(Pact.configuration).to receive(:color_enabled).and_return(true)
|
|
71
|
-
expect(subject).to include expected_coloured
|
|
72
|
-
expect(subject).to include actual_coloured
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
context "when Pact.configuration.color_enabled is false" do
|
|
77
|
-
it "returns a string displaying the diff without colour" do
|
|
78
|
-
expect(Pact.configuration).to receive(:color_enabled).and_return(false)
|
|
79
|
-
expect(subject).to_not include expected_coloured
|
|
80
|
-
expect(subject).to_not include actual_coloured
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
end
|
|
90
|
-
end
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pact/matchers/index_not_found'
|
|
3
|
-
|
|
4
|
-
module Pact
|
|
5
|
-
describe IndexNotFound do
|
|
6
|
-
|
|
7
|
-
describe "#as_json" do
|
|
8
|
-
it "returns a string representation of the object" do
|
|
9
|
-
expect(subject.as_json).to eq subject.to_s
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe "#to_json" do
|
|
14
|
-
it "serialises the object to JSON" do
|
|
15
|
-
expect(subject.to_json).to eq "\"#{subject.to_s}\""
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
end
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pact/matchers/list_diff_formatter'
|
|
3
|
-
require 'pact/matchers/matchers'
|
|
4
|
-
|
|
5
|
-
module Pact
|
|
6
|
-
module Matchers
|
|
7
|
-
describe ListDiffFormatter do
|
|
8
|
-
|
|
9
|
-
describe ".call" do
|
|
10
|
-
subject{ ListDiffFormatter.call(diff, {}) }
|
|
11
|
-
|
|
12
|
-
context "when using class based matching" do
|
|
13
|
-
let(:diff) { {root: TypeDifference.new(ExpectedType.new("Fred"), ActualType.new(1)) } }
|
|
14
|
-
let(:expected_output) { <<-EOS
|
|
15
|
-
\tAt:
|
|
16
|
-
\t\t[:root]
|
|
17
|
-
\tExpected type:
|
|
18
|
-
\t\tString
|
|
19
|
-
\tActual type:
|
|
20
|
-
\t\tFixnum
|
|
21
|
-
EOS
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
it "shows the expected and actual classes" do
|
|
25
|
-
expect(subject + "\n").to eq(expected_output)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
context "when there is an unmatched regexp" do
|
|
31
|
-
let(:diff) { {root: RegexpDifference.new(/fr.*ed/, "mary") } }
|
|
32
|
-
let(:expected_output) { <<-EOS
|
|
33
|
-
\tAt:
|
|
34
|
-
\t\t[:root]
|
|
35
|
-
\tExpected to match:
|
|
36
|
-
\t\t/fr.*ed/
|
|
37
|
-
\tActual:
|
|
38
|
-
\t\t"mary"
|
|
39
|
-
EOS
|
|
40
|
-
}
|
|
41
|
-
it "shows the expected regexp" do
|
|
42
|
-
expect(subject + "\n").to eq(expected_output)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
context "when there is a mismatched value" do
|
|
47
|
-
let(:diff) { {root: {"blah" => { 1 => Difference.new("alphabet", "woozle")}}} }
|
|
48
|
-
let(:expected_output) { ""}
|
|
49
|
-
|
|
50
|
-
it "includes the expected value" do
|
|
51
|
-
expect(subject).to match(/Expected:.*"alphabet"/m)
|
|
52
|
-
end
|
|
53
|
-
it "includes the actual value" do
|
|
54
|
-
expect(subject).to match(/Actual:.*"woozle"/m)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "includes the path" do
|
|
58
|
-
expect(subject).to include('[:root]["blah"][1]')
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
context "when there is a missing key" do
|
|
63
|
-
let(:expected_hash) { {"abc" => {"def" => [1,2]}}}
|
|
64
|
-
let(:diff) { {root: {"blah" => { 1 => Difference.new(expected_hash, Pact::KeyNotFound.new )}}} }
|
|
65
|
-
let(:expected_output) { ""}
|
|
66
|
-
|
|
67
|
-
it "includes the expected value" do
|
|
68
|
-
expect(subject).to match(/Missing key with value\:.*\{/m)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "includes the path" do
|
|
72
|
-
expect(subject).to include('[:root]["blah"][1]')
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
context "when there is a missing index" do
|
|
77
|
-
let(:diff) { [NoDiffIndicator.new, Difference.new(1, IndexNotFound.new )]}
|
|
78
|
-
it "includes the expected value" do
|
|
79
|
-
expect(subject).to match(/Missing.*1/m)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it "includes the path" do
|
|
83
|
-
expect(subject).to include('[1]')
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
context "when there is an unexpected index" do
|
|
88
|
-
let(:diff) { [NoDiffIndicator.new, Difference.new(UnexpectedIndex.new, 2), Difference.new(UnexpectedIndex.new, "b")]}
|
|
89
|
-
it "includes the unexpected value" do
|
|
90
|
-
expect(subject).to include("Array contained unexpected item:")
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
it "includes the path" do
|
|
94
|
-
expect(subject).to include('[1]')
|
|
95
|
-
expect(subject).to include('[2]')
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
context "when there is an unexpected key" do
|
|
100
|
-
let(:diff) { {"blah" => Difference.new(UnexpectedKey.new, "b")}}
|
|
101
|
-
it "includes the unexpected key" do
|
|
102
|
-
expect(subject).to include("Hash contained unexpected key with value:")
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
it "includes the path" do
|
|
106
|
-
expect(subject).to include('["blah"]')
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
@@ -1,500 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pact/matchers'
|
|
3
|
-
require 'pact/consumer_contract/headers'
|
|
4
|
-
|
|
5
|
-
module Pact::Matchers
|
|
6
|
-
|
|
7
|
-
describe Pact::Matchers do
|
|
8
|
-
include Pact::Matchers
|
|
9
|
-
|
|
10
|
-
# TODO this is an integration test
|
|
11
|
-
describe 'matching headers' do
|
|
12
|
-
let(:expected) { Pact::Headers.new('Content-Type' => 'application/hippo')}
|
|
13
|
-
|
|
14
|
-
context "when the headers match in a case insensitive way" do
|
|
15
|
-
|
|
16
|
-
context "when the values match" do
|
|
17
|
-
let(:actual) { Pact::Headers.new('CONTENT-TYPE' => 'application/hippo')}
|
|
18
|
-
it "returns an empty diff" do
|
|
19
|
-
expect(diff(expected, actual)).to be_empty
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
context "when the header values do not match" do
|
|
24
|
-
let(:actual) { Pact::Headers.new('CONTENT-TYPE' => 'application/alligator')}
|
|
25
|
-
let(:difference) { {"Content-Type" => Difference.new('application/hippo', 'application/alligator')} }
|
|
26
|
-
it "returns the diff" do
|
|
27
|
-
expect(diff(expected, actual)).to eq difference
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
context "when the headers do not match" do
|
|
33
|
-
|
|
34
|
-
let(:actual) { Pact::Headers.new('Content-Length' => '1')}
|
|
35
|
-
let(:difference) { {"Content-Type" => Difference.new('application/hippo', Pact::KeyNotFound.new)} }
|
|
36
|
-
it "returns a diff" do
|
|
37
|
-
expect(diff(expected, actual)).to eq difference
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
describe 'matching with something like' do
|
|
45
|
-
|
|
46
|
-
context 'when the actual is something like the expected' do
|
|
47
|
-
let(:expected) { Pact::SomethingLike.new( { a: 1 } ) }
|
|
48
|
-
let(:actual) { { a: 2} }
|
|
49
|
-
|
|
50
|
-
it 'returns an empty diff' do
|
|
51
|
-
expect(diff(expected, actual)).to eq({})
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
describe 'option {allow_unexpected_keys: false}' do
|
|
59
|
-
context "when an unexpected key is found" do
|
|
60
|
-
let(:expected) { {:a => 1} }
|
|
61
|
-
let(:actual) { {:a => 1, :b => 2} }
|
|
62
|
-
let(:difference) { {:b => Difference.new(Pact::UnexpectedKey.new, 2 )} }
|
|
63
|
-
it "returns it in the diff" do
|
|
64
|
-
expect(diff(expected, actual, allow_unexpected_keys: false)).to eq difference
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
describe "expecting key to be present with nil value and not finding key" do
|
|
70
|
-
let(:expected) { {a: nil} }
|
|
71
|
-
let(:actual) { {} }
|
|
72
|
-
let(:difference) { {a: Difference.new(nil, Pact::KeyNotFound.new )} }
|
|
73
|
-
it "returns the key in the diff" do
|
|
74
|
-
expect(diff(expected, actual)).to eq difference
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
describe "expecting a string matching a regexp and not finding key" do
|
|
79
|
-
let(:expected) { {a: /b/} }
|
|
80
|
-
let(:actual) { {} }
|
|
81
|
-
let(:difference) { {:a=> RegexpDifference.new(/b/, Pact::KeyNotFound.new) } }
|
|
82
|
-
it "returns the diff" do
|
|
83
|
-
expect(diff(expected, actual)).to eq difference
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
describe 'type_diff' do
|
|
88
|
-
let(:expected) {
|
|
89
|
-
{a: 'a string', b: 1, c: nil, d: [{e: 'thing'}], f: {g: 10}, h: false}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
context "when the classes match" do
|
|
93
|
-
let(:actual) { {a: 'another string', b: 2, c: nil, d: [{e: 'something'}], f: {g: 100}, h: true} }
|
|
94
|
-
let(:difference) { {} }
|
|
95
|
-
it "returns an empty hash" do
|
|
96
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
context "when a key is not found" do
|
|
101
|
-
let(:actual) { {a: 'blah'} }
|
|
102
|
-
let(:expected) { {b: 'blah'} }
|
|
103
|
-
let(:difference) { {:b=>TypeDifference.new(Pact::ExpectedType.new("blah"), Pact::KeyNotFound.new)} }
|
|
104
|
-
it "returns the difference" do
|
|
105
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
context "when a number is expected" do
|
|
110
|
-
let(:expected) { {a: 1} }
|
|
111
|
-
let(:difference) { {a: TypeDifference.new(Pact::ExpectedType.new(1) , Pact::ActualType.new('a string'))} }
|
|
112
|
-
|
|
113
|
-
context "and a string is found" do
|
|
114
|
-
let(:actual) { {a: 'a string'}}
|
|
115
|
-
it "returns the diff" do
|
|
116
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
context "and nil is found" do
|
|
120
|
-
let(:actual) { {a: nil}}
|
|
121
|
-
let(:difference ) { {a: TypeDifference.new(Pact::ExpectedType.new(1), Pact::ActualType.new(nil)) } }
|
|
122
|
-
it "returns the diff" do
|
|
123
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
context "and a hash is found" do
|
|
127
|
-
let(:actual) { {a: {b: 1}} }
|
|
128
|
-
let(:difference) { {:a=>TypeDifference.new(Pact::ExpectedType.new(1), Pact::ActualType.new({:b=>1})) } }
|
|
129
|
-
it "returns the diff" do
|
|
130
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
context "and an array is found" do
|
|
134
|
-
let(:actual) { {a: [1] } }
|
|
135
|
-
let(:difference) { {:a=>TypeDifference.new(Pact::ExpectedType.new(1), Pact::ActualType.new([1]))}}
|
|
136
|
-
it "returns the diff" do
|
|
137
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
context "when an array is expected" do
|
|
143
|
-
let(:expected) { [{name: 'Fred'}, {name: 'Mary'}] }
|
|
144
|
-
context "when an item with differing class values is found" do
|
|
145
|
-
let(:actual) { [{name: 'Fred'}, {name: 1}] }
|
|
146
|
-
let(:difference) { [
|
|
147
|
-
Pact::Matchers::NO_DIFF_INDICATOR,
|
|
148
|
-
{:name =>
|
|
149
|
-
TypeDifference.new(Pact::ExpectedType.new("Mary"), Pact::ActualType.new(1))
|
|
150
|
-
}
|
|
151
|
-
]
|
|
152
|
-
}
|
|
153
|
-
it "returns the diff" do
|
|
154
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
context "when nil is expected" do
|
|
161
|
-
let(:expected) { {a: nil} }
|
|
162
|
-
context "and a string is found" do
|
|
163
|
-
let(:actual) { {a: 'a string'} }
|
|
164
|
-
let(:difference) { {:a=>TypeDifference.new(Pact::ExpectedType.new(nil), Pact::ActualType.new("a string")) } }
|
|
165
|
-
it "returns the diff" do
|
|
166
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
context "when a term is expected" do
|
|
172
|
-
let(:expected) { {a: Pact::Term.new(:matcher => /p/, :generate => 'apple')} }
|
|
173
|
-
context "and a non matching string is found" do
|
|
174
|
-
let(:actual) { {a: 'banana'} }
|
|
175
|
-
let(:difference) { {:a=>Pact::Matchers::RegexpDifference.new(/p/,"banana")} }
|
|
176
|
-
it "returns the diff" do
|
|
177
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
context "when a term is expected inside a missing hash" do
|
|
183
|
-
let(:expected) { {a: {b: Pact::Term.new(:matcher => /p/, :generate => 'apple')}} }
|
|
184
|
-
context "and a non matching value is found" do
|
|
185
|
-
let(:actual) { {a: nil} }
|
|
186
|
-
let(:difference) { {a: Difference.new({b: /p/}, nil)} }
|
|
187
|
-
it "returns the diff with the regexp unpacked" do
|
|
188
|
-
expect(type_diff(expected, actual)).to eq difference
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
context "when unexpected keys are allowed" do
|
|
194
|
-
let(:expected) { { a: 'b' } }
|
|
195
|
-
let(:actual) { {a: 'c', d: 'e'} }
|
|
196
|
-
let(:difference) { {} }
|
|
197
|
-
it "returns the diff" do
|
|
198
|
-
expect(type_diff(expected, actual, allow_unexpected_keys: true)).to eq difference
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
context "when unexpected keys are not allowed" do
|
|
203
|
-
let(:expected) { { a: 'b' } }
|
|
204
|
-
let(:actual) { {a: 'c', d: 'e'} }
|
|
205
|
-
let(:difference) { {d: Difference.new(Pact::UnexpectedKey.new, 'e')} }
|
|
206
|
-
it "returns the diff" do
|
|
207
|
-
expect(type_diff(expected, actual, allow_unexpected_keys: false)).to eq difference
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
describe 'diffing' do
|
|
213
|
-
|
|
214
|
-
context "when expected is longer than the actual" do
|
|
215
|
-
subject { [1,2,3] }
|
|
216
|
-
let(:actual) { [1,2]}
|
|
217
|
-
let(:difference) { [Pact::Matchers::NO_DIFF_INDICATOR, Pact::Matchers::NO_DIFF_INDICATOR, Difference.new(3, Pact::IndexNotFound.new)] }
|
|
218
|
-
it 'returns the diff' do
|
|
219
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
context "when the different index is in the middle of an array" do
|
|
224
|
-
subject { [1,2,3] }
|
|
225
|
-
let(:actual) { [1,7,3]}
|
|
226
|
-
let(:difference) { [Pact::Matchers::NO_DIFF_INDICATOR, Difference.new(2, 7), Pact::Matchers::NO_DIFF_INDICATOR] }
|
|
227
|
-
it 'returns the diff' do
|
|
228
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
context "when actual array is longer than the expected" do
|
|
233
|
-
subject { [1] }
|
|
234
|
-
let(:actual) { [1,2]}
|
|
235
|
-
let(:difference) { [Pact::Matchers::NO_DIFF_INDICATOR, Difference.new(Pact::UnexpectedIndex.new, 2)] }
|
|
236
|
-
it 'returns the diff' do
|
|
237
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
context 'where an expected value is a non-empty string' do
|
|
242
|
-
|
|
243
|
-
subject { {:a => 'a', :b => 'b'} }
|
|
244
|
-
|
|
245
|
-
context 'and the actual value is an empty string' do
|
|
246
|
-
|
|
247
|
-
let(:actual) { {:a => 'a', :b => ''} }
|
|
248
|
-
|
|
249
|
-
it 'includes this in the diff' do
|
|
250
|
-
expect(diff(subject, actual)).to eq({:b => Difference.new('b', '')})
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
context "when the expected value is a hash" do
|
|
258
|
-
subject { {a: 'b'} }
|
|
259
|
-
context "when the actual value is an array" do
|
|
260
|
-
let(:actual) { [1] }
|
|
261
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
262
|
-
it "should return the diff" do
|
|
263
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
context "when the actual value is an hash" do
|
|
267
|
-
let(:actual) { {b: 'c'} }
|
|
268
|
-
let(:difference) { { a: Difference.new("b",Pact::KeyNotFound.new)} }
|
|
269
|
-
it "should return the diff" do
|
|
270
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
context "when the actual value is an number" do
|
|
274
|
-
let(:actual) { 1 }
|
|
275
|
-
let(:difference) { Difference.new({a: "b"}, 1) }
|
|
276
|
-
it "should return the diff" do
|
|
277
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
278
|
-
end
|
|
279
|
-
end
|
|
280
|
-
context "when the actual value is a string" do
|
|
281
|
-
let(:actual) { "Thing" }
|
|
282
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
283
|
-
it "should return the diff" do
|
|
284
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
context "when the actual value is the same" do
|
|
288
|
-
let (:actual) { {a: 'b'} }
|
|
289
|
-
it "should return an empty hash" do
|
|
290
|
-
expect(diff(subject, actual)).to eq({})
|
|
291
|
-
end
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
context "when the expected value is an array" do
|
|
296
|
-
subject { [1] }
|
|
297
|
-
context "when the actual value is an array" do
|
|
298
|
-
let(:actual) { [2] }
|
|
299
|
-
let(:difference) { [Difference.new(1, 2)] }
|
|
300
|
-
it "should return the diff" do
|
|
301
|
-
expect(diff(subject, actual)).to eq difference
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
context "when the actual value is an hash" do
|
|
305
|
-
let(:actual) { {b: 'c'} }
|
|
306
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
307
|
-
it "should return the diff" do
|
|
308
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
context "when the actual value is an number" do
|
|
312
|
-
let(:actual) { 1 }
|
|
313
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
314
|
-
it "should return the diff" do
|
|
315
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
context "when the actual value is a string" do
|
|
319
|
-
let(:actual) { "Thing" }
|
|
320
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
321
|
-
it "should return the diff" do
|
|
322
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
context "when the actual value is the same" do
|
|
326
|
-
let (:actual) { [1] }
|
|
327
|
-
it "should return an empty hash" do
|
|
328
|
-
expect(diff(subject, actual)).to eql({})
|
|
329
|
-
end
|
|
330
|
-
end
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
context "when the expected value is a string" do
|
|
334
|
-
subject { "Thing"}
|
|
335
|
-
context "when the actual value is an array" do
|
|
336
|
-
let(:actual) { [2] }
|
|
337
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
338
|
-
it "should return the diff" do
|
|
339
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
context "when the actual value is an hash" do
|
|
343
|
-
let(:actual) { {b: 'c'} }
|
|
344
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
345
|
-
it "should return the diff" do
|
|
346
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
context "when the actual value is an number" do
|
|
350
|
-
let(:actual) { 1 }
|
|
351
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
352
|
-
it "should return the diff" do
|
|
353
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
354
|
-
end
|
|
355
|
-
end
|
|
356
|
-
context "when the actual value is a string" do
|
|
357
|
-
let(:actual) { "Another Thing" }
|
|
358
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
359
|
-
it "should return the diff" do
|
|
360
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
context "when the actual value is the same" do
|
|
364
|
-
let (:actual) { "Thing" }
|
|
365
|
-
it "should return an empty hash" do
|
|
366
|
-
expect(diff(subject, actual)).to eq({})
|
|
367
|
-
end
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
context "when the expected value is a number" do
|
|
372
|
-
subject { 1 }
|
|
373
|
-
let(:difference) { Difference.new(subject, actual) }
|
|
374
|
-
context "when the actual value is an array" do
|
|
375
|
-
let(:actual) { [2] }
|
|
376
|
-
it "should return the diff" do
|
|
377
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
context "when the actual value is an hash" do
|
|
381
|
-
let(:actual) { {b: 'c'} }
|
|
382
|
-
it "should return the diff" do
|
|
383
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
context "when the actual value is an number" do
|
|
387
|
-
let(:actual) { 2 }
|
|
388
|
-
it "should return the diff" do
|
|
389
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
390
|
-
end
|
|
391
|
-
end
|
|
392
|
-
context "when the actual value is a string" do
|
|
393
|
-
let(:actual) { "Another Thing" }
|
|
394
|
-
it "should return the diff" do
|
|
395
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
396
|
-
end
|
|
397
|
-
end
|
|
398
|
-
context "when the actual value is the same" do
|
|
399
|
-
let (:actual) { 1 }
|
|
400
|
-
it "should return an empty hash" do
|
|
401
|
-
expect(diff(subject, actual)).to eq({})
|
|
402
|
-
end
|
|
403
|
-
end
|
|
404
|
-
end
|
|
405
|
-
|
|
406
|
-
context "when the expected value is a String matcher" do
|
|
407
|
-
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
context "when the expected value is a Number matcher" do
|
|
411
|
-
|
|
412
|
-
end
|
|
413
|
-
context "when the expected value is an array with a matcher" do
|
|
414
|
-
|
|
415
|
-
end
|
|
416
|
-
context "when the expected value is a hash with a matcher" do
|
|
417
|
-
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
context "when an expected value is nil but not nil is found" do
|
|
421
|
-
subject { {a: nil} }
|
|
422
|
-
let(:actual) { {a: 'blah'} }
|
|
423
|
-
let(:difference) { {:a=>Difference.new(nil, "blah")} }
|
|
424
|
-
it "should return the diff" do
|
|
425
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
426
|
-
end
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
context "a deep mismatch" do
|
|
430
|
-
subject { {a: {b: { c: [1,2]}, d: { e: Pact::Term.new(matcher: /a/, generate: 'apple')}}, f: 1, g: {h: 99}} }
|
|
431
|
-
let(:actual) { {a: {b: { c: [1,2]}, d: { e: 'food'}}, f: "thing"} }
|
|
432
|
-
let(:difference) { {:a=>{:d=>{:e=> RegexpDifference.new(/a/, "food")}},
|
|
433
|
-
:f=> Difference.new(1, "thing"),
|
|
434
|
-
:g=>Difference.new({:h=>99}, Pact::KeyNotFound.new)} }
|
|
435
|
-
|
|
436
|
-
it 'should return the diff' do
|
|
437
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
438
|
-
end
|
|
439
|
-
end
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
context "where a Pact::Term is found that matches the actual value" do
|
|
443
|
-
subject { {:a => Pact::Term.new(:matcher => /a/, :generate => 'apple')} }
|
|
444
|
-
let(:actual) { {:a => "apple" } }
|
|
445
|
-
|
|
446
|
-
it 'does not include this in the diff' do
|
|
447
|
-
expect(diff(subject, actual)).to eq({})
|
|
448
|
-
end
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
context "where an array is expected at a key inside a hash, but a hash is found" do
|
|
452
|
-
subject { {:a => [1,2,3]} }
|
|
453
|
-
let(:actual) { {:a => {:b => 1} } }
|
|
454
|
-
|
|
455
|
-
it 'includes this in the diff' do
|
|
456
|
-
expect(diff(subject, actual)).to eq({:a => Difference.new([1,2,3], {:b => 1})})
|
|
457
|
-
end
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
context "where an array is expected, but a hash is found" do
|
|
461
|
-
subject { {:a => :b} }
|
|
462
|
-
let(:actual) { [4,5,6] }
|
|
463
|
-
|
|
464
|
-
it 'includes this in the diff' do
|
|
465
|
-
expect(diff(subject, actual)).to eq(Difference.new({:a => :b}, [4,5,6] ))
|
|
466
|
-
end
|
|
467
|
-
end
|
|
468
|
-
|
|
469
|
-
context "where a hash is expected, but array is found" do
|
|
470
|
-
subject { [4,5,6] }
|
|
471
|
-
let(:actual) { {:a => :b} }
|
|
472
|
-
|
|
473
|
-
it 'includes this in the diff' do
|
|
474
|
-
expect(diff(subject, actual)).to eq(Difference.new([4,5,6],{:a => :b}))
|
|
475
|
-
end
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
context "when two different arrays are found" do
|
|
479
|
-
subject { [4,5,6] }
|
|
480
|
-
let(:actual) { [4,6,7] }
|
|
481
|
-
let(:difference) { [Pact::Matchers::NO_DIFF_INDICATOR, Difference.new(5, 6), Difference.new(6, 7)] }
|
|
482
|
-
|
|
483
|
-
it 'includes this in the diff' do
|
|
484
|
-
expect(diff(subject, actual)).to eq(difference)
|
|
485
|
-
end
|
|
486
|
-
end
|
|
487
|
-
|
|
488
|
-
context "when an array that matches the Pact::Term is found" do
|
|
489
|
-
subject { [Pact::Term.new(:matcher => /4/, :generate => '4'),"5","6"] }
|
|
490
|
-
let(:actual) { ["4","5","6"] }
|
|
491
|
-
|
|
492
|
-
it 'includes this in the diff' do
|
|
493
|
-
expect(diff(subject, actual)).to eq({})
|
|
494
|
-
end
|
|
495
|
-
end
|
|
496
|
-
|
|
497
|
-
end
|
|
498
|
-
|
|
499
|
-
end
|
|
500
|
-
end
|