pact 1.0.7 → 1.0.8
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 +8 -2
- data/Gemfile.lock +1 -1
- data/lib/pact/consumer.rb +1 -0
- data/lib/pact/consumer_contract/consumer_contract.rb +2 -0
- data/lib/pact/matchers/matchers.rb +1 -0
- data/lib/pact/provider.rb +0 -1
- data/lib/pact/request.rb +1 -0
- data/lib/pact/something_like.rb +31 -0
- data/lib/pact/term.rb +4 -1
- data/lib/pact/version.rb +1 -1
- data/lib/tasks/pact.rake +1 -0
- data/spec/features/consumption_spec.rb +2 -2
- data/spec/lib/pact/matchers/matchers_spec.rb +18 -3
- data/spec/lib/pact/provider/test_methods_spec.rb +1 -1
- data/spec/lib/pact/request_spec.rb +2 -2
- data/spec/lib/pact/term_spec.rb +39 -22
- metadata +2 -1
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
-
### 1.0.
|
1
|
+
### 1.0.8 (13 September 2013)
|
2
|
+
|
3
|
+
* Added validation to ensure that a Term has both a matcher and a generate value, and that the value to generate matches the given regular expression [Beth Skurrie]
|
4
|
+
|
5
|
+
* Added the SomethingLike class that does a structure diff on anything contianed within in it. Will change the name when we can think of something better! [Beth Skurrie, Greg Dziemidowicz]
|
6
|
+
|
7
|
+
### 1.0.7 (11 September 2013)
|
2
8
|
|
3
9
|
* Allow request query to be a Pact Term. [Seb Glazebrook]
|
4
10
|
|
5
|
-
### 1.0.6 (11 September
|
11
|
+
### 1.0.6 (11 September 2013)
|
6
12
|
|
7
13
|
* Made reports dir configurable [Beth Skurrie]
|
8
14
|
* Changed the way the pact files are configured. They are now in the Pact.service_provider block in the pact_helper file. Require 'pact/tasks' in the Rakefile and run 'rake pact:verify' instead of setting up custom tasks. [Beth Skurrie]
|
data/Gemfile.lock
CHANGED
data/lib/pact/consumer.rb
CHANGED
@@ -33,6 +33,7 @@ module Pact
|
|
33
33
|
when Array then array_diff(expected, actual, options)
|
34
34
|
when Pact::Term then diff(expected.matcher, actual, options)
|
35
35
|
when Regexp then regexp_diff(expected, actual, options)
|
36
|
+
when Pact::SomethingLike then diff(expected.contents, actual, options.merge(:structure => true))
|
36
37
|
else object_diff(expected, actual, options)
|
37
38
|
end
|
38
39
|
end
|
data/lib/pact/provider.rb
CHANGED
data/lib/pact/request.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Pact
|
2
|
+
|
3
|
+
class SomethingLike
|
4
|
+
attr_reader :contents
|
5
|
+
|
6
|
+
def initialize contents
|
7
|
+
@contents = contents
|
8
|
+
end
|
9
|
+
|
10
|
+
def as_json
|
11
|
+
{
|
12
|
+
:json_class => self.class.name,
|
13
|
+
:contents => contents
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_json opts = {}
|
18
|
+
as_json.to_json opts
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.json_create hash
|
22
|
+
new(hash['contents'])
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate
|
26
|
+
contents
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
data/lib/pact/term.rb
CHANGED
@@ -10,6 +10,9 @@ module Pact
|
|
10
10
|
def initialize(attributes = {})
|
11
11
|
@generate = attributes[:generate]
|
12
12
|
@matcher = attributes[:matcher]
|
13
|
+
raise "Please specify a matcher for the Term" unless @matcher != nil
|
14
|
+
raise "Please specify a value to generate for the Term" unless @generate != nil
|
15
|
+
raise "Value to generate \"#{@generate}\" does not match regular expression #{@matcher}" unless @generate =~ @matcher
|
13
16
|
end
|
14
17
|
|
15
18
|
def to_json(options = {})
|
@@ -37,7 +40,7 @@ module Pact
|
|
37
40
|
end
|
38
41
|
|
39
42
|
def empty?
|
40
|
-
|
43
|
+
false
|
41
44
|
end
|
42
45
|
|
43
46
|
end
|
data/lib/pact/version.rb
CHANGED
data/lib/tasks/pact.rake
CHANGED
@@ -39,7 +39,7 @@ describe "A service consumer side of a pact", :pact => true do
|
|
39
39
|
method: :post,
|
40
40
|
path: '/donuts',
|
41
41
|
body: {
|
42
|
-
"name" => Pact::Term.new(matcher: /Bob
|
42
|
+
"name" => Pact::Term.new(matcher: /Bob/, generate: 'Bob')
|
43
43
|
},
|
44
44
|
headers: {'Accept' => 'text/plain', "Content-Type" => 'application/json'}
|
45
45
|
}).
|
@@ -56,7 +56,7 @@ describe "A service consumer side of a pact", :pact => true do
|
|
56
56
|
status: 200,
|
57
57
|
body: /deleted/
|
58
58
|
})
|
59
|
-
bob_service.
|
59
|
+
bob_service.
|
60
60
|
upon_receiving('an update alligators request').with({
|
61
61
|
method: :put,
|
62
62
|
path: '/alligators',
|
@@ -1,10 +1,25 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'pact/term'
|
3
|
+
require 'pact/something_like'
|
3
4
|
require 'pact/matchers'
|
4
5
|
|
5
6
|
describe Pact::Matchers do
|
6
7
|
include Pact::Matchers
|
7
8
|
|
9
|
+
describe 'matching with something like' do
|
10
|
+
|
11
|
+
context 'when the actual is something like the expected' do
|
12
|
+
let(:expected) { Pact::SomethingLike.new( { a: 1 } ) }
|
13
|
+
let(:actual) { { a: 2} }
|
14
|
+
|
15
|
+
it 'returns an empty diff' do
|
16
|
+
expect(diff(expected, actual)).to eq({})
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
8
23
|
describe 'option {allow_unexpected_keys: false}' do
|
9
24
|
context "when an unexpected key is found" do
|
10
25
|
let(:expected) { {:a => 1} }
|
@@ -314,7 +329,7 @@ describe Pact::Matchers do
|
|
314
329
|
end
|
315
330
|
|
316
331
|
context "a deep mismatch" do
|
317
|
-
subject { {a: {b: { c: [1,2]}, d: { e: Pact::Term.new(matcher: /a
|
332
|
+
subject { {a: {b: { c: [1,2]}, d: { e: Pact::Term.new(matcher: /a/, generate: 'apple')}}, f: 1, g: {h: 99}} }
|
318
333
|
let(:actual) { {a: {b: { c: [1,2]}, d: { e: 'food'}}, f: "thing"} }
|
319
334
|
let(:difference) { {:a=>{:d=>{:e=>{:expected=>/a/, :actual=>"food"}}}, :f=>{:expected=>1, :actual=>"thing"}, :g=>{:expected=>{:h=>99}, :actual=> Pact::Matchers::KeyNotFound.new}} }
|
320
335
|
|
@@ -325,7 +340,7 @@ describe Pact::Matchers do
|
|
325
340
|
|
326
341
|
|
327
342
|
context "where a Pact::Term is found that matches the actual value" do
|
328
|
-
subject { {:a => Pact::Term.new(:matcher => /a
|
343
|
+
subject { {:a => Pact::Term.new(:matcher => /a/, :generate => 'apple')} }
|
329
344
|
let(:actual) { {:a => "apple" } }
|
330
345
|
|
331
346
|
it 'does not include this in the diff' do
|
@@ -371,7 +386,7 @@ describe Pact::Matchers do
|
|
371
386
|
end
|
372
387
|
|
373
388
|
context "when an array that matches the Pact::Term is found" do
|
374
|
-
subject { [Pact::Term.new(:matcher => /4
|
389
|
+
subject { [Pact::Term.new(:matcher => /4/, :generate => '4'),"5","6"] }
|
375
390
|
let(:actual) { ["4","5","6"] }
|
376
391
|
|
377
392
|
it 'includes this in the diff' do
|
@@ -38,7 +38,7 @@ module Pact::Provider
|
|
38
38
|
|
39
39
|
context 'Term query' do
|
40
40
|
|
41
|
-
let(:query) { Pact::Term.new(generate: 'query') }
|
41
|
+
let(:query) { Pact::Term.new(generate: 'query', matcher: /q/) }
|
42
42
|
|
43
43
|
it 'appends the Term\'s generate to the path' do
|
44
44
|
expect(@path).to eq('path?query')
|
@@ -251,7 +251,7 @@ module Pact
|
|
251
251
|
let(:expected_body) do
|
252
252
|
{
|
253
253
|
name: 'Bob',
|
254
|
-
customer_id: Term.new(matcher: /CN
|
254
|
+
customer_id: Term.new(matcher: /CN.*/, generate: 'CN789')
|
255
255
|
}
|
256
256
|
end
|
257
257
|
|
@@ -271,7 +271,7 @@ module Pact
|
|
271
271
|
let(:expected_body) do
|
272
272
|
{
|
273
273
|
name: 'Bob',
|
274
|
-
customer_id: Term.new(matcher: /foo
|
274
|
+
customer_id: Term.new(matcher: /foo/, generate: 'fooool')
|
275
275
|
}
|
276
276
|
end
|
277
277
|
|
data/spec/lib/pact/term_spec.rb
CHANGED
@@ -3,6 +3,38 @@ require 'spec_helper'
|
|
3
3
|
module Pact
|
4
4
|
describe Term do
|
5
5
|
|
6
|
+
describe 'initialize' do
|
7
|
+
let(:matcher) { /e/ }
|
8
|
+
let(:generate) { 'apple'}
|
9
|
+
subject { Term.new(generate: generate, matcher: matcher) }
|
10
|
+
context "when a matcher and generate are specified" do
|
11
|
+
context "when the matcher matches the generated value" do
|
12
|
+
it 'does not raise an exception' do
|
13
|
+
subject
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when the matcher does not match the generated value" do
|
18
|
+
let(:generate) { 'banana' }
|
19
|
+
it 'raises an exception' do
|
20
|
+
expect { subject }.to raise_error /does not match/
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
context 'when a matcher is not specified' do
|
25
|
+
let(:matcher) { nil }
|
26
|
+
it 'raises an exception' do
|
27
|
+
expect { subject }.to raise_error /Please specify a matcher/
|
28
|
+
end
|
29
|
+
end
|
30
|
+
context 'when a generate is not specified' do
|
31
|
+
let(:generate) { nil }
|
32
|
+
it 'raises an exception' do
|
33
|
+
expect { subject }.to raise_error /Please specify a value/
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
6
38
|
describe "equality" do
|
7
39
|
context "when the matcher and generate attrs are the same" do
|
8
40
|
let(:this) { Term.new(generate: 'A', matcher: /A/) }
|
@@ -14,8 +46,8 @@ module Pact
|
|
14
46
|
end
|
15
47
|
|
16
48
|
context "when the generate attrs are different" do
|
17
|
-
let(:this) { Term.new(generate:
|
18
|
-
let(:that) { Term.new(generate:
|
49
|
+
let(:this) { Term.new(generate: 'A', matcher: /.*/) }
|
50
|
+
let(:that) { Term.new(generate: 'B', matcher: /.*/) }
|
19
51
|
|
20
52
|
it "is not equal" do
|
21
53
|
expect(this).to_not eq that
|
@@ -23,8 +55,8 @@ module Pact
|
|
23
55
|
end
|
24
56
|
|
25
57
|
context "when the matcher attrs are different" do
|
26
|
-
let(:this) { Term.new(matcher:
|
27
|
-
let(:that) { Term.new(matcher:
|
58
|
+
let(:this) { Term.new(matcher: /A/, generate: 'AB') }
|
59
|
+
let(:that) { Term.new(matcher: /B/, generate: 'AB') }
|
28
60
|
|
29
61
|
it "is not equal" do
|
30
62
|
expect(this).to_not eq that
|
@@ -34,25 +66,10 @@ module Pact
|
|
34
66
|
|
35
67
|
describe 'empty?' do
|
36
68
|
|
37
|
-
subject { Term.new(generate:
|
69
|
+
subject { Term.new(generate: 'some', matcher: /some/) }
|
38
70
|
|
39
|
-
|
40
|
-
|
41
|
-
let(:generate) { 'generate here'}
|
42
|
-
|
43
|
-
it 'is not empty' do
|
44
|
-
expect(subject).to_not be_empty
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
context 'without generate' do
|
50
|
-
|
51
|
-
let(:generate) { nil }
|
52
|
-
|
53
|
-
it 'is empty' do
|
54
|
-
expect(subject).to be_empty
|
55
|
-
end
|
71
|
+
it 'should return false' do
|
72
|
+
expect(subject).to_not be_empty
|
56
73
|
end
|
57
74
|
|
58
75
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -305,6 +305,7 @@ files:
|
|
305
305
|
- lib/pact/provider/verification_report.rb
|
306
306
|
- lib/pact/reification.rb
|
307
307
|
- lib/pact/request.rb
|
308
|
+
- lib/pact/something_like.rb
|
308
309
|
- lib/pact/tasks.rb
|
309
310
|
- lib/pact/term.rb
|
310
311
|
- lib/pact/verification_task.rb
|