pact 1.1.1 → 1.2.1.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +42 -39
- data/README.md +2 -0
- data/documentation/configuration.md +2 -2
- data/documentation/faq.md +5 -7
- data/documentation/provider-states.md +2 -10
- data/example/animal-service/spec/service_consumers/pact_helper.rb +0 -4
- data/lib/pact/consumer/configuration/mock_service.rb +2 -0
- data/lib/pact/consumer/consumer_contract_builder.rb +58 -58
- data/lib/pact/consumer/mock_service/app.rb +4 -1
- data/lib/pact/consumer/mock_service/interaction_replay.rb +11 -3
- data/lib/pact/consumer/mock_service/missing_interactions_get.rb +2 -2
- data/lib/pact/consumer/mock_service/pact_post.rb +33 -0
- data/lib/pact/consumer/mock_service/verification_get.rb +1 -2
- data/lib/pact/consumer/mock_service_client.rb +14 -5
- data/lib/pact/consumer/mock_service_interaction_expectation.rb +1 -1
- data/lib/pact/consumer/spec_hooks.rb +2 -0
- data/lib/pact/consumer/world.rb +25 -0
- data/lib/pact/consumer_contract/consumer_contract.rb +1 -1
- data/lib/pact/consumer_contract/consumer_contract_writer.rb +84 -0
- data/lib/pact/consumer_contract/file_name.rb +7 -1
- data/lib/pact/provider/pact_helper_locator.rb +1 -1
- data/lib/pact/provider/pact_spec_runner.rb +3 -9
- data/lib/pact/provider/rspec/{formatter.rb → formatter_rspec_2.rb} +2 -2
- data/lib/pact/provider/rspec/formatter_rspec_3.rb +96 -0
- data/lib/pact/provider/rspec/matchers.rb +79 -19
- data/lib/pact/provider/rspec.rb +3 -1
- data/lib/pact/provider/state/provider_state_configured_modules.rb +6 -0
- data/lib/pact/provider/state/provider_state_manager.rb +3 -3
- data/lib/pact/provider/world.rb +2 -8
- data/lib/pact/rspec.rb +32 -0
- data/lib/pact/version.rb +1 -1
- data/pact.gemspec +3 -3
- data/spec/features/consumption_spec.rb +6 -1
- data/spec/integration/consumer_spec.rb +16 -9
- data/spec/integration/pact/consumer_configuration_spec.rb +7 -22
- data/spec/lib/pact/app_spec.rb +5 -5
- data/spec/lib/pact/configuration_spec.rb +1 -1
- data/spec/lib/pact/consumer/app_manager_spec.rb +3 -3
- data/spec/lib/pact/consumer/configuration_spec.rb +11 -8
- data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +3 -101
- data/spec/lib/pact/consumer/interaction_builder_spec.rb +8 -8
- data/spec/lib/pact/consumer/mock_service/app_spec.rb +2 -2
- data/spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb +2 -2
- data/spec/lib/pact/consumer/mock_service/interaction_replay_spec.rb +12 -0
- data/spec/lib/pact/consumer/mock_service/verification_get_spec.rb +2 -2
- data/spec/lib/pact/consumer/mock_service_client_spec.rb +88 -0
- data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +4 -4
- data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +18 -18
- data/spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb +111 -0
- data/spec/lib/pact/provider/configuration/pact_verification_spec.rb +1 -1
- data/spec/lib/pact/provider/pact_helper_locator_spec.rb +2 -2
- data/spec/lib/pact/provider/rspec/{formatter_spec.rb → formatter_rspec_2_spec.rb} +14 -4
- data/spec/lib/pact/provider/rspec/formatter_rspec_3_spec.rb +72 -0
- data/spec/lib/pact/provider/rspec_spec.rb +3 -0
- data/spec/lib/pact/provider/state/provider_state_manager_spec.rb +1 -1
- data/spec/lib/pact/provider/state/provider_state_proxy_spec.rb +4 -4
- data/spec/lib/pact/provider/state/provider_state_spec.rb +7 -7
- data/spec/lib/pact/provider/world_spec.rb +8 -8
- data/spec/lib/pact/tasks/verification_task_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -4
- data/spec/support/factories.rb +13 -13
- data/spec/support/spec_support.rb +10 -0
- data/spec/support/stubbing_using_allow.rb +0 -4
- data/tasks/pact-test.rake +12 -8
- metadata +27 -24
- data/bethtest.rb +0 -30
- data/lib/pact/provider/rspec/silent_json_formatter.rb +0 -18
- data/spec/support/stubbing.rb +0 -26
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer_contract/consumer_contract_writer'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
|
6
|
+
describe ConsumerContractWriter do
|
7
|
+
|
8
|
+
let(:support_pact_file) { './spec/support/a_consumer-a_provider.json' }
|
9
|
+
let(:consumer_name) { 'a consumer' }
|
10
|
+
let(:provider_name) { 'a provider' }
|
11
|
+
|
12
|
+
before do
|
13
|
+
Pact.clear_configuration
|
14
|
+
allow(Pact.configuration).to receive(:pact_dir).and_return(File.expand_path(tmp_pact_dir))
|
15
|
+
FileUtils.rm_rf tmp_pact_dir
|
16
|
+
FileUtils.mkdir_p tmp_pact_dir
|
17
|
+
FileUtils.cp support_pact_file, "#{tmp_pact_dir}/a_consumer-a_provider.json"
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:existing_interactions) { ConsumerContract.from_json(File.read(support_pact_file)).interactions }
|
21
|
+
let(:new_interactions) { [InteractionFactory.create] }
|
22
|
+
let(:tmp_pact_dir) {"./tmp/pacts"}
|
23
|
+
let(:logger) { double("logger").as_null_object }
|
24
|
+
let(:pactfile_write_mode) {:overwrite}
|
25
|
+
let(:consumer_contract_details) {
|
26
|
+
{
|
27
|
+
consumer: {name: consumer_name},
|
28
|
+
provider: {name: provider_name},
|
29
|
+
pactfile_write_mode: pactfile_write_mode,
|
30
|
+
interactions: new_interactions
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
let(:consumer_contract_writer) { ConsumerContractWriter.new(consumer_contract_details, logger) }
|
35
|
+
|
36
|
+
describe "consumer_contract" do
|
37
|
+
|
38
|
+
let(:subject) { consumer_contract_writer.consumer_contract }
|
39
|
+
|
40
|
+
context "when overwriting pact" do
|
41
|
+
|
42
|
+
it "it uses only the interactions from the current test run" do
|
43
|
+
expect(consumer_contract_writer.consumer_contract.interactions).to eq new_interactions
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when updating pact" do
|
49
|
+
|
50
|
+
let(:pactfile_write_mode) {:update}
|
51
|
+
|
52
|
+
it "merges the interactions from the current test run with the interactions from the existing file" do
|
53
|
+
allow_any_instance_of(ConsumerContractWriter).to receive(:info_and_puts)
|
54
|
+
expect(consumer_contract_writer.consumer_contract.interactions).to eq existing_interactions + new_interactions
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:line0) { /\*/ }
|
58
|
+
let(:line1) { /Updating existing file/ }
|
59
|
+
let(:line2) { /Only interactions defined in this test run will be updated/ }
|
60
|
+
let(:line3) { /As interactions are identified by description and provider state/ }
|
61
|
+
|
62
|
+
it "logs a description message" do
|
63
|
+
expect($stdout).to receive(:puts).with(line0).twice
|
64
|
+
expect($stdout).to receive(:puts).with(line1)
|
65
|
+
expect($stdout).to receive(:puts).with(line2)
|
66
|
+
expect($stdout).to receive(:puts).with(line3)
|
67
|
+
expect(logger).to receive(:info).with(line0).twice
|
68
|
+
expect(logger).to receive(:info).with(line1)
|
69
|
+
expect(logger).to receive(:info).with(line2)
|
70
|
+
expect(logger).to receive(:info).with(line3)
|
71
|
+
consumer_contract_writer.consumer_contract
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when an error occurs deserializing the existing pactfile" do
|
76
|
+
|
77
|
+
let(:pactfile_write_mode) {:update}
|
78
|
+
let(:error) { RuntimeError.new('some error')}
|
79
|
+
let(:line1) { /Could not load existing consumer contract from .* due to some error/ }
|
80
|
+
let(:line2) {'Creating a new file.'}
|
81
|
+
|
82
|
+
before do
|
83
|
+
allow(ConsumerContract).to receive(:from_json).and_raise(error)
|
84
|
+
allow($stderr).to receive(:puts)
|
85
|
+
allow(logger).to receive(:puts)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "logs the error" do
|
89
|
+
expect($stderr).to receive(:puts).with(line1)
|
90
|
+
expect($stderr).to receive(:puts).with(line2)
|
91
|
+
expect(logger).to receive(:warn).with(line1)
|
92
|
+
expect(logger).to receive(:warn).with(line2)
|
93
|
+
consumer_contract_writer.consumer_contract
|
94
|
+
end
|
95
|
+
|
96
|
+
it "uses the new interactions" do
|
97
|
+
expect(consumer_contract_writer.consumer_contract.interactions).to eq new_interactions
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "write" do
|
103
|
+
it "writes the pact file" do
|
104
|
+
expect_any_instance_of(ConsumerContract).to receive(:update_pactfile)
|
105
|
+
consumer_contract_writer.write
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
@@ -29,7 +29,7 @@ module Pact::Provider
|
|
29
29
|
context "the pact_helper is stored in #{dir}" do
|
30
30
|
it "finds the pact_helper" do
|
31
31
|
make_pactfile dir
|
32
|
-
expect(subject).to eq
|
32
|
+
expect(subject).to eq File.join(Dir.pwd, dir, 'pact_helper.rb')
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -38,7 +38,7 @@ module Pact::Provider
|
|
38
38
|
it "returns the one that matches the most explict search pattern" do
|
39
39
|
make_pactfile '/spec/consumer'
|
40
40
|
FileUtils.touch 'pact_helper.rb'
|
41
|
-
expect(subject).to eq
|
41
|
+
expect(subject).to eq File.join(Dir.pwd, '/spec/consumer/pact_helper.rb')
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -1,12 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'pact/provider/rspec/
|
2
|
+
require 'pact/provider/rspec/formatter_rspec_2'
|
3
3
|
require './spec/support/factories'
|
4
4
|
require './spec/support/spec_support'
|
5
5
|
|
6
6
|
module Pact
|
7
7
|
module Provider
|
8
8
|
module RSpec
|
9
|
-
describe
|
9
|
+
describe Formatter2 do
|
10
|
+
|
11
|
+
Pact::RSpec.with_rspec_3 do
|
12
|
+
|
13
|
+
# These methods don't exist in RSpec3
|
14
|
+
class Formatter2
|
15
|
+
def failure_color arg ; arg; end
|
16
|
+
def detail_color arg ; arg; end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
10
20
|
|
11
21
|
let(:interaction) { InteractionFactory.create 'provider_state' => 'a state', 'description' => 'a description'}
|
12
22
|
let(:pactfile_uri) { 'pact_file_uri' }
|
@@ -18,14 +28,14 @@ module Pact
|
|
18
28
|
let(:rerun_command) { "rake pact:verify:at[pact_file_uri] PACT_DESCRIPTION=\"a description\" PACT_PROVIDER_STATE=\"a state\" # an interaction" }
|
19
29
|
let(:missing_provider_states) { 'missing_provider_states'}
|
20
30
|
|
21
|
-
subject {
|
31
|
+
subject { Formatter2.new output }
|
22
32
|
|
23
33
|
let(:output_result) { Pact::SpecSupport.remove_ansicolor output.string }
|
24
34
|
|
25
35
|
before do
|
26
36
|
allow(PrintMissingProviderStates).to receive(:call)
|
27
37
|
allow(subject).to receive(:failed_examples).and_return(failed_examples)
|
28
|
-
allow(Pact.
|
38
|
+
allow(Pact.provider_world.provider_states).to receive(:missing_provider_states).and_return(missing_provider_states)
|
29
39
|
subject.dump_commands_to_rerun_failed_examples
|
30
40
|
end
|
31
41
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/provider/rspec/formatter_rspec_3'
|
3
|
+
require './spec/support/factories'
|
4
|
+
require './spec/support/spec_support'
|
5
|
+
|
6
|
+
Pact::RSpec.with_rspec_3 do
|
7
|
+
module Pact
|
8
|
+
module Provider
|
9
|
+
module RSpec
|
10
|
+
describe Formatter do
|
11
|
+
|
12
|
+
let(:interaction) { InteractionFactory.create 'provider_state' => 'a state', 'description' => 'a description'}
|
13
|
+
let(:pactfile_uri) { 'pact_file_uri' }
|
14
|
+
let(:description) { 'an interaction' }
|
15
|
+
let(:metadata) { {pact_interaction: interaction, pactfile_uri: pactfile_uri, pact_interaction_example_description: description}}
|
16
|
+
let(:metadata_2) { metadata.merge(pact_interaction_example_description: 'another interaction')}
|
17
|
+
let(:example) { double("Example", metadata: metadata) }
|
18
|
+
let(:example_2) { double("Example", metadata: metadata_2) }
|
19
|
+
let(:failed_examples) { [example, example] }
|
20
|
+
let(:examples) { [example, example, example_2]}
|
21
|
+
let(:output) { StringIO.new }
|
22
|
+
let(:rerun_command) { "rake pact:verify:at[pact_file_uri] PACT_DESCRIPTION=\"a description\" PACT_PROVIDER_STATE=\"a state\" # an interaction" }
|
23
|
+
let(:missing_provider_states) { 'missing_provider_states'}
|
24
|
+
let(:summary) { double("summary", failure_count: 1, failed_examples: failed_examples, examples: examples)}
|
25
|
+
|
26
|
+
subject { Formatter.new output }
|
27
|
+
|
28
|
+
let(:output_result) { Pact::SpecSupport.remove_ansicolor output.string }
|
29
|
+
|
30
|
+
before do
|
31
|
+
allow(PrintMissingProviderStates).to receive(:call)
|
32
|
+
allow(subject).to receive(:failed_examples).and_return(failed_examples)
|
33
|
+
allow(Pact.provider_world.provider_states).to receive(:missing_provider_states).and_return(missing_provider_states)
|
34
|
+
subject.dump_summary summary
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#dump_summary" do
|
38
|
+
it "prints a list of rerun commands" do
|
39
|
+
expect(output_result).to include(rerun_command)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "only prints unique commands" do
|
43
|
+
expect(output_result.scan(rerun_command).size).to eq 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it "prints a message about the logs" do
|
47
|
+
expect(output_result).to include("For assistance debugging failures")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "prints the number of interactions" do
|
51
|
+
expect(output_result).to include("2 interactions")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "prints the number of failures" do
|
55
|
+
expect(output_result).to include("1 failure")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "prints missing provider states" do
|
59
|
+
expect(PrintMissingProviderStates).to receive(:call).with(missing_provider_states, output)
|
60
|
+
subject.dump_summary summary
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
@@ -16,13 +16,13 @@ module Pact
|
|
16
16
|
subject { provider_state_proxy.get name, options }
|
17
17
|
|
18
18
|
before do
|
19
|
-
ProviderStates.
|
19
|
+
allow(ProviderStates).to receive(:get).and_return(provider_state)
|
20
20
|
end
|
21
21
|
|
22
22
|
context "when the provider state exists" do
|
23
23
|
|
24
24
|
it "retrieves the provider state from ProviderState" do
|
25
|
-
ProviderStates.
|
25
|
+
expect(ProviderStates).to receive(:get).with(name, options).and_return(provider_state)
|
26
26
|
subject
|
27
27
|
end
|
28
28
|
|
@@ -61,13 +61,13 @@ module Pact
|
|
61
61
|
describe "get_base" do
|
62
62
|
|
63
63
|
before do
|
64
|
-
ProviderStates.
|
64
|
+
allow(ProviderStates).to receive(:get_base).and_return(provider_state)
|
65
65
|
end
|
66
66
|
|
67
67
|
subject { provider_state_proxy.get_base options }
|
68
68
|
|
69
69
|
it "calls through to ProviderStates" do
|
70
|
-
ProviderStates.
|
70
|
+
expect(ProviderStates).to receive(:get_base).with(options)
|
71
71
|
subject
|
72
72
|
end
|
73
73
|
|
@@ -33,26 +33,26 @@ module Pact
|
|
33
33
|
describe 'set_up' do
|
34
34
|
it 'should call the block passed to set_up' do
|
35
35
|
subject.set_up
|
36
|
-
MESSAGES.
|
36
|
+
expect(MESSAGES).to eq ['set_up']
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe 'tear_down' do
|
41
41
|
it 'should call the block passed to set_up' do
|
42
42
|
subject.tear_down
|
43
|
-
MESSAGES.
|
43
|
+
expect(MESSAGES).to eq ['tear_down']
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
describe '.get' do
|
48
48
|
context 'when the name is a matching symbol' do
|
49
49
|
it 'will return the ProviderState' do
|
50
|
-
ProviderStates.get('no_alligators').
|
50
|
+
expect(ProviderStates.get('no_alligators')).to_not be_nil
|
51
51
|
end
|
52
52
|
end
|
53
53
|
context 'when the name is a matching string' do
|
54
54
|
it 'will return the ProviderState' do
|
55
|
-
ProviderStates.get('some alligators').
|
55
|
+
expect(ProviderStates.get('some alligators')).to_not be_nil
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -121,11 +121,11 @@ module Pact
|
|
121
121
|
describe '.get' do
|
122
122
|
context 'for a consumer' do
|
123
123
|
it 'has a namespaced name' do
|
124
|
-
ProviderStates.get('the weather is sunny', :for => 'a consumer').
|
124
|
+
expect(ProviderStates.get('the weather is sunny', :for => 'a consumer')).to_not be_nil
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'falls back to a global state of the same name if one is not found for the specified consumer' do
|
128
|
-
ProviderStates.get('the weather is cloudy', :for => 'a consumer').
|
128
|
+
expect(ProviderStates.get('the weather is cloudy', :for => 'a consumer')).to_not be_nil
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
@@ -135,7 +135,7 @@ module Pact
|
|
135
135
|
context 'for a consumer' do
|
136
136
|
it 'runs its own setup' do
|
137
137
|
ProviderStates.get('the weather is sunny', :for => 'a consumer').set_up
|
138
|
-
NAMESPACED_MESSAGES.
|
138
|
+
expect(NAMESPACED_MESSAGES).to eq ['sunny!']
|
139
139
|
end
|
140
140
|
end
|
141
141
|
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
2
|
+
load 'pact/provider/world.rb'
|
3
3
|
|
4
4
|
describe Pact do
|
5
|
-
describe ".
|
5
|
+
describe ".provider_world" do
|
6
6
|
it "returns a world" do
|
7
|
-
expect(Pact.
|
7
|
+
expect(Pact.provider_world).to be_instance_of Pact::Provider::World
|
8
8
|
end
|
9
9
|
it "returns the same world each time" do
|
10
|
-
expect(Pact.
|
10
|
+
expect(Pact.provider_world).to be Pact.provider_world
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
describe ".
|
14
|
+
describe ".clear_provider_world" do
|
15
15
|
it "clears the world" do
|
16
|
-
original_world = Pact.
|
17
|
-
Pact.
|
18
|
-
expect(original_world).to_not be Pact.
|
16
|
+
original_world = Pact.provider_world
|
17
|
+
Pact.clear_provider_world
|
18
|
+
expect(original_world).to_not be Pact.provider_world
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -30,12 +30,12 @@ module Pact
|
|
30
30
|
describe '.initialize' do
|
31
31
|
context 'with an explict pact_helper' do
|
32
32
|
it 'creates the tasks' do
|
33
|
-
Rake::Task.tasks.
|
33
|
+
expect(Rake::Task.tasks).to include_task @task_name
|
34
34
|
end
|
35
35
|
end
|
36
36
|
context 'with no explict pact_helper' do
|
37
37
|
it 'creates the tasks' do
|
38
|
-
Rake::Task.tasks.
|
38
|
+
expect(Rake::Task.tasks).to include_task @task_name_with_explict_pact_helper
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'rspec'
|
2
|
-
require 'rspec/fire'
|
3
2
|
require 'fakefs/spec_helpers'
|
4
3
|
require 'rspec'
|
5
4
|
require 'pact'
|
6
5
|
require 'webmock/rspec'
|
7
|
-
|
8
|
-
|
6
|
+
require 'support/factories'
|
7
|
+
require 'support/spec_support'
|
9
8
|
require 'pact/provider/rspec'
|
10
9
|
|
11
10
|
WebMock.disable_net_connect!(allow_localhost: true)
|
@@ -14,7 +13,6 @@ require './spec/support/active_support_if_configured'
|
|
14
13
|
|
15
14
|
RSpec.configure do | config |
|
16
15
|
config.include(FakeFS::SpecHelpers, :fakefs => true)
|
17
|
-
config.include(RSpec::Fire)
|
18
16
|
|
19
17
|
config.extend Pact::Provider::RSpec::ClassMethods
|
20
18
|
config.include Pact::Provider::RSpec::InstanceMethods
|
data/spec/support/factories.rb
CHANGED
@@ -27,20 +27,20 @@ class InteractionFactory
|
|
27
27
|
|
28
28
|
extend Pact::HashUtils
|
29
29
|
|
30
|
-
DEFAULTS = Hash[
|
31
|
-
'request' => {
|
32
|
-
'path' => '/path',
|
33
|
-
'method' => 'get',
|
34
|
-
},
|
35
|
-
'response' => {
|
36
|
-
'body' => {a: 'response body'}
|
37
|
-
},
|
38
|
-
'description' => 'a description',
|
39
|
-
'provider_state' => 'a thing exists'
|
40
|
-
]
|
41
|
-
|
42
30
|
def self.create hash = {}
|
43
|
-
|
31
|
+
defaults = {
|
32
|
+
'description' => 'a description',
|
33
|
+
'provider_state' => 'a thing exists',
|
34
|
+
'request' => {
|
35
|
+
'path' => '/path',
|
36
|
+
'method' => 'get',
|
37
|
+
},
|
38
|
+
'response' => {
|
39
|
+
'status' => 200,
|
40
|
+
'body' => {a: 'response body'}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
Pact::Interaction.from_hash(stringify_keys(deep_merge(defaults, stringify_keys(hash))))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pact/rspec'
|
2
|
+
|
1
3
|
module Pact
|
2
4
|
module SpecSupport
|
3
5
|
|
@@ -6,5 +8,13 @@ module Pact
|
|
6
8
|
def remove_ansicolor string
|
7
9
|
string.gsub(/\e\[(\d+)m/, '')
|
8
10
|
end
|
11
|
+
|
12
|
+
Pact::RSpec.with_rspec_2 do
|
13
|
+
|
14
|
+
def instance_double *args
|
15
|
+
double(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
9
19
|
end
|
10
20
|
end
|
@@ -24,10 +24,6 @@ end
|
|
24
24
|
# Include the ExampleMethods module after the provider states are declared
|
25
25
|
# to ensure the ordering doesn't matter
|
26
26
|
|
27
|
-
Pact.configure do | config |
|
28
|
-
config.include RSpec::Mocks::ExampleMethods
|
29
|
-
end
|
30
|
-
|
31
27
|
Pact.service_provider 'Provider' do
|
32
28
|
app { App }
|
33
29
|
end
|
data/tasks/pact-test.rake
CHANGED
@@ -2,10 +2,6 @@ require 'pact/tasks/verification_task'
|
|
2
2
|
require 'open3'
|
3
3
|
|
4
4
|
Pact::VerificationTask.new(:stubbing) do | pact |
|
5
|
-
pact.uri './spec/support/stubbing.json', :pact_helper => './spec/support/stubbing'
|
6
|
-
end
|
7
|
-
|
8
|
-
Pact::VerificationTask.new(:stubbing_using_allow) do | pact |
|
9
5
|
pact.uri './spec/support/stubbing.json', :pact_helper => './spec/support/stubbing_using_allow.rb'
|
10
6
|
end
|
11
7
|
|
@@ -45,7 +41,6 @@ namespace :pact do
|
|
45
41
|
desc "All the verification tests"
|
46
42
|
task "tests:all" do
|
47
43
|
Rake::Task['pact:verify:stubbing'].execute
|
48
|
-
Rake::Task['pact:verify:stubbing_using_allow'].execute
|
49
44
|
Rake::Task['spec:standalone:pass'].execute
|
50
45
|
Rake::Task['pact:verify'].execute
|
51
46
|
Rake::Task['pact:verify:test_app:pass'].execute
|
@@ -57,6 +52,14 @@ namespace :pact do
|
|
57
52
|
Rake::Task['pact:tests:all'].execute
|
58
53
|
end
|
59
54
|
|
55
|
+
desc "Ensure pact file is written"
|
56
|
+
task 'test:pactfile' do
|
57
|
+
pact_path = './spec/pacts/standalone_consumer-standalone_provider.json'
|
58
|
+
FileUtils.rm_rf pact_path
|
59
|
+
Rake::Task['spec:standalone:pass'].execute
|
60
|
+
fail "Did not find expected pact file at #{pact_path}" unless File.exist?(pact_path)
|
61
|
+
end
|
62
|
+
|
60
63
|
desc 'Runs pact tests against a sample application, testing failure and success.'
|
61
64
|
task 'test:fail' do
|
62
65
|
|
@@ -80,15 +83,16 @@ namespace :pact do
|
|
80
83
|
result = nil
|
81
84
|
Open3.popen3(command) {|stdin, stdout, stderr, wait_thr|
|
82
85
|
result = wait_thr.value
|
83
|
-
ensure_patterns_present(options, stdout, stderr) if options[:with]
|
86
|
+
ensure_patterns_present(command, options, stdout, stderr) if options[:with]
|
84
87
|
}
|
85
88
|
result.success?
|
86
89
|
end
|
87
90
|
|
88
|
-
def ensure_patterns_present options, stdout, stderr
|
91
|
+
def ensure_patterns_present command, options, stdout, stderr
|
92
|
+
require 'term/ansicolor'
|
89
93
|
output = stdout.read + stderr.read
|
90
94
|
options[:with].each do | pattern |
|
91
|
-
raise (::Term::ANSIColor.red("Could not find #{pattern.inspect} in output of #{command}")
|
95
|
+
raise (::Term::ANSIColor.red("Could not find #{pattern.inspect} in output of #{command}") + "\n\n#{output}") unless output =~ pattern
|
92
96
|
end
|
93
97
|
end
|
94
98
|
|