pact-support 0.5.4 → 0.5.5
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/.travis.yml +4 -5
- data/CHANGELOG.md +20 -1
- data/RELEASING.md +1 -1
- data/lib/pact/consumer_contract/query_hash.rb +18 -9
- data/lib/pact/reification.rb +8 -4
- data/lib/pact/shared/dsl.rb +2 -2
- data/lib/pact/support/version.rb +1 -1
- data/spec/lib/pact/consumer_contract/query_hash_spec.rb +39 -0
- data/spec/lib/pact/consumer_contract/request_spec.rb +28 -1
- data/spec/lib/pact/reification_spec.rb +32 -0
- data/spec/lib/pact/shared/dsl_spec.rb +49 -35
- data/spec/support/shared_examples_for_request.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8302de9af32aa569443e49a502132233ecc0fbc6
|
4
|
+
data.tar.gz: d03296b6197757a59b1a8c197b375fb17e3be7d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db57a82df74f57807f6514abad63b30374ebbb81d6aadac107059e9dbef23978d2e94ef2b6a5c30095d5b870a464aea05269bea1ffa96aa030305a2d595c546a
|
7
|
+
data.tar.gz: 9918d2bd33d4986bfcf67e41ed2a52d1d216bff694df1035f666cef2a933fbaaef37e8d5f82b9d34c3f80b5fab3a6c6434db6e06c15fc01a982bac5bf6f435da
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
Do this to generate your change history
|
2
2
|
|
3
|
-
git log --pretty=format:' * %h - %s (%an, %ad)'
|
3
|
+
git log --pretty=format:' * %h - %s (%an, %ad)' vX.Y.Z..HEAD
|
4
|
+
|
5
|
+
|
6
|
+
### 0.5.5 (4 November 2015)
|
7
|
+
* e9aaff0 - Merge pull request #21 from TakatoshiMaeda/reify_support_nested_something_like (Sergei Matheson, Fri Apr 29 09:54:00 2016 +1000)
|
8
|
+
* eb9aa26 - Supporting nested Pact::SomethingLike reification (Takatoshi Maeda, Thu Apr 28 02:04:58 2016 +0900)
|
9
|
+
* 832790d - Merge pull request #20 from taiki45/dsl-without-block (Sergei Matheson, Thu Mar 24 09:36:22 2016 +1100)
|
10
|
+
* 9e924c8 - Object supporting DSL can be built without block (Taiki Ono, Wed Mar 23 16:38:27 2016 +0900)
|
11
|
+
* 57aa993 - Merge pull request #18 from taiki45/escape-query-string-component (Sergei Matheson, Tue Mar 15 09:24:36 2016 +1100)
|
12
|
+
* 2b0e7b4 - Escape query string components (Taiki Ono, Mon Mar 14 15:22:29 2016 +0900)
|
13
|
+
* a383368 - Fix indent (Taiki Ono, Mon Mar 14 15:18:26 2016 +0900)
|
14
|
+
* fae9a14 - Merge pull request #17 from taiki45/upgrade-jruby (Ronald Holshausen, Mon Mar 14 09:56:16 2016 +1100)
|
15
|
+
* dc54092 - Support latest jruby and drop supporting jruby 1.7 (Taiki Ono, Sun Mar 13 20:27:17 2016 +0900)
|
16
|
+
* 22651e8 - Merge pull request #16 from taiki45/drop-supporting-ruby1.9 (Beth Skurrie, Sat Mar 12 14:04:41 2016 +1100)
|
17
|
+
* 3dbaa38 - Merge pull request #15 from taiki45/suppress-rspec-warnings (Sergei Matheson, Fri Mar 11 09:29:26 2016 +1100)
|
18
|
+
* 656c98a - Merge pull request #14 from taiki45/nested-query (Sergei Matheson, Fri Mar 11 09:19:58 2016 +1100)
|
19
|
+
* 85fbb09 - Drop supporting ruby1.9 (Taiki Ono, Thu Mar 10 23:01:54 2016 +0900)
|
20
|
+
* 966fa3a - `raise_error` should be with specific error (Taiki Ono, Thu Mar 10 22:50:13 2016 +0900)
|
21
|
+
* 2861742 - Cosmetic change (Taiki Ono, Thu Mar 10 22:11:51 2016 +0900)
|
22
|
+
* c491682 - `QueryHash` accepts nested hash query (Taiki Ono, Thu Mar 10 21:24:41 2016 +0900)
|
4
23
|
|
5
24
|
### 0.5.4 (4 November 2015)
|
6
25
|
|
data/RELEASING.md
CHANGED
@@ -9,27 +9,23 @@ module Pact
|
|
9
9
|
include Pact::Matchers
|
10
10
|
include SymbolizeKeys
|
11
11
|
|
12
|
-
def initialize
|
12
|
+
def initialize(query)
|
13
13
|
@hash = query.nil? ? query : convert_to_hash_of_arrays(query)
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
symbolize_keys(query).each_with_object({}) {|(k,v), hash| hash[k] = [*v] }
|
18
|
-
end
|
19
|
-
|
20
|
-
def as_json opts = {}
|
16
|
+
def as_json(opts = {})
|
21
17
|
@hash
|
22
18
|
end
|
23
19
|
|
24
|
-
def to_json
|
20
|
+
def to_json(opts = {})
|
25
21
|
as_json(opts).to_json(opts)
|
26
22
|
end
|
27
23
|
|
28
|
-
def eql?
|
24
|
+
def eql?(other)
|
29
25
|
self == other
|
30
26
|
end
|
31
27
|
|
32
|
-
def ==
|
28
|
+
def ==(other)
|
33
29
|
QueryHash === other && other.query == query
|
34
30
|
end
|
35
31
|
|
@@ -51,5 +47,18 @@ module Pact
|
|
51
47
|
@hash && @hash.empty?
|
52
48
|
end
|
53
49
|
|
50
|
+
private
|
51
|
+
|
52
|
+
def convert_to_hash_of_arrays(query)
|
53
|
+
query.each_with_object({}) {|(k, v), hash| insert(hash, k, v) }
|
54
|
+
end
|
55
|
+
|
56
|
+
def insert(hash, k, v)
|
57
|
+
if Hash === v
|
58
|
+
v.each {|k2, v2| insert(hash, :"#{k}[#{k2}]", v2) }
|
59
|
+
else
|
60
|
+
hash[k.to_sym] = [*v]
|
61
|
+
end
|
62
|
+
end
|
54
63
|
end
|
55
64
|
end
|
data/lib/pact/reification.rb
CHANGED
@@ -8,7 +8,7 @@ module Pact
|
|
8
8
|
def self.from_term(term)
|
9
9
|
case term
|
10
10
|
when Pact::Term, Regexp, Pact::SomethingLike, Pact::ArrayLike
|
11
|
-
term.generate
|
11
|
+
from_term(term.generate)
|
12
12
|
when Hash
|
13
13
|
term.inject({}) do |mem, (key,term)|
|
14
14
|
mem[key] = from_term(term)
|
@@ -20,19 +20,23 @@ module Pact
|
|
20
20
|
from_term(term.to_hash)
|
21
21
|
when Pact::QueryString
|
22
22
|
from_term(term.query)
|
23
|
-
|
23
|
+
when Pact::QueryHash
|
24
24
|
term.query.map { |k, v|
|
25
25
|
if v.nil?
|
26
26
|
k
|
27
27
|
elsif v.is_a?(Array) #For cases where there are multiple instance of the same parameter
|
28
|
-
v.map { |x| "#{k}=#{from_term(x)}"}.join('&')
|
28
|
+
v.map { |x| "#{k}=#{escape(from_term(x))}"}.join('&')
|
29
29
|
else
|
30
|
-
"#{k}=#{from_term(v)}"
|
30
|
+
"#{k}=#{escape(from_term(v))}"
|
31
31
|
end
|
32
32
|
}.join('&')
|
33
33
|
else
|
34
34
|
term
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
def self.escape(str)
|
39
|
+
URI.encode_www_form_component(str)
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
data/lib/pact/shared/dsl.rb
CHANGED
@@ -62,7 +62,7 @@ module Pact
|
|
62
62
|
new_instance_of_delegation_target_class = self.new(*args)
|
63
63
|
dsl_delegator_class = self.const_get('DSL_DELEGATOR_CLASS')
|
64
64
|
dsl_delegator = dsl_delegator_class.new(new_instance_of_delegation_target_class)
|
65
|
-
dsl_delegator.instance_eval_with_previous_context_available(&block)
|
65
|
+
dsl_delegator.instance_eval_with_previous_context_available(&block) if block
|
66
66
|
new_instance_of_delegation_target_class.finalize
|
67
67
|
new_instance_of_delegation_target_class
|
68
68
|
end
|
@@ -73,4 +73,4 @@ module Pact
|
|
73
73
|
end
|
74
74
|
|
75
75
|
end
|
76
|
-
end
|
76
|
+
end
|
data/lib/pact/support/version.rb
CHANGED
@@ -34,6 +34,45 @@ module Pact
|
|
34
34
|
expect(subject.difference(other)).to_not be_empty
|
35
35
|
end
|
36
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
|
+
end
|
37
76
|
end
|
38
77
|
|
39
78
|
describe "#as_json" do
|
@@ -331,6 +331,15 @@ module Pact
|
|
331
331
|
end
|
332
332
|
end
|
333
333
|
|
334
|
+
context 'when the queries are defined by nested hashes' do
|
335
|
+
let(:expected_query) { { params: 'hello', nested: { a: { aa: '11', bb: '22' }, b: '2' }, params3: 'small' } }
|
336
|
+
let(:actual_query) { 'params3=small&nested[a][aa]=11&nested[a][bb]=22&nested[b]=2¶ms=hello' }
|
337
|
+
|
338
|
+
it "does match" do
|
339
|
+
expect(subject.matches? actual_request).to be true
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
334
343
|
context 'when the queries are defined by hashes, order does not matter but content does' do
|
335
344
|
let(:expected_query) { { params: 'hello', params2: 'world', params3: 'small' } }
|
336
345
|
let(:actual_query) { 'params3=big¶ms2=world¶ms=hello' }
|
@@ -358,6 +367,15 @@ module Pact
|
|
358
367
|
end
|
359
368
|
end
|
360
369
|
|
370
|
+
context 'when the queries are defined by nested hashes holding Pact Terms, order does not matter but content does' do
|
371
|
+
let(:expected_query) { { params: { a: 'hello', b: Term.new(generate: 'world', matcher: /w\w+/) } } }
|
372
|
+
let(:actual_query) { 'params[a]=hello¶ms[b]=wroom'}
|
373
|
+
|
374
|
+
it "does match" do
|
375
|
+
expect(subject.matches? actual_request).to be true
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
361
379
|
context 'when the queries are defined by hashes holding Pact Terms and the regex does not match' do
|
362
380
|
let(:expected_query) { { params: 'hello', params2: Term.new(generate: 'world', matcher: /w\w+/), params3: 'small' } }
|
363
381
|
let(:actual_query) { 'params3=small¶ms=hello¶ms2=bonjour'}
|
@@ -367,6 +385,15 @@ module Pact
|
|
367
385
|
end
|
368
386
|
end
|
369
387
|
|
388
|
+
context 'when the queries are defined by nested hashes holding Pact Terms and the regex does not match' do
|
389
|
+
let(:expected_query) { { params: { a: 'hello', b: Term.new(generate: 'world', matcher: /w\w+/) } } }
|
390
|
+
let(:actual_query) { 'params[a]=hello¶ms[b]=bonjour'}
|
391
|
+
|
392
|
+
it "does match" do
|
393
|
+
expect(subject.matches? actual_request).to be false
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
370
397
|
context 'when the query is a hash containing arrays, to denote multiple parameters with the same name' do
|
371
398
|
let(:expected_query) {
|
372
399
|
{ simple_param: "hi",
|
@@ -456,4 +483,4 @@ module Pact
|
|
456
483
|
end
|
457
484
|
end
|
458
485
|
end
|
459
|
-
end
|
486
|
+
end
|
@@ -63,6 +63,27 @@ module Pact
|
|
63
63
|
|
64
64
|
end
|
65
65
|
|
66
|
+
context "when nested SomethingLike" do
|
67
|
+
|
68
|
+
let(:request) {
|
69
|
+
Pact::SomethingLike.new(
|
70
|
+
{
|
71
|
+
a: 'String',
|
72
|
+
b: Pact::SomethingLike.new(
|
73
|
+
c: 'NestedString'
|
74
|
+
)
|
75
|
+
}
|
76
|
+
)
|
77
|
+
}
|
78
|
+
|
79
|
+
subject { Reification.from_term(request)}
|
80
|
+
|
81
|
+
it "returns the contents of the SomethingLike" do
|
82
|
+
expect(subject).to eq({a: 'String', b: { c: 'NestedString' }})
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
66
87
|
context "when ArrayLike" do
|
67
88
|
|
68
89
|
let(:request) { Pact::ArrayLike.new({a: 'String'}, {min: 3})}
|
@@ -98,6 +119,17 @@ module Pact
|
|
98
119
|
end
|
99
120
|
end
|
100
121
|
|
122
|
+
context "when Hash Query with UTF-8 string" do
|
123
|
+
|
124
|
+
subject { Reification.from_term(query)}
|
125
|
+
|
126
|
+
let(:query) { QueryHash.new( {param: 'ILove', extra: '寿司'})}
|
127
|
+
|
128
|
+
it "returns the hash with escaping UTF-8 string" do
|
129
|
+
expect(subject).to eq("param=ILove&extra=%E5%AF%BF%E5%8F%B8")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
101
133
|
context "when Hash Query with embeded terms" do
|
102
134
|
|
103
135
|
subject { Reification.from_term(query)}
|
@@ -9,6 +9,10 @@ module Pact
|
|
9
9
|
extend DSL
|
10
10
|
attr_accessor :thing, :blah, :global, :the_block, :another_block, :finalized
|
11
11
|
|
12
|
+
def initialize
|
13
|
+
@thing = 0
|
14
|
+
end
|
15
|
+
|
12
16
|
dsl do
|
13
17
|
def with_thing thing
|
14
18
|
self.thing = thing
|
@@ -36,51 +40,61 @@ module Pact
|
|
36
40
|
end
|
37
41
|
|
38
42
|
describe "build" do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
context "with block" do
|
44
|
+
before do
|
45
|
+
def my_local_method
|
46
|
+
'LA LA LA'
|
47
|
+
end
|
43
48
|
|
44
|
-
|
49
|
+
my_local_var = 123
|
45
50
|
|
46
|
-
|
51
|
+
local_app = "I'm a local app"
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
@test = TestDSL.build do
|
54
|
+
with_thing my_local_method
|
55
|
+
with_blah my_local_var
|
56
|
+
with_global global_method
|
57
|
+
with_block do
|
58
|
+
global_app
|
59
|
+
end
|
60
|
+
with_another_block do
|
61
|
+
local_app
|
62
|
+
end
|
57
63
|
end
|
58
|
-
|
59
|
-
|
64
|
+
end
|
65
|
+
|
66
|
+
it "supports using a local variable" do
|
67
|
+
expect(@test.blah).to eq 123
|
68
|
+
end
|
69
|
+
|
70
|
+
it "supports using a local method" do
|
71
|
+
expect(@test.thing).to eq 'LA LA LA'
|
72
|
+
end
|
60
73
|
|
61
|
-
|
62
|
-
expect(@test.
|
63
|
-
|
74
|
+
it "supports using global methods from other files" do
|
75
|
+
expect(@test.global).to eq "I'm global"
|
76
|
+
end
|
64
77
|
|
65
|
-
|
66
|
-
expect(@test.
|
67
|
-
|
78
|
+
it "supports using a local method to provide the app" do
|
79
|
+
expect(@test.another_block.call).to eq("I'm a local app")
|
80
|
+
end
|
68
81
|
|
69
|
-
|
70
|
-
|
71
|
-
|
82
|
+
it "should support using a global method to provide the app but it doesn't" do
|
83
|
+
expect(@test.the_block.call).to eq("I'm a global app")
|
84
|
+
end
|
72
85
|
|
73
|
-
|
74
|
-
|
75
|
-
|
86
|
+
it "calls finalize" do
|
87
|
+
expect(@test.finalized).to be true
|
88
|
+
end
|
89
|
+
end
|
76
90
|
|
77
|
-
|
78
|
-
|
79
|
-
end
|
91
|
+
context "without block" do
|
92
|
+
let(:test) { TestDSL.build }
|
80
93
|
|
81
|
-
|
82
|
-
|
83
|
-
|
94
|
+
it "initializes an instance" do
|
95
|
+
expect(test.thing).to eq(0)
|
96
|
+
end
|
97
|
+
end
|
84
98
|
end
|
85
99
|
end
|
86
100
|
end
|
@@ -115,12 +115,12 @@ shared_examples "a request" do
|
|
115
115
|
|
116
116
|
it "blows up if method is absent" do
|
117
117
|
raw_request.delete 'method'
|
118
|
-
expect { described_class.from_hash(raw_request) }.to raise_error
|
118
|
+
expect { described_class.from_hash(raw_request) }.to raise_error(KeyError)
|
119
119
|
end
|
120
120
|
|
121
121
|
it "blows up if path is absent" do
|
122
122
|
raw_request.delete 'path'
|
123
|
-
expect { described_class.from_hash(raw_request) }.to raise_error
|
123
|
+
expect { described_class.from_hash(raw_request) }.to raise_error(KeyError)
|
124
124
|
end
|
125
125
|
|
126
126
|
it "does not blow up if body is missing" do
|
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.5.
|
4
|
+
version: 0.5.5
|
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:
|
15
|
+
date: 2016-04-29 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: randexp
|