pact 0.1.28 → 1.3.3
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/.gitignore +2 -1
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +374 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +58 -55
- data/README.md +214 -139
- data/Rakefile +4 -28
- data/bin/pact +2 -2
- data/config.ru +3 -0
- data/documentation/README.md +13 -0
- data/documentation/configuration.md +166 -0
- data/documentation/diff_formatter_embedded.png +0 -0
- data/documentation/diff_formatter_list.png +0 -0
- data/documentation/diff_formatter_unix.png +0 -0
- data/example/animal-service/Gemfile +14 -0
- data/example/animal-service/Gemfile.lock +69 -0
- data/example/animal-service/Rakefile +5 -0
- data/example/animal-service/config.ru +3 -0
- data/example/animal-service/db/animal_db.sqlite3 +0 -0
- data/example/animal-service/lib/animal_service/animal_repository.rb +12 -0
- data/example/animal-service/lib/animal_service/api.rb +28 -0
- data/example/animal-service/lib/animal_service/db.rb +5 -0
- data/example/animal-service/spec/service_consumers/pact_helper.rb +11 -0
- data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +26 -0
- data/example/zoo-app/Gemfile +12 -0
- data/example/zoo-app/Gemfile.lock +63 -0
- data/example/zoo-app/Rakefile +5 -0
- data/example/zoo-app/doc/pacts/markdown/README.md +3 -0
- data/example/zoo-app/doc/pacts/markdown/Zoo App - Animal Service.md +75 -0
- data/example/zoo-app/lib/zoo_app/animal_service_client.rb +40 -0
- data/example/zoo-app/lib/zoo_app/models/alligator.rb +15 -0
- data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +67 -0
- data/example/zoo-app/spec/service_providers/animal_service_client_spec.rb +71 -0
- data/example/zoo-app/spec/service_providers/pact_helper.rb +15 -0
- data/example/zoo-app/spec/spec_helper.rb +6 -0
- data/lib/pact/cli.rb +138 -0
- data/lib/pact/configuration.rb +169 -28
- data/lib/pact/consumer/app_manager.rb +10 -29
- data/lib/pact/consumer/configuration/configuration_extensions.rb +15 -0
- data/lib/pact/consumer/configuration/dsl.rb +12 -0
- data/lib/pact/consumer/configuration/mock_service.rb +91 -0
- data/lib/pact/consumer/configuration/service_consumer.rb +51 -0
- data/lib/pact/consumer/configuration/service_provider.rb +40 -0
- data/lib/pact/consumer/configuration.rb +11 -0
- data/lib/pact/consumer/consumer_contract_builder.rb +44 -47
- data/lib/pact/consumer/interaction_builder.rb +41 -0
- data/lib/pact/consumer/interactions_filter.rb +48 -0
- data/lib/pact/consumer/mock_service/app.rb +82 -0
- data/lib/pact/consumer/mock_service/interaction_delete.rb +33 -0
- data/lib/pact/consumer/mock_service/interaction_list.rb +76 -0
- data/lib/pact/consumer/mock_service/interaction_mismatch.rb +73 -0
- data/lib/pact/consumer/mock_service/interaction_post.rb +31 -0
- data/lib/pact/consumer/mock_service/interaction_replay.rb +139 -0
- data/lib/pact/consumer/mock_service/log_get.rb +28 -0
- data/lib/pact/consumer/mock_service/missing_interactions_get.rb +30 -0
- data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +31 -0
- data/lib/pact/consumer/mock_service/pact_post.rb +33 -0
- data/lib/pact/consumer/mock_service/rack_request_helper.rb +51 -0
- data/lib/pact/consumer/mock_service/verification_get.rb +68 -0
- data/lib/pact/consumer/mock_service.rb +1 -339
- data/lib/pact/consumer/mock_service_client.rb +65 -0
- data/lib/pact/consumer/mock_service_interaction_expectation.rb +37 -0
- data/lib/pact/consumer/request.rb +27 -0
- data/lib/pact/consumer/rspec.rb +9 -19
- data/lib/pact/consumer/server.rb +90 -0
- data/lib/pact/consumer/spec_hooks.rb +38 -0
- data/lib/pact/consumer/world.rb +37 -0
- data/lib/pact/consumer.rb +10 -7
- data/lib/pact/consumer_contract/consumer_contract.rb +115 -0
- data/lib/pact/consumer_contract/consumer_contract_writer.rb +84 -0
- data/lib/pact/consumer_contract/file_name.rb +19 -0
- data/lib/pact/consumer_contract/headers.rb +51 -0
- data/lib/pact/consumer_contract/interaction.rb +67 -0
- data/lib/pact/consumer_contract/pact_file.rb +24 -0
- data/lib/pact/consumer_contract/request.rb +73 -0
- data/lib/pact/consumer_contract/service_consumer.rb +28 -0
- data/lib/pact/consumer_contract/service_provider.rb +28 -0
- data/lib/pact/consumer_contract.rb +1 -110
- data/lib/pact/doc/doc_file.rb +40 -0
- data/lib/pact/doc/generate.rb +11 -0
- data/lib/pact/doc/generator.rb +82 -0
- data/lib/pact/doc/interaction_view_model.rb +114 -0
- data/lib/pact/doc/markdown/consumer_contract_renderer.rb +56 -0
- data/lib/pact/doc/markdown/generator.rb +26 -0
- data/lib/pact/doc/markdown/index_renderer.rb +41 -0
- data/lib/pact/doc/markdown/interaction.erb +14 -0
- data/lib/pact/doc/markdown/interaction_renderer.rb +38 -0
- data/lib/pact/doc/sort_interactions.rb +17 -0
- data/lib/pact/matchers/actual_type.rb +16 -0
- data/lib/pact/matchers/base_difference.rb +37 -0
- data/lib/pact/matchers/differ.rb +153 -0
- data/lib/pact/matchers/difference.rb +13 -0
- data/lib/pact/matchers/difference_indicator.rb +26 -0
- data/lib/pact/matchers/embedded_diff_formatter.rb +62 -0
- data/lib/pact/matchers/expected_type.rb +35 -0
- data/lib/pact/matchers/index_not_found.rb +15 -0
- data/lib/pact/matchers/list_diff_formatter.rb +101 -0
- data/lib/pact/matchers/matchers.rb +91 -37
- data/lib/pact/matchers/no_diff_indicator.rb +18 -0
- data/lib/pact/matchers/regexp_difference.rb +13 -0
- data/lib/pact/matchers/type_difference.rb +16 -0
- data/lib/pact/matchers/unexpected_index.rb +11 -0
- data/lib/pact/matchers/unexpected_key.rb +11 -0
- data/lib/pact/matchers/unix_diff_formatter.rb +114 -0
- data/lib/pact/project_root.rb +7 -0
- data/lib/pact/provider/configuration/configuration_extension.rb +58 -0
- data/lib/pact/provider/configuration/dsl.rb +13 -0
- data/lib/pact/provider/configuration/pact_verification.rb +46 -0
- data/lib/pact/provider/configuration/service_provider_config.rb +16 -0
- data/lib/pact/provider/configuration/service_provider_dsl.rb +59 -0
- data/lib/pact/provider/configuration.rb +7 -0
- data/lib/pact/provider/context.rb +0 -0
- data/lib/pact/provider/matchers/messages.rb +45 -0
- data/lib/pact/provider/pact_helper_locator.rb +22 -0
- data/lib/pact/provider/pact_spec_runner.rb +123 -0
- data/lib/pact/provider/pact_verification.rb +17 -0
- data/lib/pact/provider/print_missing_provider_states.rb +30 -0
- data/lib/pact/provider/request.rb +70 -0
- data/lib/pact/provider/rspec/backtrace_formatter.rb +43 -0
- data/lib/pact/provider/rspec/custom_options_file +0 -0
- data/lib/pact/provider/rspec/formatter_rspec_2.rb +65 -0
- data/lib/pact/provider/rspec/formatter_rspec_3.rb +96 -0
- data/lib/pact/provider/rspec/matchers.rb +97 -0
- data/lib/pact/provider/rspec.rb +181 -0
- data/lib/pact/provider/state/provider_state.rb +181 -0
- data/lib/pact/provider/state/provider_state_configured_modules.rb +13 -0
- data/lib/pact/provider/state/provider_state_manager.rb +42 -0
- data/lib/pact/provider/state/provider_state_proxy.rb +39 -0
- data/lib/pact/provider/test_methods.rb +47 -0
- data/lib/pact/provider/verification_report.rb +36 -0
- data/lib/pact/provider/world.rb +23 -0
- data/lib/pact/provider.rb +3 -0
- data/lib/pact/reification.rb +6 -4
- data/lib/pact/rspec.rb +53 -0
- data/lib/pact/shared/active_support_support.rb +51 -0
- data/lib/pact/shared/dsl.rb +76 -0
- data/lib/pact/shared/jruby_support.rb +18 -0
- data/lib/pact/shared/json_differ.rb +15 -0
- data/lib/pact/shared/key_not_found.rb +15 -0
- data/lib/pact/shared/null_expectation.rb +31 -0
- data/lib/pact/shared/request.rb +80 -0
- data/lib/pact/shared/text_differ.rb +14 -0
- data/lib/pact/something_like.rb +49 -0
- data/lib/pact/symbolize_keys.rb +12 -0
- data/lib/pact/tasks/task_helper.rb +36 -0
- data/lib/pact/tasks/verification_task.rb +87 -0
- data/lib/pact/tasks.rb +2 -0
- data/lib/pact/templates/provider_state.erb +14 -0
- data/lib/pact/term.rb +47 -2
- data/lib/pact/version.rb +1 -1
- data/lib/pact.rb +1 -1
- data/lib/tasks/pact.rake +25 -2
- data/pact.gemspec +13 -11
- data/{scratchpad.txt → scratchpad.rb} +18 -2
- data/spec/features/consumption_spec.rb +24 -56
- data/spec/features/production_spec.rb +19 -24
- data/spec/features/{producer_states → provider_states}/zebras.rb +3 -3
- data/spec/integration/consumer_spec.rb +212 -0
- data/spec/integration/pact/consumer_configuration_spec.rb +66 -0
- data/spec/integration/pact/provider_configuration_spec.rb +25 -0
- data/spec/lib/pact/cli_spec.rb +47 -0
- data/spec/lib/pact/configuration_spec.rb +269 -7
- data/spec/lib/pact/consumer/app_manager_spec.rb +3 -3
- data/spec/lib/pact/consumer/configuration_spec.rb +57 -0
- data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +52 -70
- data/spec/lib/pact/consumer/interaction_builder_spec.rb +91 -0
- data/spec/lib/pact/consumer/interactions_spec.rb +64 -0
- data/spec/lib/pact/consumer/mock_service/app_spec.rb +52 -0
- data/spec/lib/pact/consumer/mock_service/interaction_list_spec.rb +78 -0
- data/spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb +70 -0
- data/spec/lib/pact/consumer/mock_service/interaction_replay_spec.rb +12 -0
- data/spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb +88 -0
- data/spec/lib/pact/consumer/mock_service/verification_get_spec.rb +142 -0
- data/spec/lib/pact/consumer/mock_service_client_spec.rb +88 -0
- data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +54 -0
- data/spec/lib/pact/consumer/request_spec.rb +24 -0
- data/spec/lib/pact/consumer/service_consumer_spec.rb +1 -1
- data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +58 -0
- data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +180 -0
- data/spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb +111 -0
- data/spec/lib/pact/consumer_contract/headers_spec.rb +107 -0
- data/spec/lib/pact/consumer_contract/interaction_spec.rb +107 -0
- data/spec/lib/pact/{request_spec.rb → consumer_contract/request_spec.rb} +80 -67
- data/spec/lib/pact/doc/generator_spec.rb +84 -0
- data/spec/lib/pact/doc/interaction_view_model_spec.rb +132 -0
- data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +29 -0
- data/spec/lib/pact/doc/markdown/index_renderer_spec.rb +29 -0
- data/spec/lib/pact/matchers/differ_spec.rb +214 -0
- data/spec/lib/pact/matchers/difference_spec.rb +22 -0
- data/spec/lib/pact/matchers/embedded_diff_formatter_spec.rb +90 -0
- data/spec/lib/pact/matchers/index_not_found_spec.rb +21 -0
- data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +114 -0
- data/spec/lib/pact/matchers/matchers_spec.rb +400 -254
- data/spec/lib/pact/matchers/regexp_difference_spec.rb +20 -0
- data/spec/lib/pact/matchers/type_difference_spec.rb +34 -0
- data/spec/lib/pact/matchers/unexpected_index_spec.rb +20 -0
- data/spec/lib/pact/matchers/unexpected_key_spec.rb +20 -0
- data/spec/lib/pact/matchers/unix_diff_formatter_spec.rb +216 -0
- data/spec/lib/pact/provider/configuration/configuration_extension_spec.rb +30 -0
- data/spec/lib/pact/provider/configuration/pact_verification_spec.rb +43 -0
- data/spec/lib/pact/provider/configuration/service_provider_config_spec.rb +21 -0
- data/spec/lib/pact/provider/configuration/service_provider_dsl_spec.rb +108 -0
- data/spec/lib/pact/provider/configuration_spec.rb +50 -0
- data/spec/lib/pact/provider/matchers/messages_spec.rb +116 -0
- data/spec/lib/pact/provider/pact_helper_locator_spec.rb +54 -0
- data/spec/lib/pact/provider/print_missing_provider_states_spec.rb +19 -0
- data/spec/lib/pact/provider/request_spec.rb +78 -0
- data/spec/lib/pact/provider/rspec/formatter_rspec_2_spec.rb +68 -0
- data/spec/lib/pact/provider/rspec/formatter_rspec_3_spec.rb +72 -0
- data/spec/lib/pact/provider/rspec_spec.rb +55 -0
- data/spec/lib/pact/provider/state/provider_state_manager_spec.rb +89 -0
- data/spec/lib/pact/provider/state/provider_state_proxy_spec.rb +80 -0
- data/spec/lib/pact/provider/state/provider_state_spec.rb +213 -0
- data/spec/lib/pact/provider/world_spec.rb +41 -0
- data/spec/lib/pact/reification_spec.rb +24 -0
- data/spec/lib/pact/shared/dsl_spec.rb +86 -0
- data/spec/lib/pact/shared/json_differ_spec.rb +36 -0
- data/spec/lib/pact/shared/key_not_found_spec.rb +20 -0
- data/spec/lib/pact/shared/request_spec.rb +111 -0
- data/spec/lib/pact/shared/text_differ_spec.rb +54 -0
- data/spec/lib/pact/something_like_spec.rb +21 -0
- data/spec/lib/pact/tasks/task_helper_spec.rb +74 -0
- data/spec/lib/pact/tasks/verification_task_spec.rb +75 -0
- data/spec/lib/pact/term_spec.rb +57 -4
- data/spec/pact_specification/compliance-1.0.0.rb +47 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/standalone/consumer_fail_test.rb +55 -0
- data/spec/standalone/consumer_pass_test.rb +51 -0
- data/spec/support/a_consumer-a_producer.json +2 -4
- data/spec/support/a_consumer-a_provider.json +32 -0
- data/spec/support/active_support_if_configured.rb +6 -0
- data/spec/support/app_for_config_ru.rb +4 -0
- data/spec/support/consumer_contract_template.json +24 -0
- data/spec/support/dsl_spec_support.rb +7 -0
- data/spec/support/factories.rb +82 -0
- data/spec/support/generated_index.md +4 -0
- data/spec/support/generated_markdown.md +55 -0
- data/spec/support/interaction_view_model.json +63 -0
- data/spec/support/interaction_view_model_with_terms.json +50 -0
- data/spec/support/markdown_pact.json +48 -0
- data/spec/support/missing_provider_states_output.txt +25 -0
- data/spec/support/options.json +21 -0
- data/spec/support/options_app.rb +15 -0
- data/spec/support/pact_helper.rb +57 -0
- data/spec/support/shared_examples_for_request.rb +94 -0
- data/spec/support/spec_support.rb +20 -0
- data/spec/support/stubbing.json +22 -0
- data/spec/support/stubbing_using_allow.rb +29 -0
- data/spec/support/term.json +48 -0
- data/spec/support/test_app_fail.json +41 -2
- data/spec/support/test_app_pass.json +19 -2
- data/spec/support/test_app_with_right_content_type_differ.json +23 -0
- data/tasks/pact-test.rake +98 -8
- data/tasks/spec.rake +8 -0
- metadata +393 -95
- data/lib/pact/app.rb +0 -32
- data/lib/pact/consumer/configuration_dsl.rb +0 -71
- data/lib/pact/consumer/dsl.rb +0 -98
- data/lib/pact/consumer/interaction.rb +0 -70
- data/lib/pact/consumer/run_condor.rb +0 -4
- data/lib/pact/consumer/run_mock_contract_service.rb +0 -13
- data/lib/pact/consumer/service_consumer.rb +0 -22
- data/lib/pact/consumer/service_producer.rb +0 -23
- data/lib/pact/json_warning.rb +0 -23
- data/lib/pact/producer/configuration_dsl.rb +0 -62
- data/lib/pact/producer/matchers.rb +0 -22
- data/lib/pact/producer/pact_spec_runner.rb +0 -57
- data/lib/pact/producer/producer_state.rb +0 -81
- data/lib/pact/producer/rspec.rb +0 -127
- data/lib/pact/producer/test_methods.rb +0 -89
- data/lib/pact/producer.rb +0 -1
- data/lib/pact/rake_task.rb +0 -64
- data/lib/pact/request.rb +0 -109
- data/lib/pact/verification_task.rb +0 -57
- data/spec/integration/pact/configuration_spec.rb +0 -65
- data/spec/lib/pact/consumer/dsl_spec.rb +0 -52
- data/spec/lib/pact/consumer/interaction_spec.rb +0 -108
- data/spec/lib/pact/consumer/mock_service_spec.rb +0 -147
- data/spec/lib/pact/consumer_contract_spec.rb +0 -125
- data/spec/lib/pact/producer/configuration_dsl_spec.rb +0 -101
- data/spec/lib/pact/producer/producer_state_spec.rb +0 -103
- data/spec/lib/pact/producer/rspec_spec.rb +0 -48
- data/spec/lib/pact/verification_task_spec.rb +0 -64
- data/spec/support/pact_rake_support.rb +0 -41
|
@@ -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 File.join(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 File.join(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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pact/provider/print_missing_provider_states'
|
|
3
|
+
|
|
4
|
+
module Pact
|
|
5
|
+
module Provider
|
|
6
|
+
describe PrintMissingProviderStates do
|
|
7
|
+
|
|
8
|
+
describe "text" do
|
|
9
|
+
let(:missing_provider_states) { {'Consumer 1' => ['state1','state2'], 'Consumer 2' => ['state3']} }
|
|
10
|
+
let(:expected_output) { File.read("./spec/support/missing_provider_states_output.txt")}
|
|
11
|
+
subject { PrintMissingProviderStates.text missing_provider_states }
|
|
12
|
+
it "returns the text" do
|
|
13
|
+
expect(subject).to include expected_output
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pact/provider/request'
|
|
3
|
+
|
|
4
|
+
describe Pact::Provider::Request::Replayable do
|
|
5
|
+
|
|
6
|
+
let(:path) { '/path?something' }
|
|
7
|
+
let(:body) { {a: 'body'} }
|
|
8
|
+
let(:headers) { {} }
|
|
9
|
+
let(:expected_request) do
|
|
10
|
+
instance_double('Pact::Request::Expected',
|
|
11
|
+
:method => 'post',
|
|
12
|
+
:full_path => path,
|
|
13
|
+
:body => body,
|
|
14
|
+
:headers => headers)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subject { described_class.new(expected_request)}
|
|
18
|
+
|
|
19
|
+
describe "method" do
|
|
20
|
+
it 'returns the method' do
|
|
21
|
+
expect(subject.method).to eq 'post'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
describe "path" do
|
|
25
|
+
it "returns the full path" do
|
|
26
|
+
expect(subject.path).to eq(path)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "body" do
|
|
31
|
+
context "when body is a NullExpectation" do
|
|
32
|
+
let(:body) { Pact::NullExpectation.new }
|
|
33
|
+
it "returns an empty string, not sure if it should do this or return nil???" do
|
|
34
|
+
expect(subject.body).to eq ""
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
context "when body is an empty string" do
|
|
38
|
+
let(:body) { '' }
|
|
39
|
+
it "returns an empty string" do
|
|
40
|
+
expect(subject.body).to eq ""
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
context "when body is a string" do
|
|
44
|
+
let(:body) { 'a string'}
|
|
45
|
+
it "returns the string" do
|
|
46
|
+
expect(subject.body).to eq body
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
context "when body is a Term" do
|
|
50
|
+
let(:body) { Pact::Term.new(generate: 'a', matcher: /a/) }
|
|
51
|
+
it "returns the generated value" do
|
|
52
|
+
expect(subject.body).to eq "a"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
context "when body is not a string" do
|
|
56
|
+
let(:body) { {a: 'body'} }
|
|
57
|
+
it "returns the object as a json string" do
|
|
58
|
+
expect(subject.body).to eq body.to_json
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "headers" do
|
|
64
|
+
context "when headers are expected" do
|
|
65
|
+
let(:headers) { {"Content-Type" => "text/plain", "Content-Length" => "123", "X-Content-Type" => "special", "Access-Control-Request-Method" => "POST"} }
|
|
66
|
+
let(:expected_headers) { {"CONTENT_TYPE" => "text/plain", "CONTENT_LENGTH" => "123", "HTTP_ACCESS_CONTROL_REQUEST_METHOD" => "POST", "HTTP_X_CONTENT_TYPE" => "special"} }
|
|
67
|
+
it "transforms the headers into Rack format" do
|
|
68
|
+
expect(subject.headers).to eq( expected_headers )
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
context "when headers are not specified" do
|
|
72
|
+
let(:headers) { Pact::NullExpectation.new }
|
|
73
|
+
it "returns an empty hash" do
|
|
74
|
+
expect(subject.headers).to eq({})
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pact/provider/rspec/formatter_rspec_2'
|
|
3
|
+
require './spec/support/factories'
|
|
4
|
+
require './spec/support/spec_support'
|
|
5
|
+
|
|
6
|
+
module Pact
|
|
7
|
+
module Provider
|
|
8
|
+
module RSpec
|
|
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
|
|
20
|
+
|
|
21
|
+
let(:interaction) { InteractionFactory.create 'provider_state' => 'a state', 'description' => 'a description'}
|
|
22
|
+
let(:pactfile_uri) { 'pact_file_uri' }
|
|
23
|
+
let(:description) { 'an interaction' }
|
|
24
|
+
let(:metadata) { {pact_interaction: interaction, pactfile_uri: pactfile_uri, pact_interaction_example_description: description}}
|
|
25
|
+
let(:example) { double("Example", metadata: metadata) }
|
|
26
|
+
let(:failed_examples) { [example, example] }
|
|
27
|
+
let(:output) { StringIO.new }
|
|
28
|
+
let(:rerun_command) { "rake pact:verify:at[pact_file_uri] PACT_DESCRIPTION=\"a description\" PACT_PROVIDER_STATE=\"a state\" # an interaction" }
|
|
29
|
+
let(:missing_provider_states) { 'missing_provider_states'}
|
|
30
|
+
|
|
31
|
+
subject { Formatter2.new output }
|
|
32
|
+
|
|
33
|
+
let(:output_result) { Pact::SpecSupport.remove_ansicolor output.string }
|
|
34
|
+
|
|
35
|
+
before do
|
|
36
|
+
allow(PrintMissingProviderStates).to receive(:call)
|
|
37
|
+
allow(subject).to receive(:failed_examples).and_return(failed_examples)
|
|
38
|
+
allow(Pact.provider_world.provider_states).to receive(:missing_provider_states).and_return(missing_provider_states)
|
|
39
|
+
subject.dump_commands_to_rerun_failed_examples
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "#dump_commands_to_rerun_failed_examples" do
|
|
43
|
+
it "prints a list of rerun commands" do
|
|
44
|
+
expect(output_result).to include(rerun_command)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "only prints unique commands" do
|
|
48
|
+
expect(output_result.scan(rerun_command).size).to eq 1
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "prints a message about the logs" do
|
|
52
|
+
expect(output_result).to include("For assistance debugging failures")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "prints missing provider states" do
|
|
56
|
+
expect(PrintMissingProviderStates).to receive(:call).with(missing_provider_states, output)
|
|
57
|
+
subject.dump_commands_to_rerun_failed_examples
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
@@ -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
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'pact/provider/rspec/matchers'
|
|
2
|
+
require 'pact/shared/json_differ'
|
|
3
|
+
require 'pact/matchers/unix_diff_formatter'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
describe "the match_term matcher" do
|
|
7
|
+
|
|
8
|
+
include Pact::RSpec::Matchers
|
|
9
|
+
|
|
10
|
+
let(:diff_formatter) { Pact::Matchers::UnixDiffFormatter }
|
|
11
|
+
|
|
12
|
+
it 'does not match a hash to an array' do
|
|
13
|
+
expect({}).to_not match_term([], with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'does not match an array to a hash' do
|
|
17
|
+
expect([]).to_not match_term({}, with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'matches regular expressions' do
|
|
21
|
+
expect('blah').to match_term(/[a-z]*/, with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'matches pact terms' do
|
|
25
|
+
expect('wootle').to match_term Pact::Term.new(generate:'wootle', matcher:/woot../), with: Pact::JsonDiffer, diff_formatter: diff_formatter
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'matches all elements of arrays' do
|
|
29
|
+
expect(['one', 'two', ['three']]).to match_term [/one/, 'two', [Pact::Term.new(generate:'three', matcher:/thr../)]], with: Pact::JsonDiffer, diff_formatter: diff_formatter
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'matches all values of hashes' do
|
|
33
|
+
expect({1 => 'one', 2 => 2, 3 => 'three'}).to match_term({1 => /one/, 2 => 2, 3 => Pact::Term.new(generate:'three', matcher:/thr../)}, with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'matches all other objects using ==' do
|
|
37
|
+
expect('wootle').to match_term 'wootle', with: Pact::JsonDiffer, diff_formatter: diff_formatter
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Note: because a consumer specifies only the keys it cares about, the pact ignores keys that are returned
|
|
41
|
+
# by the provider, but not are not specified in the pact. This means that any hash will match an
|
|
42
|
+
# expected empty hash, because there is currently no way for a consumer to expect an absence of keys.
|
|
43
|
+
it 'is confused by an empty hash' do
|
|
44
|
+
expect({:hello => 'everyone'}).to match_term({}, with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'should not be confused by an empty array' do
|
|
48
|
+
expect(['blah']).to_not match_term([], with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should allow matches on an array where each item in the array only contains a subset of the actual" do
|
|
52
|
+
expect([{name: 'Fred', age: 12}, {name: 'John', age: 13}]).to match_term([{name: 'Fred'}, {name: 'John'}], with: Pact::JsonDiffer, diff_formatter: diff_formatter)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pact/provider/state/provider_state_manager'
|
|
3
|
+
|
|
4
|
+
module Pact::Provider::State
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
describe ProviderStateManager do
|
|
8
|
+
|
|
9
|
+
PROVIDER_STATE_MESSAGES = []
|
|
10
|
+
|
|
11
|
+
before do
|
|
12
|
+
PROVIDER_STATE_MESSAGES.clear
|
|
13
|
+
Pact.clear_provider_world
|
|
14
|
+
|
|
15
|
+
Pact.set_up do
|
|
16
|
+
PROVIDER_STATE_MESSAGES << :global_base_set_up
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Pact.tear_down do
|
|
20
|
+
PROVIDER_STATE_MESSAGES << :global_base_tear_down
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Pact.provider_states_for "a consumer with provider states" do
|
|
24
|
+
set_up do
|
|
25
|
+
PROVIDER_STATE_MESSAGES << :consumer_base_set_up
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
tear_down do
|
|
29
|
+
PROVIDER_STATE_MESSAGES << :consumer_base_tear_down
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
provider_state "a custom state" do
|
|
33
|
+
set_up do
|
|
34
|
+
PROVIDER_STATE_MESSAGES << :custom_consumer_state_set_up
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
tear_down do
|
|
38
|
+
PROVIDER_STATE_MESSAGES << :custom_consumer_state_tear_down
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
let(:provider_state_manager) { ProviderStateManager.new("a custom state", "a consumer with provider states") }
|
|
46
|
+
|
|
47
|
+
describe "set_up_provider_state" do
|
|
48
|
+
|
|
49
|
+
subject { provider_state_manager.set_up_provider_state }
|
|
50
|
+
|
|
51
|
+
it "sets up the global base state" do
|
|
52
|
+
subject
|
|
53
|
+
expect(PROVIDER_STATE_MESSAGES[0]).to eq :global_base_set_up
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "sets up the consumer base state" do
|
|
57
|
+
subject
|
|
58
|
+
expect(PROVIDER_STATE_MESSAGES[1]).to eq :consumer_base_set_up
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "sets up the consumer custom state" do
|
|
62
|
+
subject
|
|
63
|
+
expect(PROVIDER_STATE_MESSAGES[2]).to eq :custom_consumer_state_set_up
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "tear_down_provider_state" do
|
|
68
|
+
|
|
69
|
+
subject { provider_state_manager.tear_down_provider_state }
|
|
70
|
+
|
|
71
|
+
it "tears down the consumer custom state" do
|
|
72
|
+
subject
|
|
73
|
+
expect(PROVIDER_STATE_MESSAGES[0]).to eq :custom_consumer_state_tear_down
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "tears down the consumer base state" do
|
|
77
|
+
subject
|
|
78
|
+
expect(PROVIDER_STATE_MESSAGES[1]).to eq :consumer_base_tear_down
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "tears down the global base state" do
|
|
82
|
+
subject
|
|
83
|
+
expect(PROVIDER_STATE_MESSAGES[2]).to eq :global_base_tear_down
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pact/provider/state/provider_state_proxy'
|
|
3
|
+
|
|
4
|
+
module Pact
|
|
5
|
+
module Provider::State
|
|
6
|
+
describe ProviderStateProxy do
|
|
7
|
+
|
|
8
|
+
let(:provider_state_proxy) { ProviderStateProxy.new }
|
|
9
|
+
|
|
10
|
+
let(:options) { { :for => 'some consumer'} }
|
|
11
|
+
let(:provider_state) { double("provider_state")}
|
|
12
|
+
|
|
13
|
+
describe "get" do
|
|
14
|
+
let(:name) { "some state" }
|
|
15
|
+
|
|
16
|
+
subject { provider_state_proxy.get name, options }
|
|
17
|
+
|
|
18
|
+
before do
|
|
19
|
+
allow(ProviderStates).to receive(:get).and_return(provider_state)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when the provider state exists" do
|
|
23
|
+
|
|
24
|
+
it "retrieves the provider state from ProviderState" do
|
|
25
|
+
expect(ProviderStates).to receive(:get).with(name, options).and_return(provider_state)
|
|
26
|
+
subject
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "returns the state" do
|
|
30
|
+
expect(subject).to eq provider_state
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "when the state does not exist" do
|
|
36
|
+
|
|
37
|
+
let(:provider_state) { nil }
|
|
38
|
+
let(:expected_missing_provider_states) { {"some consumer" => ["some state"]} }
|
|
39
|
+
|
|
40
|
+
it "raises an error" do
|
|
41
|
+
expect { subject }.to raise_error /Could not find.*some state.*consumer.*/
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "records the provider state as missing" do
|
|
45
|
+
subject rescue nil
|
|
46
|
+
expect(provider_state_proxy.missing_provider_states).to eq expected_missing_provider_states
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "when the same missing provider state is requested" do
|
|
50
|
+
it "ensures the list only contains unique entries" do
|
|
51
|
+
subject rescue nil
|
|
52
|
+
subject rescue nil
|
|
53
|
+
expect(provider_state_proxy.missing_provider_states['some consumer'].size).to eq 1
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "get_base" do
|
|
62
|
+
|
|
63
|
+
before do
|
|
64
|
+
allow(ProviderStates).to receive(:get_base).and_return(provider_state)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
subject { provider_state_proxy.get_base options }
|
|
68
|
+
|
|
69
|
+
it "calls through to ProviderStates" do
|
|
70
|
+
expect(ProviderStates).to receive(:get_base).with(options)
|
|
71
|
+
subject
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "returns the state" do
|
|
75
|
+
expect(subject).to eq provider_state
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|