pact 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ ### 1.0.6 (11 September 2012)
2
+
3
+ * Made reports dir configurable [Beth Skurrie]
4
+ * 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]
5
+
1
6
  ### 1.0.5 (6 September 2013)
2
7
 
3
8
  * Added verification reports when running rake pact:verify:xxx [Latheesh Padukana, Beth Skurrie]
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pact (1.0.5)
4
+ pact (1.0.6)
5
5
  awesome_print (~> 1.1.0)
6
6
  find_a_port (~> 1.0.1)
7
7
  hashie (~> 2.0)
data/README.md CHANGED
@@ -115,16 +115,23 @@ end
115
115
 
116
116
  ### Service Provider project
117
117
 
118
- #### Configure your service provider rack app
118
+ #### Configure your service provider
119
119
 
120
- Create a `pact_helper.rb` in your service provider project. The file must be called pact_helper.rb so the built in verification tasks can find it, however there is some flexibility in where it can be stored. The recommended place is `specs/service_providers/pact_helper.rb`.
120
+ Create a `pact_helper.rb` in your service provider project. The file must be called pact_helper.rb, however there is some flexibility in where it can be stored. The recommended place is `specs/service_providers/pact_helper.rb`.
121
121
 
122
122
  ```ruby
123
- require 'spec_helper'
124
- require 'provider_states_for_my_consumer' #See next section on setting up provider states
123
+ require 'my_app' # Require the boot files for your app
124
+ require 'provider_states_for_my_consumer' # See next section on setting up provider states
125
125
 
126
126
  Pact.service_provider "My Provider" do
127
127
  app { MyApp.new }
128
+
129
+ honours_pact_with 'My Consumer' do
130
+ # This example points to a local file, however, on a real project with a continuous
131
+ # integration box, you could publish your pacts as artifacts,
132
+ # and point this to the pact published by the last successful build.
133
+ pact_uri '../path-to-your-consumer-project/specs/pacts/my_consumer-my_provider.json'
134
+ end
128
135
  end
129
136
 
130
137
  ```
@@ -150,7 +157,6 @@ my_service.
150
157
  ```
151
158
 
152
159
  To define service provider states that create the right data for "a thing exists" and "a thing does not exist", write the following in the service provider project.
153
- Note that these states have been defined only for the 'My Consumer' consumer by using the Pact.provider_states_for block.
154
160
 
155
161
 
156
162
  ```ruby
@@ -180,35 +186,41 @@ end
180
186
 
181
187
  If a state should be used for all consumers, the top level Pact.with_consumer can be skipped, and a global Pact.provider_state can be defined on its own.
182
188
 
183
- #### Create a rake task to verify that the service provider honours the pact
184
-
185
- You'll need to create one or more pact:verify:xxx tasks, that allow the currently checked out service provider to be tested against other versions of its consumers - most importantly, head and production.
186
-
187
- Here is an example pact:verify:head task, pointing the the pact file for "some_consumer", found in the build artifacts of the latest successful build of "MY-CONSUMER" project.
189
+ #### Verify that the service provider honours the pact
188
190
 
189
191
  ```ruby
190
- Pact::VerificationTask.new(:head) do | pact |
191
- pact.uri 'http://our_build_server/MY-CONSUMER-BUILD/latestSuccessful/artifact/Pacts/some_consumer-this_service provider.json'
192
- end
192
+ #In your Rakefile
193
+ require 'pact/tasks'
193
194
  ```
194
195
 
195
- ```ruby
196
- # Ideally we'd like to be able to create a production task like this, but firewalls are making this tricky right now.
197
- Pact::VerificationTask.new(:production) do | pact |
198
- pact.uri 'http://our_prod_server/pacts/some_consumer-this_service_provider.json'
199
- end
196
+ ```
197
+ $ rake -T
198
+ rake pact:verify # Verifies the pact files configured in the pact_helper.rb against this service provider.
199
+ rake pact:verify:at[pact_uri] # Verifies the pact at the given URI against this service provider.
200
+ $ rake pact:verify
200
201
  ```
201
202
 
202
- The pact.uri may be a local file system path or a remote URL.
203
+ #### Verification using arbitrary pact files
203
204
 
204
- The support_file should include the code that makes your rack app available for the rack testing framework, and should load all its dependencies (eg include spec_helper)
205
+ ```
206
+ # Local URI
207
+ $ rake pact:verify:at[../path-to-your-consumer-project/specs/pacts/my_consumer-my_provider.json]
205
208
 
206
- Multiple pact.uri may be defined in the same rake task if a service provider has more than one consumer.
209
+ # Remote URI
210
+ $ rake pact:verify:at[http://build-box/MyConsumerBuild/latestSuccessful/artifacts/my_consumer-my_provider.json]
211
+ ```
207
212
 
208
- #### Verify that the service provider honours the pact
213
+ To make a shortcut task for pact at an arbitrary URI, add the following to your Rakefile.
209
214
 
210
- rake pact:verify:head
211
- rake pact:verify # will run all verify tasks
215
+ ```ruby
216
+ # This creates a rake task that can be executed by running
217
+ # $rake pact:verify:dev
218
+ Pact::VerificationTask.new(:dev) do | pact |
219
+ pact.uri '../path-to-your-consumer-project/specs/pacts/my_consumer-my_provider.json'
220
+ end
221
+ ```
222
+
223
+ The pact.uri may be a local file system path or a remote URL.
212
224
 
213
225
 
214
226
  ### Running a standalone mock server
@@ -9,6 +9,7 @@ module Pact
9
9
  attr_accessor :logger
10
10
  attr_accessor :tmp_dir
11
11
  attr_accessor :pactfile_write_mode
12
+ attr_accessor :reports_dir
12
13
 
13
14
  def log_path
14
15
  log_dir + "/pact_gem.log"
@@ -37,6 +38,7 @@ module Pact
37
38
  c.log_dir = default_log_dir
38
39
  c.logger = default_logger c.log_path
39
40
  c.pactfile_write_mode = is_rake_running? ? :overwrite : :update
41
+ c.reports_dir = File.expand_path('./reports/pacts')
40
42
  c
41
43
  end
42
44
 
@@ -10,4 +10,12 @@ module PactTaskHelper
10
10
  def redify string
11
11
  "\e[31m#{string}\e[m"
12
12
  end
13
+
14
+ def handle_verification_failure
15
+ exit_status = yield
16
+ if exit_status != 0
17
+ $stderr.puts failure_message
18
+ fail
19
+ end
20
+ end
13
21
  end
@@ -1 +1,4 @@
1
- #TODO delete this file after checking if any projects load it
1
+ require 'pact/configuration'
2
+ require 'pact/provider/dsl'
3
+ require 'pact/provider/client_project_pact_helper'
4
+ require 'pact/provider/pact_spec_runner'
@@ -0,0 +1,2 @@
1
+ require 'pact/provider/pact_helper_locator'
2
+ load Pact::Provider::PactHelperLocater.pact_helper_path
@@ -1,3 +1,5 @@
1
+ require_relative 'pact_verification'
2
+
1
3
  module Pact
2
4
 
3
5
  module Provider
@@ -15,7 +17,14 @@ module Pact
15
17
  else
16
18
  raise "Please configure your provider. See the Provider section in the README for examples."
17
19
  end
18
- end
20
+ end
21
+
22
+ def add_pact_verification verification
23
+ pact_verifications << verification
24
+ end
25
+ def pact_verifications
26
+ @pact_verifications ||= []
27
+ end
19
28
  end
20
29
 
21
30
  Pact::Configuration.send(:include, Configuration)
@@ -39,6 +48,35 @@ module Pact
39
48
  end
40
49
  end
41
50
 
51
+ class VerificationDSL
52
+ def initialize consumer_name, options = {}, &block
53
+ @consumer_name = consumer_name
54
+ @ref = options.fetch(:ref, :head)
55
+ @pact_uri = nil
56
+ instance_eval(&block)
57
+ end
58
+
59
+ def pact_uri pact_uri, options = {}
60
+ @pact_uri = pact_uri
61
+ end
62
+
63
+ def task task
64
+ @task = task
65
+ end
66
+
67
+ def create_verification
68
+ validate
69
+ Pact::Provider::PactVerification.new(@consumer_name, @pact_uri, @ref)
70
+ end
71
+
72
+ private
73
+
74
+ def validate
75
+ raise "Please provide a pact_uri for the verification" unless @pact_uri
76
+ end
77
+
78
+ end
79
+
42
80
  class ServiceProviderDSL
43
81
 
44
82
  def initialize name, &block
@@ -60,6 +98,11 @@ module Pact
60
98
  @app_block = block
61
99
  end
62
100
 
101
+ def honours_pact_with consumer_name, options = {}, &app_block
102
+ verification = VerificationDSL.new(consumer_name, options, &app_block).create_verification
103
+ Pact.configuration.add_pact_verification verification
104
+ end
105
+
63
106
  def create_service_provider
64
107
  validate
65
108
  ServiceProviderConfig.new(@name, &@app_block)
@@ -2,6 +2,7 @@ require 'pact/term'
2
2
  require 'awesome_print'
3
3
  require 'pact/matchers'
4
4
  require 'awesome_print'
5
+ require 'rspec'
5
6
 
6
7
  RSpec::Matchers.define :match_term do |expected|
7
8
  include Pact::Matchers
@@ -0,0 +1,22 @@
1
+ module Pact
2
+ module Provider
3
+ module PactHelperLocater
4
+ PACT_HELPER_FILE_PATTERNS = [
5
+ "spec/**/*service*consumer*/pact_helper.rb",
6
+ "spec/**/*consumer*/pact_helper.rb",
7
+ "spec/**/pact_helper.rb",
8
+ "**/pact_helper.rb"]
9
+
10
+ NO_PACT_HELPER_FOUND_MSG = "Please create a pact_helper.rb file that can be found using one of the following patterns: #{PACT_HELPER_FILE_PATTERNS.join(", ")}"
11
+
12
+ def self.pact_helper_path
13
+ pact_helper_search_results = []
14
+ PACT_HELPER_FILE_PATTERNS.find { | pattern | (pact_helper_search_results.concat(Dir.glob(pattern))).any? }
15
+ raise NO_PACT_HELPER_FOUND_MSG if pact_helper_search_results.empty?
16
+ "#{Dir.pwd}/#{pact_helper_search_results[0]}"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+
@@ -16,14 +16,6 @@ module Pact
16
16
  attr_reader :options
17
17
  attr_reader :output
18
18
 
19
- PACT_HELPER_FILE_PATTERNS = [
20
- "spec/**/*service*consumer*/pact_helper.rb",
21
- "spec/**/*consumer*/pact_helper.rb",
22
- "spec/**/pact_helper.rb",
23
- "**/pact_helper.rb"]
24
-
25
- NO_PACT_HELPER_FOUND_MSG = "Please create a pact_helper.rb file that can be found using one of the following patterns: #{PACT_HELPER_FILE_PATTERNS.join(", ")}"
26
-
27
19
  def initialize spec_definitions, options = {}
28
20
  @spec_definitions = spec_definitions
29
21
  @options = options
@@ -40,19 +32,13 @@ module Pact
40
32
 
41
33
  def require_pact_helper spec_definition
42
34
  if spec_definition[:support_file]
35
+ $stderr.puts "Specifying a support_file is deprecated. Please create a pact_helper.rb instead."
43
36
  require spec_definition[:support_file]
44
37
  else
45
- require pact_helper_file
38
+ require 'pact/provider/client_project_pact_helper'
46
39
  end
47
40
  end
48
41
 
49
- def pact_helper_file
50
- pact_helper_search_results = []
51
- PACT_HELPER_FILE_PATTERNS.find { | pattern | (pact_helper_search_results.concat(Dir.glob(pattern))).any? }
52
- raise NO_PACT_HELPER_FOUND_MSG if pact_helper_search_results.empty?
53
- "#{Dir.pwd}/#{pact_helper_search_results[0]}"
54
- end
55
-
56
42
  def initialize_specs
57
43
  spec_definitions.each do | spec_definition |
58
44
  require_pact_helper spec_definition
@@ -0,0 +1,17 @@
1
+ module Pact::Provider
2
+ class PactVerification
3
+ attr_reader :consumer_name, :uri, :ref
4
+ def initialize consumer_name, uri, ref
5
+ @consumer_name = consumer_name
6
+ @uri = uri
7
+ @ref = ref
8
+ end
9
+
10
+ def == other
11
+ other.is_a?(PactVerification) &&
12
+ consumer_name == other.consumer_name &&
13
+ uri == other.uri &&
14
+ ref == other.ref
15
+ end
16
+ end
17
+ end
@@ -38,7 +38,7 @@ module Pact
38
38
  @pact_spec_config = []
39
39
  @name = name
40
40
  yield self
41
- define_rake_task
41
+ rake_task
42
42
  end
43
43
 
44
44
  def uri(uri, options = {})
@@ -53,21 +53,21 @@ module Pact
53
53
  Pact::ConsumerContract.from_uri config[:uri]
54
54
  end
55
55
 
56
- def publish_report config, output, result
56
+ def publish_report config, output, result, provider_ref, reports_dir
57
57
  consumer_contract = parse_pactfile config
58
58
  #TODO - when checking out a historical version, provider ref will be prod, however it will think it is head. Fix this!!!!
59
59
  report = Provider::VerificationReport.new(
60
60
  :result => result,
61
61
  :output => output,
62
62
  :consumer => {:name => consumer_contract.consumer.name, :ref => name},
63
- :provider => {:name => consumer_contract.provider.name, :ref => 'head'}
63
+ :provider => {:name => consumer_contract.provider.name, :ref => provider_ref}
64
64
  )
65
65
 
66
- FileUtils.mkdir_p "./reports/pact"
67
- File.open("./reports/pact/#{report.report_file_name}", "w") { |file| file << JSON.pretty_generate(report) }
66
+ FileUtils.mkdir_p reports_dir
67
+ File.open("#{reports_dir}/#{report.report_file_name}", "w") { |file| file << JSON.pretty_generate(report) }
68
68
  end
69
69
 
70
- def define_rake_task
70
+ def rake_task
71
71
  namespace :pact do
72
72
  desc "Verify provider against the consumer pacts for #{name}"
73
73
  task "verify:#{name}" do
@@ -76,11 +76,13 @@ module Pact
76
76
  #TODO: Change this to accept the ConsumerContract that is already parsed, so we don't make the same request twice
77
77
  pact_spec_runner = Provider::PactSpecRunner.new([config])
78
78
  exit_status = pact_spec_runner.run
79
- publish_report config, pact_spec_runner.output, exit_status == 0
79
+ publish_report config, pact_spec_runner.output, exit_status == 0, 'head', Pact.configuration.reports_dir
80
80
  exit_status
81
81
  end
82
82
 
83
- fail failure_message if exit_statuses.any?{ | status | status != 0 }
83
+ handle_verification_failure do
84
+ exit_statuses.count{ | status | status != 0 }
85
+ end
84
86
  end
85
87
  end
86
88
  end
@@ -1,3 +1,3 @@
1
1
  module Pact
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.6"
3
3
  end
@@ -1,17 +1,31 @@
1
- require 'pact'
2
- require 'pact/pact_task_helper'
3
-
4
1
 
5
2
  namespace :pact do
6
3
 
7
- include PactTaskHelper
4
+ desc "Verifies the pact files configured in the pact_helper.rb against this service provider."
5
+ task :verify do
6
+ require 'pact/provider'
7
+ require 'pact/pact_task_helper'
8
+
9
+ include PactTaskHelper
8
10
 
9
- desc "Runs the specified pact file against the service provider"
10
- task :verify, :pact_uri do | t, args |
11
- require 'pact/provider/pact_spec_runner'
12
- puts "Using pact at uri #{args[:pact_uri]}"
13
- pact_spec_config = {uri: args[:pact_uri]}
14
- exit_status = Pact::Provider::PactSpecRunner.run([pact_spec_config])
15
- fail failure_message if exit_status != 0
11
+ handle_verification_failure do
12
+ pact_verifications = Pact.configuration.pact_verifications
13
+ verification_configs = pact_verifications.collect { | pact_verification | { :uri => pact_verification.uri }}
14
+ Pact::Provider::PactSpecRunner.new(verification_configs).run
15
+ end
16
16
  end
17
+
18
+ desc "Verifies the pact at the given URI against this service provider."
19
+ task 'verify:at', :pact_uri do | t, args |
20
+ require 'pact/provider'
21
+ require 'pact/pact_task_helper'
22
+
23
+ include PactTaskHelper
24
+
25
+ handle_verification_failure do
26
+ puts "Verifying pact at uri #{args[:pact_uri]}"
27
+ Pact::Provider::PactSpecRunner.new([{uri: args[:pact_uri]}]).run
28
+ end
29
+ end
30
+
17
31
  end
@@ -39,6 +39,47 @@ module Pact::Provider
39
39
 
40
40
  module DSL
41
41
 
42
+ describe VerificationDSL do
43
+
44
+
45
+ describe 'create_verification' do
46
+ let(:url) {'http://some/uri'}
47
+ let(:consumer_name) {'some consumer'}
48
+ let(:ref) {:prod}
49
+ let(:options) { {:ref => :prod} }
50
+ context "with valid values" do
51
+ subject do
52
+ uri = url
53
+ VerificationDSL.new(consumer_name, options) do
54
+ pact_uri uri
55
+ end
56
+ end
57
+
58
+ it "creates a Verification" do
59
+ Pact::Provider::PactVerification.should_receive(:new).with(consumer_name, url, ref)
60
+ subject.create_verification
61
+ end
62
+
63
+ it "returns a Verification" do
64
+ Pact::Provider::PactVerification.should_receive(:new).and_return('a verification')
65
+ expect(subject.create_verification).to eq('a verification')
66
+ end
67
+ end
68
+
69
+ context "with a nil uri" do
70
+ subject do
71
+ VerificationDSL.new(consumer_name, options) do
72
+ pact_uri nil
73
+ end
74
+ end
75
+
76
+ it "raises a validation error" do
77
+ expect{ subject.create_verification}.to raise_error /Please provide a pact_uri/
78
+ end
79
+ end
80
+ end
81
+ end
82
+
42
83
  describe ServiceProviderDSL do
43
84
 
44
85
  describe "initialize" do
@@ -86,6 +127,42 @@ module Pact::Provider
86
127
  end
87
128
  end
88
129
  end
130
+
131
+ describe 'honours_pact_with' do
132
+ before do
133
+ Pact.clear_configuration
134
+ end
135
+
136
+ context "with no optional params" do
137
+ subject do
138
+ ServiceProviderDSL.new '' do
139
+ honours_pact_with 'some-consumer' do
140
+ pact_uri 'blah'
141
+ end
142
+ end
143
+ end
144
+ it 'adds a verification to the Pact.configuration' do
145
+ subject
146
+ expect(Pact.configuration.pact_verifications.first).to eq(Pact::Provider::PactVerification.new('some-consumer', 'blah', :head))
147
+ end
148
+ end
149
+
150
+ context "with all params specified" do
151
+ subject do
152
+ ServiceProviderDSL.new '' do
153
+ honours_pact_with 'some-consumer', :ref => :prod do
154
+ pact_uri 'blah'
155
+ end
156
+ end
157
+ end
158
+ it 'adds a verification to the Pact.configuration' do
159
+ subject
160
+ expect(Pact.configuration.pact_verifications.first).to eq(Pact::Provider::PactVerification.new('some-consumer', 'blah', :prod))
161
+ end
162
+
163
+ end
164
+
165
+ end
89
166
  end
90
167
 
91
168
  describe ServiceProviderConfig do
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'pact/provider/pact_helper_locator'
3
+
4
+ module Pact::Provider
5
+
6
+ describe PactHelperLocater do
7
+ describe "pact_helper_path", :fakefs => true do
8
+
9
+ subject { PactHelperLocater.pact_helper_path }
10
+
11
+ def make_pactfile dir
12
+ FileUtils.mkdir_p ".#{dir}"
13
+ FileUtils.touch ".#{dir}/pact_helper.rb"
14
+ end
15
+
16
+ PACT_HELPER_FILE_DIRS = [
17
+ '/spec/blah/service-consumers',
18
+ '/spec/consumers',
19
+ '/spec/blah/service_consumers',
20
+ '/spec/serviceconsumers',
21
+ '/spec/consumer',
22
+ '/spec',
23
+ '/blah',
24
+ '/blah/consumer',
25
+ ''
26
+ ]
27
+
28
+ PACT_HELPER_FILE_DIRS.each do | dir |
29
+ context "the pact_helper is stored in #{dir}" do
30
+ it "finds the pact_helper" do
31
+ make_pactfile dir
32
+ expect(subject).to eq "#{Dir.pwd}#{dir}/pact_helper.rb"
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when more than one pact_helper exists" do
38
+ it "returns the one that matches the most explict search pattern" do
39
+ make_pactfile '/spec/consumer'
40
+ FileUtils.touch 'pact_helper.rb'
41
+ expect(subject).to eq "#{Dir.pwd}/spec/consumer/pact_helper.rb"
42
+ end
43
+ end
44
+
45
+ context "when a file exists ending in pact_helper.rb" do
46
+ it "is not identifed as a pact helper" do
47
+ FileUtils.mkdir_p './spec'
48
+ FileUtils.touch './spec/not_pact_helper.rb'
49
+ expect { subject }.to raise_error /Please create a pact_helper.rb file/
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -3,43 +3,5 @@ require 'pact/provider/pact_spec_runner'
3
3
 
4
4
  module Pact::Provider
5
5
  describe PactSpecRunner do
6
- describe "pact_helper_file", :fakefs => true do
7
-
8
- subject { PactSpecRunner.new({}).send(:pact_helper_file) }
9
-
10
- def make_pactfile dir
11
- FileUtils.mkdir_p ".#{dir}"
12
- FileUtils.touch ".#{dir}/pact_helper.rb"
13
- end
14
-
15
- PACT_HELPER_FILE_DIRS = [
16
- '/spec/blah/service-consumers',
17
- '/spec/consumers',
18
- '/spec/blah/service_consumers',
19
- '/spec/serviceconsumers',
20
- '/spec/consumer',
21
- '/spec',
22
- '/blah',
23
- '/blah/consumer',
24
- ''
25
- ]
26
-
27
- PACT_HELPER_FILE_DIRS.each do | dir |
28
- context "the pact_helper is stored in #{dir}" do
29
- it "finds the pact_helper" do
30
- make_pactfile dir
31
- expect(subject).to eq "#{Dir.pwd}#{dir}/pact_helper.rb"
32
- end
33
- end
34
- end
35
-
36
- context "when more than one pact_helper exists" do
37
- it "returns the one that matches the most explict search pattern" do
38
- make_pactfile '/spec/consumer'
39
- FileUtils.touch 'pact_helper.rb'
40
- expect(subject).to eq "#{Dir.pwd}/spec/consumer/pact_helper.rb"
41
- end
42
- end
43
- end
44
6
  end
45
7
  end
@@ -70,6 +70,7 @@ module Pact
70
70
  let(:exit_code) {1}
71
71
 
72
72
  it 'raises an exception' do
73
+ $stderr.should_receive(:puts) #Confusing if this shows on the screen!
73
74
  expect { Rake::Task[@task_name].execute }.to raise_error RuntimeError
74
75
  end
75
76
 
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'pact/provider/rspec'
2
3
  # pact_helper for rake pact:tests
3
4
 
4
5
  module Pact
@@ -15,6 +16,10 @@ module Pact
15
16
 
16
17
  Pact.service_provider "Some Provider" do
17
18
  app { TestApp.new }
19
+
20
+ honours_pact_with 'some-test-consumer' do
21
+ pact_uri './spec/support/test_app_pass.json'
22
+ end
18
23
  end
19
24
 
20
25
 
@@ -1,9 +1,12 @@
1
- require './lib/pact/provider/pact_spec_runner'
2
1
 
3
2
  namespace :pact do
4
3
 
5
4
  desc 'Runs pact tests against a sample application, testing failure and success.'
6
5
  task :tests do
6
+
7
+ require 'pact/provider/pact_spec_runner'
8
+ require 'open3'
9
+
7
10
  silent = true
8
11
  puts "Running task pact:tests"
9
12
  # Run these specs silently, otherwise expected failures will be written to stdout and look like unexpected failures.
@@ -14,7 +17,29 @@ namespace :pact do
14
17
  result = Pact::Provider::PactSpecRunner.new([{ uri: './spec/support/test_app_fail.json', support_file: './spec/support/pact_helper.rb' }], silent: silent).run
15
18
  fail 'Expected pact to fail' if (result == 0)
16
19
 
20
+ expect_to_pass "bundle exec rake pact:verify"
21
+ expect_to_pass "bundle exec rake pact:verify:at[./spec/support/test_app_pass.json]"
22
+ expect_to_fail "bundle exec rake pact:verify:at[./spec/support/test_app_fail.json]"
23
+
17
24
  puts "Task pact:tests completed succesfully."
18
25
  end
19
26
 
27
+ def expect_to_fail command
28
+ success = execute_command command
29
+ fail "Expected '#{command}' to fail" if success
30
+ end
31
+
32
+ def expect_to_pass command
33
+ success = execute_command command
34
+ fail "Expected '#{command}' to pass" unless success
35
+ end
36
+
37
+ def execute_command command
38
+ result = nil
39
+ Open3.popen3(command) {|stdin, stdout, stderr, wait_thr|
40
+ result = wait_thr.value
41
+ }
42
+ result.success?
43
+ end
44
+
20
45
  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.5
4
+ version: 1.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-09-15 00:00:00.000000000 Z
16
+ date: 2013-09-17 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: randexp
@@ -293,9 +293,12 @@ files:
293
293
  - lib/pact/matchers/matchers.rb
294
294
  - lib/pact/pact_task_helper.rb
295
295
  - lib/pact/provider.rb
296
+ - lib/pact/provider/client_project_pact_helper.rb
296
297
  - lib/pact/provider/dsl.rb
297
298
  - lib/pact/provider/matchers.rb
299
+ - lib/pact/provider/pact_helper_locator.rb
298
300
  - lib/pact/provider/pact_spec_runner.rb
301
+ - lib/pact/provider/pact_verification.rb
299
302
  - lib/pact/provider/provider_state.rb
300
303
  - lib/pact/provider/rspec.rb
301
304
  - lib/pact/provider/test_methods.rb
@@ -326,6 +329,7 @@ files:
326
329
  - spec/lib/pact/consumer_contract/interaction_spec.rb
327
330
  - spec/lib/pact/matchers/matchers_spec.rb
328
331
  - spec/lib/pact/provider/dsl_spec.rb
332
+ - spec/lib/pact/provider/pact_helper_locator_spec.rb
329
333
  - spec/lib/pact/provider/pact_spec_runner_spec.rb
330
334
  - spec/lib/pact/provider/provider_state_spec.rb
331
335
  - spec/lib/pact/provider/rspec_spec.rb
@@ -386,6 +390,7 @@ test_files:
386
390
  - spec/lib/pact/consumer_contract/interaction_spec.rb
387
391
  - spec/lib/pact/matchers/matchers_spec.rb
388
392
  - spec/lib/pact/provider/dsl_spec.rb
393
+ - spec/lib/pact/provider/pact_helper_locator_spec.rb
389
394
  - spec/lib/pact/provider/pact_spec_runner_spec.rb
390
395
  - spec/lib/pact/provider/provider_state_spec.rb
391
396
  - spec/lib/pact/provider/rspec_spec.rb