pact-support 0.4.0 → 0.4.1
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 +4 -0
- data/lib/pact/array_like.rb +49 -0
- data/lib/pact/consumer_contract/consumer_contract.rb +5 -5
- data/lib/pact/consumer_contract/interaction.rb +2 -2
- data/lib/pact/consumer_contract/query.rb +3 -3
- data/lib/pact/logging.rb +2 -2
- data/lib/pact/matchers.rb +1 -1
- data/lib/pact/matchers/matchers.rb +11 -0
- data/lib/pact/matching_rules/extract.rb +20 -8
- data/lib/pact/matching_rules/merge.rb +29 -6
- data/lib/pact/support/version.rb +1 -1
- data/spec/fixtures/interaction-with-matching-rules.json +2 -2
- data/spec/lib/pact/array_like_spec.rb +37 -0
- data/spec/lib/pact/matchers/matchers_array_like_spec.rb +207 -0
- data/spec/lib/pact/matching_rules/extract_spec.rb +49 -0
- data/spec/lib/pact/matching_rules/merge_spec.rb +86 -0
- data/spec/pact_specification/compliance-2.0.rb +66 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1343fbdb3d492b8bd9459ac577fdc636d3c8f907
|
4
|
+
data.tar.gz: 81a624d87c85b4a248025610281356efc28e492e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a8d23e47c421f2ac93136d762af05aa569292120f5c248fc03d2e2b4e7ef536b7a3a92a4c1c80f38c9be855ebd64101aad1ace927ccc2b0f205e8622ce9ccfa
|
7
|
+
data.tar.gz: c7bfe4f8db436d703354b47944761c9bfbcdaae20f2f26aaf63ac638f9235055e82208b2476c7d20eab067713fa1c26795d72198ee8166dd295c1cceef3f1951
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
### 0.4.1 (23 April 2015)
|
6
|
+
|
7
|
+
* 7da52f3 - Switch from require_relative to require to avoid double-loading when symlinks are involved (John Meredith, Thu Apr 23 14:46:03 2015 +1000)
|
8
|
+
|
5
9
|
### 0.4.0 (20 March 2015)
|
6
10
|
|
7
11
|
* 409bde5 - support url including basic authentication info, e.g.: http://username:password@packtbroker.com (lifei zhou, Wed Mar 18 21:49:29 2015 +1100)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'pact/symbolize_keys'
|
2
|
+
module Pact
|
3
|
+
class ArrayLike
|
4
|
+
include SymbolizeKeys
|
5
|
+
|
6
|
+
attr_reader :contents
|
7
|
+
attr_reader :min
|
8
|
+
|
9
|
+
def initialize contents, options = {}
|
10
|
+
@contents = contents
|
11
|
+
@min = options[:min] || 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
{
|
16
|
+
:json_class => self.class.name,
|
17
|
+
:contents => contents,
|
18
|
+
:min => min
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def as_json opts = {}
|
23
|
+
to_hash
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json opts = {}
|
27
|
+
as_json.to_json opts
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.json_create hash
|
31
|
+
symbolized_hash = symbolize_keys(hash)
|
32
|
+
new(symbolized_hash[:contents], {min: symbolized_hash[:min]})
|
33
|
+
end
|
34
|
+
|
35
|
+
def eq other
|
36
|
+
self == other
|
37
|
+
end
|
38
|
+
|
39
|
+
def == other
|
40
|
+
other.is_a?(ArrayLike) && other.contents == self.contents && other.min == self.min
|
41
|
+
end
|
42
|
+
|
43
|
+
def generate
|
44
|
+
min.times.collect{ Pact::Reification.from_term contents }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
@@ -6,10 +6,10 @@ require 'pact/shared/active_support_support'
|
|
6
6
|
require 'date'
|
7
7
|
require 'json/add/regexp'
|
8
8
|
require 'open-uri'
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
require 'pact/consumer_contract/service_consumer'
|
10
|
+
require 'pact/consumer_contract/service_provider'
|
11
|
+
require 'pact/consumer_contract/interaction'
|
12
|
+
require 'pact/consumer_contract/pact_file'
|
13
13
|
|
14
14
|
module Pact
|
15
15
|
|
@@ -72,4 +72,4 @@ module Pact
|
|
72
72
|
end
|
73
73
|
|
74
74
|
end
|
75
|
-
end
|
75
|
+
end
|
@@ -19,9 +19,9 @@ module Pact
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.from_hash hash
|
22
|
-
request_hash = Pact::MatchingRules.merge(hash['request'], hash['request']['
|
22
|
+
request_hash = Pact::MatchingRules.merge(hash['request'], hash['request']['matchingRules'])
|
23
23
|
request = Pact::Request::Expected.from_hash(request_hash)
|
24
|
-
response_hash = Pact::MatchingRules.merge(hash['response'], hash['response']['
|
24
|
+
response_hash = Pact::MatchingRules.merge(hash['response'], hash['response']['matchingRules'])
|
25
25
|
response = Pact::Response.from_hash(response_hash)
|
26
26
|
new(symbolize_keys(hash).merge(request: request, response: response))
|
27
27
|
end
|
data/lib/pact/logging.rb
CHANGED
data/lib/pact/matchers.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
require 'pact/matchers/matchers'
|
@@ -37,6 +37,7 @@ module Pact
|
|
37
37
|
when Array then array_diff(expected, actual, options)
|
38
38
|
when Regexp then regexp_diff(expected, actual, options)
|
39
39
|
when Pact::SomethingLike then calculate_diff(expected.contents, actual, options.merge(:type => true))
|
40
|
+
when Pact::ArrayLike then array_like_diff(expected, actual, options)
|
40
41
|
else object_diff(expected, actual, options)
|
41
42
|
end
|
42
43
|
end
|
@@ -76,6 +77,16 @@ module Pact
|
|
76
77
|
diff_found ? difference : NO_DIFF
|
77
78
|
end
|
78
79
|
|
80
|
+
def array_like_diff array_like, actual, options
|
81
|
+
if actual.is_a? Array
|
82
|
+
expected_size = [array_like.min, actual.size].max
|
83
|
+
expected_array = expected_size.times.collect{ Pact::Term.unpack_regexps(array_like.contents) }
|
84
|
+
actual_array_diff expected_array, actual, options.merge(:type => true)
|
85
|
+
else
|
86
|
+
Difference.new array_like.generate, actual
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
79
90
|
def hash_diff expected, actual, options
|
80
91
|
if actual.is_a? Hash
|
81
92
|
actual_hash_diff expected, actual, options
|
@@ -21,16 +21,15 @@ module Pact
|
|
21
21
|
attr_reader :matchable, :rules
|
22
22
|
|
23
23
|
def recurse object, path, match_type
|
24
|
-
|
25
24
|
case object
|
26
25
|
when Hash then recurse_hash(object, path, match_type)
|
27
26
|
when Array then recurse_array(object, path, match_type)
|
28
|
-
when Pact::SomethingLike then
|
27
|
+
when Pact::SomethingLike then handle_something_like(object, path, match_type)
|
28
|
+
when Pact::ArrayLike then handle_array_like(object, path, match_type)
|
29
29
|
when Pact::Term then record_regex_rule object, path
|
30
30
|
else
|
31
|
-
|
31
|
+
record_match_type_rule path, match_type
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
|
36
35
|
def recurse_hash hash, path, match_type
|
@@ -45,19 +44,32 @@ module Pact
|
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
48
|
-
def
|
47
|
+
def handle_something_like something_like, path, match_type
|
49
48
|
recurse something_like.contents, path, "type"
|
50
49
|
end
|
51
50
|
|
51
|
+
def handle_array_like array_like, path, match_type
|
52
|
+
record_rule "#{path}", 'min' => array_like.min
|
53
|
+
record_match_type_rule "#{path}[*].*", 'type'
|
54
|
+
recurse array_like.contents, "#{path}[*]", :array_like
|
55
|
+
end
|
56
|
+
|
57
|
+
def record_rule path, rule
|
58
|
+
rules[path] ||= {}
|
59
|
+
rules[path] = rules[path].merge(rule)
|
60
|
+
end
|
61
|
+
|
52
62
|
def record_regex_rule term, path
|
53
63
|
rules[path] ||= {}
|
54
64
|
rules[path]['match'] = 'regex'
|
55
65
|
rules[path]['regex'] = term.matcher.inspect[1..-2]
|
56
66
|
end
|
57
67
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
68
|
+
def record_match_type_rule path, match_type
|
69
|
+
unless match_type == :array_like
|
70
|
+
rules[path] ||= {}
|
71
|
+
rules[path]['match'] = match_type
|
72
|
+
end
|
61
73
|
end
|
62
74
|
end
|
63
75
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pact/array_like'
|
2
|
+
|
1
3
|
module Pact
|
2
4
|
module MatchingRules
|
3
5
|
class Merge
|
@@ -34,22 +36,43 @@ module Pact
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def recurse_array array, path
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
array_like_path = "#{path}[*].*"
|
40
|
+
array_match_type = @matching_rules[array_like_path] && @matching_rules[array_like_path]['match']
|
41
|
+
|
42
|
+
if array_match_type == 'type'
|
43
|
+
warn_when_not_one_example_item(array, path)
|
44
|
+
min = @matching_rules[path]['min']
|
45
|
+
# log_ignored_rules(path, @matching_rules[path], {'min' => min})
|
46
|
+
Pact::ArrayLike.new(recurse(array.first, "#{path}[*]"), min: min)
|
47
|
+
else
|
48
|
+
new_array = []
|
49
|
+
array.each_with_index do | item, index |
|
50
|
+
new_path = path + "[#{index}]"
|
51
|
+
new_array << recurse(wrap(item, new_path), new_path)
|
52
|
+
end
|
53
|
+
new_array
|
41
54
|
end
|
42
|
-
new_array
|
43
55
|
end
|
44
56
|
|
57
|
+
def warn_when_not_one_example_item array, path
|
58
|
+
unless array.size == 1
|
59
|
+
Pact.configuration.error_stream.puts "WARN: Only the first item will be used to match the items in the array at #{path}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# def handle_array_like
|
64
|
+
|
45
65
|
def wrap object, path
|
46
66
|
rules = @matching_rules[path]
|
47
|
-
|
67
|
+
array_rules = @matching_rules["#{path}[*].*"]
|
68
|
+
return object unless rules || array_rules
|
48
69
|
|
49
70
|
if rules['match'] == 'type'
|
50
71
|
handle_match_type(object, path, rules)
|
51
72
|
elsif rules['regex']
|
52
73
|
handle_regex(object, path, rules)
|
74
|
+
# elsif array_rules['match'] == 'type'
|
75
|
+
# handle_array_like(object, path, rules)
|
53
76
|
else
|
54
77
|
log_ignored_rules(path, rules, {})
|
55
78
|
object
|
data/lib/pact/support/version.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"body": {
|
8
8
|
"name": "Mary"
|
9
9
|
},
|
10
|
-
"
|
10
|
+
"matchingRules": {
|
11
11
|
"$.body.name" : {"regex" : ".+"}
|
12
12
|
}
|
13
13
|
},
|
@@ -20,7 +20,7 @@
|
|
20
20
|
}
|
21
21
|
}
|
22
22
|
},
|
23
|
-
"
|
23
|
+
"matchingRules" : {
|
24
24
|
"$.body._links.self.href": {"regex": "http:\\/\\/.*\\/\\d+"}
|
25
25
|
}
|
26
26
|
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'pact/array_like'
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
describe ArrayLike do
|
5
|
+
|
6
|
+
describe "#eq" do
|
7
|
+
subject { ArrayLike.new({name: 'Fred'}, {min: 3}) }
|
8
|
+
context "when the contents and min are the same" do
|
9
|
+
let(:other) { ArrayLike.new({name: 'Fred'}, {min: 3}) }
|
10
|
+
it "returns true" do
|
11
|
+
expect(subject).to eq other
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
context "when the contents are different" do
|
16
|
+
let(:other) { ArrayLike.new({name: 'John'}, {min: 3}) }
|
17
|
+
it "returns false" do
|
18
|
+
expect(subject).to_not eq other
|
19
|
+
end
|
20
|
+
end
|
21
|
+
context "when the min is different" do
|
22
|
+
let(:other) { ArrayLike.new({name: 'Fred'}, {min: 1}) }
|
23
|
+
it "returns false" do
|
24
|
+
expect(subject).to_not eq other
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { ArrayLike.new({name: Pact::Term.new(generate: 'Fred', matcher: /F/)}, {min: 2}) }
|
30
|
+
|
31
|
+
describe "#generate" do
|
32
|
+
it "creates an array with the reified example" do
|
33
|
+
expect(subject.generate).to eq [{name: 'Fred'},{name: 'Fred'}]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'pact/matchers'
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
describe Matchers do
|
5
|
+
|
6
|
+
include Pact::Matchers
|
7
|
+
|
8
|
+
let(:min) { 1 }
|
9
|
+
let(:expected) do
|
10
|
+
{
|
11
|
+
animals: Pact::ArrayLike.new({name: 'Fred'}, {min: min})
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:difference) { diff(expected, actual) }
|
16
|
+
|
17
|
+
context "when each element in the array matches by type" do
|
18
|
+
let(:actual) do
|
19
|
+
{
|
20
|
+
animals: [{name: 'Susan'}, {name: 'Janet'}]
|
21
|
+
}
|
22
|
+
end
|
23
|
+
it "matches" do
|
24
|
+
expect(difference).to be_empty
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when each element in the array does not match by type" do
|
29
|
+
let(:actual) do
|
30
|
+
{
|
31
|
+
animals: [{name: 'Susan'}, {name: 1}]
|
32
|
+
}
|
33
|
+
end
|
34
|
+
let(:expected_difference) do
|
35
|
+
{
|
36
|
+
animals: [
|
37
|
+
Pact::Matchers::NoDiffAtIndex.new,
|
38
|
+
{
|
39
|
+
name: Pact::Matchers::TypeDifference.new(ExpectedType.new('Fred'), ActualType.new(1))
|
40
|
+
}
|
41
|
+
]
|
42
|
+
}
|
43
|
+
end
|
44
|
+
it "returns a diff" do
|
45
|
+
expect(difference).to eq expected_difference
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when an ArrayLike is expected but a hash is found" do
|
50
|
+
let(:actual) do
|
51
|
+
{
|
52
|
+
animals: {
|
53
|
+
some: 'Animals'
|
54
|
+
}
|
55
|
+
}
|
56
|
+
end
|
57
|
+
let(:expected_difference) do
|
58
|
+
{
|
59
|
+
animals: Matchers::Difference.new([{name: 'Fred'}], {some: 'Animals'})
|
60
|
+
}
|
61
|
+
end
|
62
|
+
it "returns a diff" do
|
63
|
+
expect(difference).to eq expected_difference
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when an ArrayLike is expected but nil found" do
|
68
|
+
let(:actual) do
|
69
|
+
{
|
70
|
+
animals: nil
|
71
|
+
}
|
72
|
+
end
|
73
|
+
let(:expected_difference) do
|
74
|
+
{
|
75
|
+
animals: Matchers::Difference.new([{name: 'Fred'}], nil)
|
76
|
+
}
|
77
|
+
end
|
78
|
+
it "returns a diff" do
|
79
|
+
expect(difference).to eq expected_difference
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when an ArrayLike is expected but an empty array is found" do
|
84
|
+
let(:actual) do
|
85
|
+
{
|
86
|
+
animals: []
|
87
|
+
}
|
88
|
+
end
|
89
|
+
let(:expected_difference) do
|
90
|
+
{
|
91
|
+
animals: [Matchers::Difference.new({name: 'Fred'}, Pact::IndexNotFound.new)]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
it "returns a diff" do
|
95
|
+
expect(difference).to eq expected_difference
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when an ArrayLike is expected but the actual does not have enough elements in it" do
|
100
|
+
let(:min) { 2 }
|
101
|
+
let(:actual) do
|
102
|
+
{
|
103
|
+
animals: [{name: 'Susan'}]
|
104
|
+
}
|
105
|
+
end
|
106
|
+
let(:expected_difference) do
|
107
|
+
{
|
108
|
+
animals: [Pact::Matchers::NoDiffAtIndex.new, Matchers::Difference.new({name: 'Fred'}, Pact::IndexNotFound.new)]
|
109
|
+
}
|
110
|
+
end
|
111
|
+
it "returns a diff" do
|
112
|
+
expect(difference).to eq expected_difference
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "when an ArrayLike is expected with a Pact::Term in it" do
|
117
|
+
let(:expected) do
|
118
|
+
{
|
119
|
+
animals: Pact::ArrayLike.new(name: Pact::Term.new(generate: 'Fred', matcher: /F/))
|
120
|
+
}
|
121
|
+
end
|
122
|
+
let(:actual) do
|
123
|
+
{
|
124
|
+
animals: [{name: 'Susan'}]
|
125
|
+
}
|
126
|
+
end
|
127
|
+
let(:expected_difference) do
|
128
|
+
{
|
129
|
+
animals: [{name: Matchers::RegexpDifference.new(/F/, 'Susan')}]
|
130
|
+
}
|
131
|
+
end
|
132
|
+
it "returns a diff" do
|
133
|
+
expect(difference).to eq expected_difference
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when an ArrayLike is expected within an ArrayLike and they match" do
|
138
|
+
let(:expected) do
|
139
|
+
{
|
140
|
+
animals: Pact::ArrayLike.new(
|
141
|
+
name: 'Fred',
|
142
|
+
children: Pact::ArrayLike.new(
|
143
|
+
age: 8
|
144
|
+
)
|
145
|
+
)
|
146
|
+
}
|
147
|
+
end
|
148
|
+
let(:actual) do
|
149
|
+
{
|
150
|
+
animals: [
|
151
|
+
{
|
152
|
+
name: 'Susan',
|
153
|
+
children: [
|
154
|
+
{age: 4},{age: 5}
|
155
|
+
]
|
156
|
+
}
|
157
|
+
]
|
158
|
+
}
|
159
|
+
end
|
160
|
+
it "returns an empty diff" do
|
161
|
+
expect(difference).to be_empty
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when an ArrayLike is expected within an ArrayLike and they don't match" do
|
166
|
+
let(:expected) do
|
167
|
+
{
|
168
|
+
animals: Pact::ArrayLike.new(
|
169
|
+
name: 'Fred',
|
170
|
+
children: Pact::ArrayLike.new(
|
171
|
+
age: 8
|
172
|
+
)
|
173
|
+
)
|
174
|
+
}
|
175
|
+
end
|
176
|
+
let(:actual) do
|
177
|
+
{
|
178
|
+
animals: [
|
179
|
+
{
|
180
|
+
name: 'Susan',
|
181
|
+
children: [
|
182
|
+
{age: 4},{foo: 'bar'}
|
183
|
+
]
|
184
|
+
}
|
185
|
+
]
|
186
|
+
}
|
187
|
+
end
|
188
|
+
let(:expected_difference) do
|
189
|
+
{
|
190
|
+
animals: [
|
191
|
+
{
|
192
|
+
children: [
|
193
|
+
Matchers::NoDiffAtIndex.new,
|
194
|
+
{
|
195
|
+
age: Matchers::TypeDifference.new(ExpectedType.new(8), KeyNotFound.new)
|
196
|
+
}
|
197
|
+
]
|
198
|
+
}
|
199
|
+
]
|
200
|
+
}
|
201
|
+
end
|
202
|
+
it "returns the diff" do
|
203
|
+
expect(difference).to eq expected_difference
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'pact/matching_rules/extract'
|
2
2
|
require 'pact/something_like'
|
3
|
+
require 'pact/array_like'
|
3
4
|
require 'pact/term'
|
4
5
|
|
5
6
|
module Pact
|
@@ -99,6 +100,54 @@ module Pact
|
|
99
100
|
expect(subject).to eq rules
|
100
101
|
end
|
101
102
|
end
|
103
|
+
|
104
|
+
context "with an ArrayLike" do
|
105
|
+
let(:matchable) do
|
106
|
+
{
|
107
|
+
body: {
|
108
|
+
alligators: Pact::ArrayLike.new(
|
109
|
+
name: 'Fred'
|
110
|
+
)
|
111
|
+
}
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
let(:rules) do
|
116
|
+
{
|
117
|
+
"$.body.alligators" => {"min" => 1},
|
118
|
+
"$.body.alligators[*].*" => {"match" => "type"}
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
it "lists a rule for all items" do
|
123
|
+
expect(subject).to eq rules
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "with an ArrayLike with a Pact::Term inside" do
|
128
|
+
let(:matchable) do
|
129
|
+
{
|
130
|
+
body: {
|
131
|
+
alligators: Pact::ArrayLike.new(
|
132
|
+
name: 'Fred',
|
133
|
+
phoneNumber: Pact::Term.new(generate: '1234567', matcher: /\d+/)
|
134
|
+
)
|
135
|
+
}
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
let(:rules) do
|
140
|
+
{
|
141
|
+
"$.body.alligators" => {"min" => 1},
|
142
|
+
"$.body.alligators[*].*" => {"match" => "type"},
|
143
|
+
"$.body.alligators[*].phoneNumber" => {"match" => "regex", "regex" => "\\d+"}
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
it "lists a rule that specifies that the regular expression must match" do
|
148
|
+
expect(subject).to eq rules
|
149
|
+
end
|
150
|
+
end
|
102
151
|
end
|
103
152
|
end
|
104
153
|
end
|
@@ -142,6 +142,92 @@ module Pact
|
|
142
142
|
expect(subject["_links"]["self"][0]["href"].matcher.inspect).to eq "/http:\\/\\/.*\\/thing/"
|
143
143
|
end
|
144
144
|
end
|
145
|
+
|
146
|
+
describe "with an array where all elements should match by type" do
|
147
|
+
let(:expected) do
|
148
|
+
{
|
149
|
+
|
150
|
+
'alligators' => [
|
151
|
+
{'name' => 'Mary'}
|
152
|
+
]
|
153
|
+
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
let(:matching_rules) do
|
158
|
+
{
|
159
|
+
"$.body.alligators" => { 'min' => 2 },
|
160
|
+
"$.body.alligators[*].*" => { 'match' => 'type'}
|
161
|
+
}
|
162
|
+
end
|
163
|
+
it "creates a Pact::ArrayLike at the appropriate path" do
|
164
|
+
expect(subject["alligators"]).to be_instance_of(Pact::ArrayLike)
|
165
|
+
expect(subject["alligators"].contents).to eq 'name' => 'Mary'
|
166
|
+
expect(subject["alligators"].min).to eq 2
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "with an array where all elements should match by type nested inside another array where all elements should match by type" do
|
171
|
+
let(:expected) do
|
172
|
+
{
|
173
|
+
|
174
|
+
'alligators' => [
|
175
|
+
{
|
176
|
+
'name' => 'Mary',
|
177
|
+
'children' => [
|
178
|
+
'age' => 9
|
179
|
+
]
|
180
|
+
}
|
181
|
+
]
|
182
|
+
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
let(:matching_rules) do
|
187
|
+
{
|
188
|
+
"$.body.alligators" => { 'min' => 2 },
|
189
|
+
"$.body.alligators[*].*" => { 'match' => 'type'},
|
190
|
+
"$.body.alligators[*].children" => { 'min' => 1 },
|
191
|
+
"$.body.alligators[*].children[*].*" => { 'match' => 'type'}
|
192
|
+
}
|
193
|
+
end
|
194
|
+
it "creates a Pact::ArrayLike at the appropriate path" do
|
195
|
+
expect(subject["alligators"].contents['children']).to be_instance_of(Pact::ArrayLike)
|
196
|
+
expect(subject["alligators"].contents['children'].contents).to eq 'age' => 9
|
197
|
+
expect(subject["alligators"].contents['children'].min).to eq 1
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "with an example array with more than one item" do
|
202
|
+
let(:expected) do
|
203
|
+
{
|
204
|
+
|
205
|
+
'alligators' => [
|
206
|
+
{'name' => 'Mary'},
|
207
|
+
{'name' => 'Joe'}
|
208
|
+
]
|
209
|
+
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
213
|
+
let(:matching_rules) do
|
214
|
+
{
|
215
|
+
"$.body.alligators" => { 'min' => 2 },
|
216
|
+
"$.body.alligators[*].*" => { 'match' => 'type'}
|
217
|
+
}
|
218
|
+
end
|
219
|
+
|
220
|
+
xit "doesn't warn about the min size being ignored" do
|
221
|
+
expect(Pact.configuration.error_stream).to receive(:puts).once
|
222
|
+
subject
|
223
|
+
end
|
224
|
+
|
225
|
+
it "warns that the other items will be ignored" do
|
226
|
+
allow(Pact.configuration.error_stream).to receive(:puts)
|
227
|
+
expect(Pact.configuration.error_stream).to receive(:puts).with(/WARN: Only the first item/)
|
228
|
+
subject
|
229
|
+
end
|
230
|
+
end
|
145
231
|
end
|
146
232
|
end
|
147
233
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer/request'
|
3
|
+
require 'pact/consumer_contract/request'
|
4
|
+
require 'pact/matchers/embedded_diff_formatter'
|
5
|
+
|
6
|
+
|
7
|
+
PACT_SPEC_DIR = "../pact-specification/testcases"
|
8
|
+
REQUEST_TEST_CASE_FOLDERS = Dir.glob("#{PACT_SPEC_DIR}/request/**")
|
9
|
+
REQUEST_TEST_CASE_FILES = Dir.glob("#{PACT_SPEC_DIR}/request/**/*.json")
|
10
|
+
|
11
|
+
TEST_DESCRIPTIONS = {true => "matches", false => "does not match"}
|
12
|
+
TESTCASES = "**/*.json"
|
13
|
+
# TESTCASES = "array with nested array that matches.json"
|
14
|
+
describe "Pact gem complicance with Pact Specification 1.0.0" do
|
15
|
+
|
16
|
+
directories = Dir.glob("#{PACT_SPEC_DIR}/request") # make this a *
|
17
|
+
|
18
|
+
directories.each do | dir_name |
|
19
|
+
|
20
|
+
describe File.basename(dir_name) do
|
21
|
+
|
22
|
+
sub_directories = Dir.glob("#{dir_name}/*")
|
23
|
+
|
24
|
+
sub_directories.each do | sub_dir_name |
|
25
|
+
|
26
|
+
context File.basename(sub_dir_name) do
|
27
|
+
testcases = Dir.glob("#{sub_dir_name}/#{TESTCASES}")
|
28
|
+
|
29
|
+
testcases.each do | file_name |
|
30
|
+
|
31
|
+
context File.basename(file_name).chomp(".json") do
|
32
|
+
|
33
|
+
file_content = nil
|
34
|
+
begin
|
35
|
+
file_content = File.read(file_name)
|
36
|
+
test_content = JSON.parse(file_content)
|
37
|
+
default = {'query' => '', 'headers' => {}}
|
38
|
+
|
39
|
+
request_hash = Pact::MatchingRules.merge(test_content["expected"], test_content["expected"]['matchingRules'])
|
40
|
+
expected = Pact::Request::Expected.from_hash(default.merge(request_hash))
|
41
|
+
|
42
|
+
# expected = Pact::Request::Expected.from_hash(default.merge(test_content["expected"]))
|
43
|
+
actual = Pact::Consumer::Request::Actual.from_hash(default.merge(test_content["actual"]))
|
44
|
+
expected_result = test_content.fetch("match")
|
45
|
+
comment = test_content["comment"]
|
46
|
+
|
47
|
+
it "#{TEST_DESCRIPTIONS[expected_result]} - #{comment}" do
|
48
|
+
matches = expected.matches?(actual)
|
49
|
+
if matches != expected_result
|
50
|
+
puts Pact::Matchers::EmbeddedDiffFormatter.call(expected.difference(actual))
|
51
|
+
end
|
52
|
+
expect(matches).to eq expected_result
|
53
|
+
end
|
54
|
+
rescue => e
|
55
|
+
puts "Error parsing json from #{file_name}, #{e.message}: #{file_content}"
|
56
|
+
raise e
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Fraser
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-
|
15
|
+
date: 2015-04-23 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: randexp
|
@@ -230,6 +230,7 @@ files:
|
|
230
230
|
- README.md
|
231
231
|
- RELEASING.md
|
232
232
|
- Rakefile
|
233
|
+
- lib/pact/array_like.rb
|
233
234
|
- lib/pact/configuration.rb
|
234
235
|
- lib/pact/consumer/request.rb
|
235
236
|
- lib/pact/consumer_contract.rb
|
@@ -286,6 +287,7 @@ files:
|
|
286
287
|
- pact-support.gemspec
|
287
288
|
- spec/fixtures/interaction-with-matching-rules.json
|
288
289
|
- spec/integration/matching_rules_extract_and_merge_spec.rb
|
290
|
+
- spec/lib/pact/array_like_spec.rb
|
289
291
|
- spec/lib/pact/configuration_spec.rb
|
290
292
|
- spec/lib/pact/consumer/request_spec.rb
|
291
293
|
- spec/lib/pact/consumer_contract/active_support_support_spec.rb
|
@@ -302,6 +304,7 @@ files:
|
|
302
304
|
- spec/lib/pact/matchers/embedded_diff_formatter_spec.rb
|
303
305
|
- spec/lib/pact/matchers/index_not_found_spec.rb
|
304
306
|
- spec/lib/pact/matchers/list_diff_formatter_spec.rb
|
307
|
+
- spec/lib/pact/matchers/matchers_array_like_spec.rb
|
305
308
|
- spec/lib/pact/matchers/matchers_spec.rb
|
306
309
|
- spec/lib/pact/matchers/no_diff_at_index_spec.rb
|
307
310
|
- spec/lib/pact/matchers/regexp_difference_spec.rb
|
@@ -320,6 +323,7 @@ files:
|
|
320
323
|
- spec/lib/pact/shared/text_differ_spec.rb
|
321
324
|
- spec/lib/pact/something_like_spec.rb
|
322
325
|
- spec/lib/pact/term_spec.rb
|
326
|
+
- spec/pact_specification/compliance-2.0.rb
|
323
327
|
- spec/spec_helper.rb
|
324
328
|
- spec/support/a_consumer-a_producer.json
|
325
329
|
- spec/support/a_consumer-a_provider.json
|
@@ -370,6 +374,7 @@ summary: Shared code for Pact gems
|
|
370
374
|
test_files:
|
371
375
|
- spec/fixtures/interaction-with-matching-rules.json
|
372
376
|
- spec/integration/matching_rules_extract_and_merge_spec.rb
|
377
|
+
- spec/lib/pact/array_like_spec.rb
|
373
378
|
- spec/lib/pact/configuration_spec.rb
|
374
379
|
- spec/lib/pact/consumer/request_spec.rb
|
375
380
|
- spec/lib/pact/consumer_contract/active_support_support_spec.rb
|
@@ -386,6 +391,7 @@ test_files:
|
|
386
391
|
- spec/lib/pact/matchers/embedded_diff_formatter_spec.rb
|
387
392
|
- spec/lib/pact/matchers/index_not_found_spec.rb
|
388
393
|
- spec/lib/pact/matchers/list_diff_formatter_spec.rb
|
394
|
+
- spec/lib/pact/matchers/matchers_array_like_spec.rb
|
389
395
|
- spec/lib/pact/matchers/matchers_spec.rb
|
390
396
|
- spec/lib/pact/matchers/no_diff_at_index_spec.rb
|
391
397
|
- spec/lib/pact/matchers/regexp_difference_spec.rb
|
@@ -404,6 +410,7 @@ test_files:
|
|
404
410
|
- spec/lib/pact/shared/text_differ_spec.rb
|
405
411
|
- spec/lib/pact/something_like_spec.rb
|
406
412
|
- spec/lib/pact/term_spec.rb
|
413
|
+
- spec/pact_specification/compliance-2.0.rb
|
407
414
|
- spec/spec_helper.rb
|
408
415
|
- spec/support/a_consumer-a_producer.json
|
409
416
|
- spec/support/a_consumer-a_provider.json
|
@@ -426,4 +433,3 @@ test_files:
|
|
426
433
|
- spec/support/test_app_fail.json
|
427
434
|
- spec/support/test_app_pass.json
|
428
435
|
- spec/support/test_app_with_right_content_type_differ.json
|
429
|
-
has_rdoc:
|