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,214 @@
1
+ # encoding: utf-8
2
+
3
+ # Ripped from spec/rspec/expectations/differ_spec.rb in rspec-expectations 2.14.3
4
+
5
+ require 'spec_helper'
6
+ require 'ostruct'
7
+
8
+ module Pact
9
+ module Matchers
10
+ describe Differ do
11
+ context "without --color" do
12
+
13
+ let(:differ) { Pact::Matchers::Differ.new }
14
+
15
+ # color disabled context
16
+
17
+ describe '#diff_as_string' do
18
+ subject { differ.diff_as_string(@expected, @actual) }
19
+ it "outputs unified diff of two strings" do
20
+ @expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n"
21
+ @actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n"
22
+ expect(subject).to eql(<<-'EOD')
23
+
24
+
25
+ @@ -1,6 +1,6 @@
26
+ foo
27
+ -zap
28
+ bar
29
+ +zap
30
+ this
31
+ is
32
+ soo
33
+ @@ -9,6 +9,5 @@
34
+ equal
35
+ insert
36
+ a
37
+ -another
38
+ line
39
+ EOD
40
+
41
+ end
42
+ if RUBY_VERSION.to_f > 1.9
43
+ it 'copes with encoded strings', :pending => (Diff::LCS::VERSION < '1.2.2') do
44
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
45
+ @actual="Tu avec carte {count} item has".encode('UTF-16LE')
46
+ expect(subject).to eql(<<-EOD.encode('UTF-16LE'))
47
+
48
+ @@ -1,2 +1,2 @@
49
+ -Tu avec carte {count} item has
50
+ +Tu avec carté {count} itém has
51
+ EOD
52
+ end
53
+ it 'copes with encoded strings', :pending => (Diff::LCS::VERSION >= '1.2.2') do
54
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
55
+ @actual="Tu avec carte {count} item has".encode('UTF-16LE')
56
+ expect(subject).to eql 'Could not produce a diff because of the encoding of the string (UTF-16LE)'
57
+ end
58
+ it 'ouputs a message when encountering differently encoded strings' do
59
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
60
+ @actual="Tu avec carte {count} item has"
61
+ expect(subject).to eql 'Could not produce a diff because the encoding of the actual string (UTF-8) differs from the encoding of the expected string (UTF-16LE)'
62
+ end
63
+ end
64
+ end
65
+
66
+ describe '#diff_as_object' do
67
+ it "outputs unified diff message of two objects" do
68
+ animal_class = Class.new do
69
+ def initialize(name, species)
70
+ @name, @species = name, species
71
+ end
72
+
73
+ def inspect
74
+ <<-EOA
75
+ <Animal
76
+ name=#{@name},
77
+ species=#{@species}
78
+ >
79
+ EOA
80
+ end
81
+ end
82
+
83
+ expected = animal_class.new "bob", "giraffe"
84
+ actual = animal_class.new "bob", "tortoise"
85
+
86
+ expected_diff = <<'EOD'
87
+
88
+ @@ -1,5 +1,5 @@
89
+ <Animal
90
+ name=bob,
91
+ - species=tortoise
92
+ + species=giraffe
93
+ >
94
+ EOD
95
+
96
+ diff = differ.diff_as_object(expected,actual)
97
+ expect(diff).to eq expected_diff
98
+ end
99
+
100
+ it "outputs unified diff message of two arrays" do
101
+ expected = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'charlie', :width, 'quite wide' ]
102
+ actual = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'tango' , :width, 'very wide' ]
103
+
104
+ expected_diff = <<'EOD'
105
+
106
+
107
+ @@ -5,7 +5,7 @@
108
+ :metasyntactic,
109
+ "variable",
110
+ :delta,
111
+ - "tango",
112
+ + "charlie",
113
+ :width,
114
+ - "very wide"]
115
+ + "quite wide"]
116
+ EOD
117
+
118
+ diff = differ.diff_as_object(expected,actual)
119
+ expect(diff).to eq expected_diff
120
+ end
121
+
122
+ it "outputs unified diff message of two hashes" do
123
+ expected = { :foo => 'bar', :baz => 'quux', :metasyntactic => 'variable', :delta => 'charlie', :width =>'quite wide' }
124
+ actual = { :foo => 'bar', :metasyntactic => 'variable', :delta => 'charlotte', :width =>'quite wide' }
125
+
126
+ expected_diff = <<'EOD'
127
+
128
+ @@ -1,4 +1,5 @@
129
+ -:delta => "charlotte",
130
+ +:baz => "quux",
131
+ +:delta => "charlie",
132
+ :foo => "bar",
133
+ :metasyntactic => "variable",
134
+ :width => "quite wide"
135
+ EOD
136
+
137
+ diff = differ.diff_as_object(expected,actual)
138
+ expect(diff).to eq expected_diff
139
+ end
140
+
141
+ it 'outputs unified diff messaoge of two hashes with differing encoding' do
142
+ expected_diff = %Q{
143
+ @@ -1,2 +1,2 @@
144
+ -"a" => "a"
145
+ #{ (RUBY_VERSION.to_f > 1.8) ? %Q{+"ö" => "ö"} : '+"\303\266" => "\303\266"' }
146
+ }
147
+
148
+ diff = differ.diff_as_object({'ö' => 'ö'}, {'a' => 'a'})
149
+ expect(diff).to eq expected_diff
150
+ end
151
+
152
+ it "outputs unified diff message of two hashes with object keys" do
153
+ expected_diff = %Q{
154
+ @@ -1,2 +1,2 @@
155
+ -["a", "c"] => "b"
156
+ +["d", "c"] => "b"
157
+ }
158
+
159
+ diff = differ.diff_as_object({ ['d','c'] => 'b'}, { ['a','c'] => 'b' })
160
+ expect(diff).to eq expected_diff
161
+ end
162
+
163
+ it "outputs unified diff of single line strings" do
164
+ expected = "this is one string"
165
+ actual = "this is another string"
166
+
167
+ expected_diff = <<'EOD'
168
+
169
+ @@ -1,2 +1,2 @@
170
+ -"this is another string"
171
+ +"this is one string"
172
+ EOD
173
+
174
+ diff = differ.diff_as_object(expected,actual)
175
+ expect(diff).to eq expected_diff
176
+ end
177
+
178
+ it "outputs unified diff of multi line strings" do
179
+ expected = "this is:\n one string"
180
+ actual = "this is:\n another string"
181
+
182
+ expected_diff = <<'EOD'
183
+
184
+ @@ -1,3 +1,3 @@
185
+ this is:
186
+ - another string
187
+ + one string
188
+ EOD
189
+
190
+ diff = differ.diff_as_object(expected,actual)
191
+ expect(diff).to eq expected_diff
192
+ end
193
+ end
194
+ end
195
+
196
+ context "with --color" do
197
+
198
+ let(:differ) { Pact::Matchers::Differ.new(true) }
199
+
200
+ it "outputs colored diffs" do
201
+ expected = "foo bar baz"
202
+ actual = "foo bang baz"
203
+ expected_diff = "\n\e[34m@@ -1,2 +1,2 @@\n\e[0m\e[31m-foo bang baz\n\e[0m\e[32m+foo bar baz\n\e[0m"
204
+
205
+
206
+ diff = differ.diff_as_string(expected,actual)
207
+ expect(diff).to eq expected_diff
208
+ end
209
+ end
210
+
211
+ end
212
+ end
213
+ end
214
+
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'pact/matchers/difference'
3
+
4
+ module Pact
5
+ module Matchers
6
+ describe Difference do
7
+
8
+ describe "#as_json" do
9
+
10
+ context "when something other than a regexp is expected" do
11
+
12
+ subject { Difference.new("apple", 'pear').as_json }
13
+
14
+ it "indicates that the actual was intended 'to eq'" do
15
+ expect(subject).to eq({:EXPECTED => "apple", :ACTUAL => "pear"})
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+ require 'pact/matchers/embedded_diff_formatter'
3
+ require 'pact/matchers/type_difference'
4
+ require 'pact/matchers/expected_type'
5
+ require 'pact/matchers/actual_type'
6
+
7
+ module Pact
8
+ module Matchers
9
+ describe EmbeddedDiffFormatter do
10
+
11
+ let(:diff) do
12
+ {
13
+ :something => TypeDifference.new(ExpectedType.new("Fred"), ActualType.new(1))
14
+ }
15
+ end
16
+
17
+ subject { EmbeddedDiffFormatter.call(diff, options) }
18
+
19
+ let(:options) { { colour: colour }}
20
+ let(:expected_coloured) { '"' + ::Term::ANSIColor.red("expected_type") + '":'}
21
+ let(:actual_coloured) { '"' + ::Term::ANSIColor.green("actual_type") + '":'}
22
+
23
+ describe ".call" do
24
+
25
+ let(:colour) { false }
26
+
27
+ context "when color_enabled is true" do
28
+
29
+ let(:colour) { true }
30
+
31
+ it "returns nicely formatted json" do
32
+ expect(subject.split("\n").size).to eq 6
33
+ end
34
+
35
+ it "returns a string displaying the diff in colour" do
36
+ expect(subject).to include expected_coloured
37
+ expect(subject).to include actual_coloured
38
+ end
39
+ end
40
+
41
+ context "when color_enabled is false" do
42
+
43
+ let(:colour) { false }
44
+
45
+ it "returns nicely formatted json" do
46
+ expect(subject.split("\n").size).to eq 6
47
+ end
48
+
49
+ it "returns a string displaying the diff without colour" do
50
+ expect(subject).to_not include expected_coloured
51
+ expect(subject).to_not include actual_coloured
52
+ end
53
+ end
54
+
55
+ context "with a Pact::Term" do
56
+ let(:diff) { {thing: Difference.new(Pact::Term.new(generate: "Joe", matcher: /Jo/), "Mary")} }
57
+
58
+ xit "displays the matcher from the Pact::Term" do
59
+ expect(subject).to_not include("Pact::Term")
60
+ expect(subject).to include("/Jo/")
61
+ end
62
+
63
+ end
64
+
65
+ context "when no options are specified" do
66
+ subject { EmbeddedDiffFormatter.call(diff) }
67
+
68
+ context "when Pact.configuration.color_enabled is true" do
69
+ it "returns a string displaying the diff in colour" do
70
+ expect(Pact.configuration).to receive(:color_enabled).and_return(true)
71
+ expect(subject).to include expected_coloured
72
+ expect(subject).to include actual_coloured
73
+ end
74
+ end
75
+
76
+ context "when Pact.configuration.color_enabled is false" do
77
+ it "returns a string displaying the diff without colour" do
78
+ expect(Pact.configuration).to receive(:color_enabled).and_return(false)
79
+ expect(subject).to_not include expected_coloured
80
+ expect(subject).to_not include actual_coloured
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'pact/matchers/index_not_found'
3
+
4
+ module Pact
5
+ describe IndexNotFound do
6
+
7
+ describe "#as_json" do
8
+ it "returns a string representation of the object" do
9
+ expect(subject.as_json).to eq subject.to_s
10
+ end
11
+ end
12
+
13
+ describe "#to_json" do
14
+ it "serialises the object to JSON" do
15
+ expect(subject.to_json).to eq "\"#{subject.to_s}\""
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+ require 'pact/matchers/list_diff_formatter'
3
+ require 'pact/matchers/matchers'
4
+
5
+ module Pact
6
+ module Matchers
7
+ describe ListDiffFormatter do
8
+
9
+ describe ".call" do
10
+ subject{ ListDiffFormatter.call(diff, {}) }
11
+
12
+ context "when using class based matching" do
13
+ let(:diff) { {root: TypeDifference.new(ExpectedType.new("Fred"), ActualType.new(1)) } }
14
+ let(:expected_output) { <<-EOS
15
+ \tAt:
16
+ \t\t[:root]
17
+ \tExpected type:
18
+ \t\tString
19
+ \tActual type:
20
+ \t\tFixnum
21
+ EOS
22
+ }
23
+
24
+ it "shows the expected and actual classes" do
25
+ expect(subject + "\n").to eq(expected_output)
26
+ end
27
+
28
+ end
29
+
30
+ context "when there is an unmatched regexp" do
31
+ let(:diff) { {root: RegexpDifference.new(/fr.*ed/, "mary") } }
32
+ let(:expected_output) { <<-EOS
33
+ \tAt:
34
+ \t\t[:root]
35
+ \tExpected to match:
36
+ \t\t/fr.*ed/
37
+ \tActual:
38
+ \t\t"mary"
39
+ EOS
40
+ }
41
+ it "shows the expected regexp" do
42
+ expect(subject + "\n").to eq(expected_output)
43
+ end
44
+ end
45
+
46
+ context "when there is a mismatched value" do
47
+ let(:diff) { {root: {"blah" => { 1 => Difference.new("alphabet", "woozle")}}} }
48
+ let(:expected_output) { ""}
49
+
50
+ it "includes the expected value" do
51
+ expect(subject).to match(/Expected:.*"alphabet"/m)
52
+ end
53
+ it "includes the actual value" do
54
+ expect(subject).to match(/Actual:.*"woozle"/m)
55
+ end
56
+
57
+ it "includes the path" do
58
+ expect(subject).to include('[:root]["blah"][1]')
59
+ end
60
+ end
61
+
62
+ context "when there is a missing key" do
63
+ let(:expected_hash) { {"abc" => {"def" => [1,2]}}}
64
+ let(:diff) { {root: {"blah" => { 1 => Difference.new(expected_hash, Pact::KeyNotFound.new )}}} }
65
+ let(:expected_output) { ""}
66
+
67
+ it "includes the expected value" do
68
+ expect(subject).to match(/Missing key with value\:.*\{/m)
69
+ end
70
+
71
+ it "includes the path" do
72
+ expect(subject).to include('[:root]["blah"][1]')
73
+ end
74
+ end
75
+
76
+ context "when there is a missing index" do
77
+ let(:diff) { [NoDiffIndicator.new, Difference.new(1, IndexNotFound.new )]}
78
+ it "includes the expected value" do
79
+ expect(subject).to match(/Missing.*1/m)
80
+ end
81
+
82
+ it "includes the path" do
83
+ expect(subject).to include('[1]')
84
+ end
85
+ end
86
+
87
+ context "when there is an unexpected index" do
88
+ let(:diff) { [NoDiffIndicator.new, Difference.new(UnexpectedIndex.new, 2), Difference.new(UnexpectedIndex.new, "b")]}
89
+ it "includes the unexpected value" do
90
+ expect(subject).to include("Array contained unexpected item:")
91
+ end
92
+
93
+ it "includes the path" do
94
+ expect(subject).to include('[1]')
95
+ expect(subject).to include('[2]')
96
+ end
97
+ end
98
+
99
+ context "when there is an unexpected key" do
100
+ let(:diff) { {"blah" => Difference.new(UnexpectedKey.new, "b")}}
101
+ it "includes the unexpected key" do
102
+ expect(subject).to include("Hash contained unexpected key with value:")
103
+ end
104
+
105
+ it "includes the path" do
106
+ expect(subject).to include('["blah"]')
107
+ end
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+ end
114
+ end