pact-support 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|