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.
Files changed (285) hide show
  1. data/.gitignore +2 -1
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +8 -0
  4. data/CHANGELOG.md +374 -0
  5. data/Gemfile +0 -1
  6. data/Gemfile.lock +58 -55
  7. data/README.md +214 -139
  8. data/Rakefile +4 -28
  9. data/bin/pact +2 -2
  10. data/config.ru +3 -0
  11. data/documentation/README.md +13 -0
  12. data/documentation/configuration.md +166 -0
  13. data/documentation/diff_formatter_embedded.png +0 -0
  14. data/documentation/diff_formatter_list.png +0 -0
  15. data/documentation/diff_formatter_unix.png +0 -0
  16. data/example/animal-service/Gemfile +14 -0
  17. data/example/animal-service/Gemfile.lock +69 -0
  18. data/example/animal-service/Rakefile +5 -0
  19. data/example/animal-service/config.ru +3 -0
  20. data/example/animal-service/db/animal_db.sqlite3 +0 -0
  21. data/example/animal-service/lib/animal_service/animal_repository.rb +12 -0
  22. data/example/animal-service/lib/animal_service/api.rb +28 -0
  23. data/example/animal-service/lib/animal_service/db.rb +5 -0
  24. data/example/animal-service/spec/service_consumers/pact_helper.rb +11 -0
  25. data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +26 -0
  26. data/example/zoo-app/Gemfile +12 -0
  27. data/example/zoo-app/Gemfile.lock +63 -0
  28. data/example/zoo-app/Rakefile +5 -0
  29. data/example/zoo-app/doc/pacts/markdown/README.md +3 -0
  30. data/example/zoo-app/doc/pacts/markdown/Zoo App - Animal Service.md +75 -0
  31. data/example/zoo-app/lib/zoo_app/animal_service_client.rb +40 -0
  32. data/example/zoo-app/lib/zoo_app/models/alligator.rb +15 -0
  33. data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +67 -0
  34. data/example/zoo-app/spec/service_providers/animal_service_client_spec.rb +71 -0
  35. data/example/zoo-app/spec/service_providers/pact_helper.rb +15 -0
  36. data/example/zoo-app/spec/spec_helper.rb +6 -0
  37. data/lib/pact/cli.rb +138 -0
  38. data/lib/pact/configuration.rb +169 -28
  39. data/lib/pact/consumer/app_manager.rb +10 -29
  40. data/lib/pact/consumer/configuration/configuration_extensions.rb +15 -0
  41. data/lib/pact/consumer/configuration/dsl.rb +12 -0
  42. data/lib/pact/consumer/configuration/mock_service.rb +91 -0
  43. data/lib/pact/consumer/configuration/service_consumer.rb +51 -0
  44. data/lib/pact/consumer/configuration/service_provider.rb +40 -0
  45. data/lib/pact/consumer/configuration.rb +11 -0
  46. data/lib/pact/consumer/consumer_contract_builder.rb +44 -47
  47. data/lib/pact/consumer/interaction_builder.rb +41 -0
  48. data/lib/pact/consumer/interactions_filter.rb +48 -0
  49. data/lib/pact/consumer/mock_service/app.rb +82 -0
  50. data/lib/pact/consumer/mock_service/interaction_delete.rb +33 -0
  51. data/lib/pact/consumer/mock_service/interaction_list.rb +76 -0
  52. data/lib/pact/consumer/mock_service/interaction_mismatch.rb +73 -0
  53. data/lib/pact/consumer/mock_service/interaction_post.rb +31 -0
  54. data/lib/pact/consumer/mock_service/interaction_replay.rb +139 -0
  55. data/lib/pact/consumer/mock_service/log_get.rb +28 -0
  56. data/lib/pact/consumer/mock_service/missing_interactions_get.rb +30 -0
  57. data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +31 -0
  58. data/lib/pact/consumer/mock_service/pact_post.rb +33 -0
  59. data/lib/pact/consumer/mock_service/rack_request_helper.rb +51 -0
  60. data/lib/pact/consumer/mock_service/verification_get.rb +68 -0
  61. data/lib/pact/consumer/mock_service.rb +1 -339
  62. data/lib/pact/consumer/mock_service_client.rb +65 -0
  63. data/lib/pact/consumer/mock_service_interaction_expectation.rb +37 -0
  64. data/lib/pact/consumer/request.rb +27 -0
  65. data/lib/pact/consumer/rspec.rb +9 -19
  66. data/lib/pact/consumer/server.rb +90 -0
  67. data/lib/pact/consumer/spec_hooks.rb +38 -0
  68. data/lib/pact/consumer/world.rb +37 -0
  69. data/lib/pact/consumer.rb +10 -7
  70. data/lib/pact/consumer_contract/consumer_contract.rb +115 -0
  71. data/lib/pact/consumer_contract/consumer_contract_writer.rb +84 -0
  72. data/lib/pact/consumer_contract/file_name.rb +19 -0
  73. data/lib/pact/consumer_contract/headers.rb +51 -0
  74. data/lib/pact/consumer_contract/interaction.rb +67 -0
  75. data/lib/pact/consumer_contract/pact_file.rb +24 -0
  76. data/lib/pact/consumer_contract/request.rb +73 -0
  77. data/lib/pact/consumer_contract/service_consumer.rb +28 -0
  78. data/lib/pact/consumer_contract/service_provider.rb +28 -0
  79. data/lib/pact/consumer_contract.rb +1 -110
  80. data/lib/pact/doc/doc_file.rb +40 -0
  81. data/lib/pact/doc/generate.rb +11 -0
  82. data/lib/pact/doc/generator.rb +82 -0
  83. data/lib/pact/doc/interaction_view_model.rb +114 -0
  84. data/lib/pact/doc/markdown/consumer_contract_renderer.rb +56 -0
  85. data/lib/pact/doc/markdown/generator.rb +26 -0
  86. data/lib/pact/doc/markdown/index_renderer.rb +41 -0
  87. data/lib/pact/doc/markdown/interaction.erb +14 -0
  88. data/lib/pact/doc/markdown/interaction_renderer.rb +38 -0
  89. data/lib/pact/doc/sort_interactions.rb +17 -0
  90. data/lib/pact/matchers/actual_type.rb +16 -0
  91. data/lib/pact/matchers/base_difference.rb +37 -0
  92. data/lib/pact/matchers/differ.rb +153 -0
  93. data/lib/pact/matchers/difference.rb +13 -0
  94. data/lib/pact/matchers/difference_indicator.rb +26 -0
  95. data/lib/pact/matchers/embedded_diff_formatter.rb +62 -0
  96. data/lib/pact/matchers/expected_type.rb +35 -0
  97. data/lib/pact/matchers/index_not_found.rb +15 -0
  98. data/lib/pact/matchers/list_diff_formatter.rb +101 -0
  99. data/lib/pact/matchers/matchers.rb +91 -37
  100. data/lib/pact/matchers/no_diff_indicator.rb +18 -0
  101. data/lib/pact/matchers/regexp_difference.rb +13 -0
  102. data/lib/pact/matchers/type_difference.rb +16 -0
  103. data/lib/pact/matchers/unexpected_index.rb +11 -0
  104. data/lib/pact/matchers/unexpected_key.rb +11 -0
  105. data/lib/pact/matchers/unix_diff_formatter.rb +114 -0
  106. data/lib/pact/project_root.rb +7 -0
  107. data/lib/pact/provider/configuration/configuration_extension.rb +58 -0
  108. data/lib/pact/provider/configuration/dsl.rb +13 -0
  109. data/lib/pact/provider/configuration/pact_verification.rb +46 -0
  110. data/lib/pact/provider/configuration/service_provider_config.rb +16 -0
  111. data/lib/pact/provider/configuration/service_provider_dsl.rb +59 -0
  112. data/lib/pact/provider/configuration.rb +7 -0
  113. data/lib/pact/provider/context.rb +0 -0
  114. data/lib/pact/provider/matchers/messages.rb +45 -0
  115. data/lib/pact/provider/pact_helper_locator.rb +22 -0
  116. data/lib/pact/provider/pact_spec_runner.rb +123 -0
  117. data/lib/pact/provider/pact_verification.rb +17 -0
  118. data/lib/pact/provider/print_missing_provider_states.rb +30 -0
  119. data/lib/pact/provider/request.rb +70 -0
  120. data/lib/pact/provider/rspec/backtrace_formatter.rb +43 -0
  121. data/lib/pact/provider/rspec/custom_options_file +0 -0
  122. data/lib/pact/provider/rspec/formatter_rspec_2.rb +65 -0
  123. data/lib/pact/provider/rspec/formatter_rspec_3.rb +96 -0
  124. data/lib/pact/provider/rspec/matchers.rb +97 -0
  125. data/lib/pact/provider/rspec.rb +181 -0
  126. data/lib/pact/provider/state/provider_state.rb +181 -0
  127. data/lib/pact/provider/state/provider_state_configured_modules.rb +13 -0
  128. data/lib/pact/provider/state/provider_state_manager.rb +42 -0
  129. data/lib/pact/provider/state/provider_state_proxy.rb +39 -0
  130. data/lib/pact/provider/test_methods.rb +47 -0
  131. data/lib/pact/provider/verification_report.rb +36 -0
  132. data/lib/pact/provider/world.rb +23 -0
  133. data/lib/pact/provider.rb +3 -0
  134. data/lib/pact/reification.rb +6 -4
  135. data/lib/pact/rspec.rb +53 -0
  136. data/lib/pact/shared/active_support_support.rb +51 -0
  137. data/lib/pact/shared/dsl.rb +76 -0
  138. data/lib/pact/shared/jruby_support.rb +18 -0
  139. data/lib/pact/shared/json_differ.rb +15 -0
  140. data/lib/pact/shared/key_not_found.rb +15 -0
  141. data/lib/pact/shared/null_expectation.rb +31 -0
  142. data/lib/pact/shared/request.rb +80 -0
  143. data/lib/pact/shared/text_differ.rb +14 -0
  144. data/lib/pact/something_like.rb +49 -0
  145. data/lib/pact/symbolize_keys.rb +12 -0
  146. data/lib/pact/tasks/task_helper.rb +36 -0
  147. data/lib/pact/tasks/verification_task.rb +87 -0
  148. data/lib/pact/tasks.rb +2 -0
  149. data/lib/pact/templates/provider_state.erb +14 -0
  150. data/lib/pact/term.rb +47 -2
  151. data/lib/pact/version.rb +1 -1
  152. data/lib/pact.rb +1 -1
  153. data/lib/tasks/pact.rake +25 -2
  154. data/pact.gemspec +13 -11
  155. data/{scratchpad.txt → scratchpad.rb} +18 -2
  156. data/spec/features/consumption_spec.rb +24 -56
  157. data/spec/features/production_spec.rb +19 -24
  158. data/spec/features/{producer_states → provider_states}/zebras.rb +3 -3
  159. data/spec/integration/consumer_spec.rb +212 -0
  160. data/spec/integration/pact/consumer_configuration_spec.rb +66 -0
  161. data/spec/integration/pact/provider_configuration_spec.rb +25 -0
  162. data/spec/lib/pact/cli_spec.rb +47 -0
  163. data/spec/lib/pact/configuration_spec.rb +269 -7
  164. data/spec/lib/pact/consumer/app_manager_spec.rb +3 -3
  165. data/spec/lib/pact/consumer/configuration_spec.rb +57 -0
  166. data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +52 -70
  167. data/spec/lib/pact/consumer/interaction_builder_spec.rb +91 -0
  168. data/spec/lib/pact/consumer/interactions_spec.rb +64 -0
  169. data/spec/lib/pact/consumer/mock_service/app_spec.rb +52 -0
  170. data/spec/lib/pact/consumer/mock_service/interaction_list_spec.rb +78 -0
  171. data/spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb +70 -0
  172. data/spec/lib/pact/consumer/mock_service/interaction_replay_spec.rb +12 -0
  173. data/spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb +88 -0
  174. data/spec/lib/pact/consumer/mock_service/verification_get_spec.rb +142 -0
  175. data/spec/lib/pact/consumer/mock_service_client_spec.rb +88 -0
  176. data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +54 -0
  177. data/spec/lib/pact/consumer/request_spec.rb +24 -0
  178. data/spec/lib/pact/consumer/service_consumer_spec.rb +1 -1
  179. data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +58 -0
  180. data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +180 -0
  181. data/spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb +111 -0
  182. data/spec/lib/pact/consumer_contract/headers_spec.rb +107 -0
  183. data/spec/lib/pact/consumer_contract/interaction_spec.rb +107 -0
  184. data/spec/lib/pact/{request_spec.rb → consumer_contract/request_spec.rb} +80 -67
  185. data/spec/lib/pact/doc/generator_spec.rb +84 -0
  186. data/spec/lib/pact/doc/interaction_view_model_spec.rb +132 -0
  187. data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +29 -0
  188. data/spec/lib/pact/doc/markdown/index_renderer_spec.rb +29 -0
  189. data/spec/lib/pact/matchers/differ_spec.rb +214 -0
  190. data/spec/lib/pact/matchers/difference_spec.rb +22 -0
  191. data/spec/lib/pact/matchers/embedded_diff_formatter_spec.rb +90 -0
  192. data/spec/lib/pact/matchers/index_not_found_spec.rb +21 -0
  193. data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +114 -0
  194. data/spec/lib/pact/matchers/matchers_spec.rb +400 -254
  195. data/spec/lib/pact/matchers/regexp_difference_spec.rb +20 -0
  196. data/spec/lib/pact/matchers/type_difference_spec.rb +34 -0
  197. data/spec/lib/pact/matchers/unexpected_index_spec.rb +20 -0
  198. data/spec/lib/pact/matchers/unexpected_key_spec.rb +20 -0
  199. data/spec/lib/pact/matchers/unix_diff_formatter_spec.rb +216 -0
  200. data/spec/lib/pact/provider/configuration/configuration_extension_spec.rb +30 -0
  201. data/spec/lib/pact/provider/configuration/pact_verification_spec.rb +43 -0
  202. data/spec/lib/pact/provider/configuration/service_provider_config_spec.rb +21 -0
  203. data/spec/lib/pact/provider/configuration/service_provider_dsl_spec.rb +108 -0
  204. data/spec/lib/pact/provider/configuration_spec.rb +50 -0
  205. data/spec/lib/pact/provider/matchers/messages_spec.rb +116 -0
  206. data/spec/lib/pact/provider/pact_helper_locator_spec.rb +54 -0
  207. data/spec/lib/pact/provider/print_missing_provider_states_spec.rb +19 -0
  208. data/spec/lib/pact/provider/request_spec.rb +78 -0
  209. data/spec/lib/pact/provider/rspec/formatter_rspec_2_spec.rb +68 -0
  210. data/spec/lib/pact/provider/rspec/formatter_rspec_3_spec.rb +72 -0
  211. data/spec/lib/pact/provider/rspec_spec.rb +55 -0
  212. data/spec/lib/pact/provider/state/provider_state_manager_spec.rb +89 -0
  213. data/spec/lib/pact/provider/state/provider_state_proxy_spec.rb +80 -0
  214. data/spec/lib/pact/provider/state/provider_state_spec.rb +213 -0
  215. data/spec/lib/pact/provider/world_spec.rb +41 -0
  216. data/spec/lib/pact/reification_spec.rb +24 -0
  217. data/spec/lib/pact/shared/dsl_spec.rb +86 -0
  218. data/spec/lib/pact/shared/json_differ_spec.rb +36 -0
  219. data/spec/lib/pact/shared/key_not_found_spec.rb +20 -0
  220. data/spec/lib/pact/shared/request_spec.rb +111 -0
  221. data/spec/lib/pact/shared/text_differ_spec.rb +54 -0
  222. data/spec/lib/pact/something_like_spec.rb +21 -0
  223. data/spec/lib/pact/tasks/task_helper_spec.rb +74 -0
  224. data/spec/lib/pact/tasks/verification_task_spec.rb +75 -0
  225. data/spec/lib/pact/term_spec.rb +57 -4
  226. data/spec/pact_specification/compliance-1.0.0.rb +47 -0
  227. data/spec/spec_helper.rb +17 -0
  228. data/spec/standalone/consumer_fail_test.rb +55 -0
  229. data/spec/standalone/consumer_pass_test.rb +51 -0
  230. data/spec/support/a_consumer-a_producer.json +2 -4
  231. data/spec/support/a_consumer-a_provider.json +32 -0
  232. data/spec/support/active_support_if_configured.rb +6 -0
  233. data/spec/support/app_for_config_ru.rb +4 -0
  234. data/spec/support/consumer_contract_template.json +24 -0
  235. data/spec/support/dsl_spec_support.rb +7 -0
  236. data/spec/support/factories.rb +82 -0
  237. data/spec/support/generated_index.md +4 -0
  238. data/spec/support/generated_markdown.md +55 -0
  239. data/spec/support/interaction_view_model.json +63 -0
  240. data/spec/support/interaction_view_model_with_terms.json +50 -0
  241. data/spec/support/markdown_pact.json +48 -0
  242. data/spec/support/missing_provider_states_output.txt +25 -0
  243. data/spec/support/options.json +21 -0
  244. data/spec/support/options_app.rb +15 -0
  245. data/spec/support/pact_helper.rb +57 -0
  246. data/spec/support/shared_examples_for_request.rb +94 -0
  247. data/spec/support/spec_support.rb +20 -0
  248. data/spec/support/stubbing.json +22 -0
  249. data/spec/support/stubbing_using_allow.rb +29 -0
  250. data/spec/support/term.json +48 -0
  251. data/spec/support/test_app_fail.json +41 -2
  252. data/spec/support/test_app_pass.json +19 -2
  253. data/spec/support/test_app_with_right_content_type_differ.json +23 -0
  254. data/tasks/pact-test.rake +98 -8
  255. data/tasks/spec.rake +8 -0
  256. metadata +393 -95
  257. data/lib/pact/app.rb +0 -32
  258. data/lib/pact/consumer/configuration_dsl.rb +0 -71
  259. data/lib/pact/consumer/dsl.rb +0 -98
  260. data/lib/pact/consumer/interaction.rb +0 -70
  261. data/lib/pact/consumer/run_condor.rb +0 -4
  262. data/lib/pact/consumer/run_mock_contract_service.rb +0 -13
  263. data/lib/pact/consumer/service_consumer.rb +0 -22
  264. data/lib/pact/consumer/service_producer.rb +0 -23
  265. data/lib/pact/json_warning.rb +0 -23
  266. data/lib/pact/producer/configuration_dsl.rb +0 -62
  267. data/lib/pact/producer/matchers.rb +0 -22
  268. data/lib/pact/producer/pact_spec_runner.rb +0 -57
  269. data/lib/pact/producer/producer_state.rb +0 -81
  270. data/lib/pact/producer/rspec.rb +0 -127
  271. data/lib/pact/producer/test_methods.rb +0 -89
  272. data/lib/pact/producer.rb +0 -1
  273. data/lib/pact/rake_task.rb +0 -64
  274. data/lib/pact/request.rb +0 -109
  275. data/lib/pact/verification_task.rb +0 -57
  276. data/spec/integration/pact/configuration_spec.rb +0 -65
  277. data/spec/lib/pact/consumer/dsl_spec.rb +0 -52
  278. data/spec/lib/pact/consumer/interaction_spec.rb +0 -108
  279. data/spec/lib/pact/consumer/mock_service_spec.rb +0 -147
  280. data/spec/lib/pact/consumer_contract_spec.rb +0 -125
  281. data/spec/lib/pact/producer/configuration_dsl_spec.rb +0 -101
  282. data/spec/lib/pact/producer/producer_state_spec.rb +0 -103
  283. data/spec/lib/pact/producer/rspec_spec.rb +0 -48
  284. data/spec/lib/pact/verification_task_spec.rb +0 -64
  285. 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