pact 1.0.9 → 1.0.10

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 (86) hide show
  1. data/CHANGELOG.md +20 -0
  2. data/Gemfile.lock +3 -3
  3. data/example/animal-service/Gemfile +14 -0
  4. data/example/animal-service/Gemfile.lock +67 -0
  5. data/example/animal-service/Rakefile +3 -0
  6. data/example/animal-service/spec/service_consumers/pact_helper.rb +24 -0
  7. data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +9 -0
  8. data/example/zoo-app/Gemfile.lock +2 -15
  9. data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +21 -6
  10. data/example/zoo-app/spec/service_providers/animal_service_spec.rb +1 -1
  11. data/lib/pact/consumer.rb +10 -11
  12. data/lib/pact/consumer/app_manager.rb +1 -0
  13. data/lib/pact/consumer/configuration.rb +179 -0
  14. data/lib/pact/consumer/interaction_builder.rb +1 -2
  15. data/lib/pact/consumer/mock_service.rb +1 -370
  16. data/lib/pact/consumer/mock_service/app.rb +70 -0
  17. data/lib/pact/consumer/mock_service/interaction_delete.rb +28 -0
  18. data/lib/pact/consumer/mock_service/interaction_list.rb +57 -0
  19. data/lib/pact/consumer/mock_service/interaction_post.rb +25 -0
  20. data/lib/pact/consumer/mock_service/interaction_replay.rb +126 -0
  21. data/lib/pact/consumer/mock_service/missing_interactions_get.rb +26 -0
  22. data/lib/pact/consumer/mock_service/rack_request_helper.rb +51 -0
  23. data/lib/pact/consumer/mock_service/startup_poll.rb +22 -0
  24. data/lib/pact/consumer/mock_service/verification_get.rb +35 -0
  25. data/lib/pact/consumer/mock_service_client.rb +3 -1
  26. data/lib/pact/consumer/mock_service_interaction_expectation.rb +33 -0
  27. data/lib/pact/consumer/request.rb +27 -0
  28. data/lib/pact/consumer/rspec.rb +1 -4
  29. data/lib/pact/consumer_contract/consumer_contract.rb +11 -8
  30. data/lib/pact/consumer_contract/interaction.rb +9 -22
  31. data/lib/pact/consumer_contract/request.rb +68 -0
  32. data/lib/pact/consumer_contract/service_consumer.rb +6 -2
  33. data/lib/pact/consumer_contract/service_provider.rb +6 -2
  34. data/lib/pact/matchers/index_not_found.rb +20 -0
  35. data/lib/pact/matchers/matchers.rb +14 -28
  36. data/lib/pact/matchers/unexpected_index.rb +17 -0
  37. data/lib/pact/matchers/unexpected_key.rb +17 -0
  38. data/lib/pact/provider.rb +1 -1
  39. data/lib/pact/provider/configuration.rb +129 -0
  40. data/lib/pact/provider/request.rb +59 -0
  41. data/lib/pact/provider/rspec.rb +4 -5
  42. data/lib/pact/provider/test_methods.rb +14 -52
  43. data/lib/pact/shared/dsl.rb +20 -0
  44. data/lib/pact/shared/key_not_found.rb +24 -0
  45. data/lib/pact/shared/null_expectation.rb +31 -0
  46. data/lib/pact/shared/request.rb +68 -0
  47. data/lib/pact/something_like.rb +7 -1
  48. data/lib/pact/symbolize_keys.rb +12 -0
  49. data/lib/pact/tasks.rb +1 -1
  50. data/lib/pact/tasks/task_helper.rb +23 -0
  51. data/lib/pact/{verification_task.rb → tasks/verification_task.rb} +4 -4
  52. data/lib/pact/version.rb +1 -1
  53. data/lib/tasks/pact.rake +5 -4
  54. data/pact.gemspec +1 -1
  55. data/spec/features/consumption_spec.rb +1 -73
  56. data/spec/features/production_spec.rb +3 -0
  57. data/spec/integration/consumer_spec.rb +170 -0
  58. data/spec/integration/pact/consumer_configuration_spec.rb +1 -1
  59. data/spec/lib/pact/consumer/{dsl_spec.rb → configuration_spec.rb} +10 -9
  60. data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +2 -2
  61. data/spec/lib/pact/consumer/interaction_builder_spec.rb +1 -1
  62. data/spec/lib/pact/consumer/mock_service/interaction_list_spec.rb +66 -0
  63. data/spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb +82 -0
  64. data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +54 -0
  65. data/spec/lib/pact/consumer/request_spec.rb +24 -0
  66. data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +1 -1
  67. data/spec/lib/pact/consumer_contract/interaction_spec.rb +0 -34
  68. data/spec/lib/pact/{request_spec.rb → consumer_contract/request_spec.rb} +45 -121
  69. data/spec/lib/pact/matchers/matchers_spec.rb +29 -13
  70. data/spec/lib/pact/provider/configuration_spec.rb +163 -0
  71. data/spec/lib/pact/provider/request_spec.rb +78 -0
  72. data/spec/lib/pact/provider/test_methods_spec.rb +0 -30
  73. data/spec/lib/pact/verification_task_spec.rb +1 -1
  74. data/spec/spec_helper.rb +3 -0
  75. data/spec/support/factories.rb +5 -1
  76. data/spec/support/pact_helper.rb +6 -0
  77. data/spec/support/shared_examples_for_request.rb +83 -0
  78. data/spec/support/test_app_fail.json +3 -0
  79. data/spec/support/test_app_pass.json +18 -1
  80. metadata +68 -31
  81. data/lib/pact/consumer/dsl.rb +0 -157
  82. data/lib/pact/pact_task_helper.rb +0 -21
  83. data/lib/pact/provider/dsl.rb +0 -115
  84. data/lib/pact/request.rb +0 -167
  85. data/spec/lib/pact/consumer/mock_service_spec.rb +0 -143
  86. data/spec/lib/pact/provider/dsl_spec.rb +0 -179
@@ -0,0 +1,83 @@
1
+ shared_examples "a request" do
2
+
3
+ describe 'matching' do
4
+ let(:expected) do
5
+ Pact::Request::Expected.from_hash(
6
+ {'method' => 'get', 'path' => 'path', 'query' => /b/}
7
+ )
8
+ end
9
+
10
+ let(:actual) do
11
+ Pact::Consumer::Request::Actual.from_hash({'method' => 'get', 'path' => 'path', 'query' => 'blah', 'headers' => {}, 'body' => ''})
12
+ end
13
+
14
+ it "should match" do
15
+ expect(expected.difference(actual)).to eq({})
16
+ end
17
+ end
18
+
19
+ describe 'full_path' do
20
+ context "with empty path" do
21
+ subject { described_class.from_hash({:path => '', :method => 'get', :query => '', :headers => {}}) }
22
+ it "returns the full path"do
23
+ expect(subject.full_path).to eq "/"
24
+ end
25
+ end
26
+ context "with a path" do
27
+ subject { described_class.from_hash({:path => '/path', :method => 'get', :query => '', :headers => {}}) }
28
+ it "returns the full path"do
29
+ expect(subject.full_path).to eq "/path"
30
+ end
31
+ end
32
+ context "with a path and query" do
33
+ subject { described_class.from_hash({:path => '/path', :method => 'get', :query => "something", :headers => {}}) }
34
+ it "returns the full path"do
35
+ expect(subject.full_path).to eq "/path?something"
36
+ end
37
+ end
38
+ context "with a path and a query that is a Term" do
39
+ subject { described_class.from_hash({:path => '/path', :method => 'get', :headers => {}, :query => Pact::Term.new(generate: 'a', matcher: /a/)}) }
40
+ it "returns the full path with reified path" do
41
+ expect(subject.full_path).to eq "/path?a"
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "building from a hash" do
47
+
48
+ let(:raw_request) do
49
+ {
50
+ 'method' => 'get',
51
+ 'path' => '/mallory',
52
+ 'query' => 'query',
53
+ 'headers' => {
54
+ 'Content-Type' => 'application/json'
55
+ },
56
+ 'body' => 'hello mallory'
57
+ }
58
+ end
59
+
60
+ subject { described_class.from_hash(raw_request) }
61
+
62
+ its(:method) { should == 'get' }
63
+ its(:path) { should == '/mallory' }
64
+ its(:body) { should == 'hello mallory' }
65
+ its(:query) { should eq 'query'}
66
+
67
+ it "blows up if method is absent" do
68
+ raw_request.delete 'method'
69
+ expect { described_class.from_hash(raw_request) }.to raise_error
70
+ end
71
+
72
+ it "blows up if path is absent" do
73
+ raw_request.delete 'path'
74
+ expect { described_class.from_hash(raw_request) }.to raise_error
75
+ end
76
+
77
+ it "does not blow up if body is missing" do
78
+ raw_request.delete 'body'
79
+ expect { described_class.from_hash(raw_request) }.to_not raise_error
80
+ end
81
+
82
+ end
83
+ end
@@ -2,6 +2,9 @@
2
2
  "consumer": {
3
3
  "name": "an unknown consumer"
4
4
  },
5
+ "provider": {
6
+ "name": "an unknown provider"
7
+ },
5
8
  "interactions": [
6
9
  {
7
10
  "description": "A test request",
@@ -2,6 +2,9 @@
2
2
  "consumer": {
3
3
  "name": "some-test-consumer"
4
4
  },
5
+ "provider": {
6
+ "name": "an unknown provider"
7
+ },
5
8
  "interactions": [
6
9
  {
7
10
  "description": "A test request",
@@ -16,6 +19,20 @@
16
19
  "body": {"message" : "sunny"}
17
20
  },
18
21
  "provider_state": "the weather is sunny"
19
- }
22
+ },
23
+ {
24
+ "description": "A test request for text",
25
+ "request": {
26
+ "method": "get",
27
+ "path": "/sometext",
28
+ "query": "",
29
+ "body" : "some request text"
30
+ },
31
+ "response": {
32
+ "status": 200,
33
+ "headers" : {"Content-type": "text/plain"},
34
+ "body": "some text"
35
+ }
36
+ }
20
37
  ]
21
38
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-09-18 00:00:00.000000000 Z
16
+ date: 2013-10-07 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: randexp
@@ -31,22 +31,6 @@ dependencies:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.1.7
34
- - !ruby/object:Gem::Dependency
35
- name: hashie
36
- requirement: !ruby/object:Gem::Requirement
37
- none: false
38
- requirements:
39
- - - ~>
40
- - !ruby/object:Gem::Version
41
- version: '2.0'
42
- type: :runtime
43
- prerelease: false
44
- version_requirements: !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
47
- - - ~>
48
- - !ruby/object:Gem::Version
49
- version: '2.0'
50
34
  - !ruby/object:Gem::Dependency
51
35
  name: rspec
52
36
  requirement: !ruby/object:Gem::Requirement
@@ -239,6 +223,22 @@ dependencies:
239
223
  - - ~>
240
224
  - !ruby/object:Gem::Version
241
225
  version: '0.4'
226
+ - !ruby/object:Gem::Dependency
227
+ name: hashie
228
+ requirement: !ruby/object:Gem::Requirement
229
+ none: false
230
+ requirements:
231
+ - - ~>
232
+ - !ruby/object:Gem::Version
233
+ version: '2.0'
234
+ type: :development
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ none: false
238
+ requirements:
239
+ - - ~>
240
+ - !ruby/object:Gem::Version
241
+ version: '2.0'
242
242
  description: Define a pact between service consumers and providers
243
243
  email:
244
244
  - james.fraser@alumni.swinburne.edu
@@ -260,6 +260,11 @@ files:
260
260
  - README.md
261
261
  - Rakefile
262
262
  - bin/pact
263
+ - example/animal-service/Gemfile
264
+ - example/animal-service/Gemfile.lock
265
+ - example/animal-service/Rakefile
266
+ - example/animal-service/spec/service_consumers/pact_helper.rb
267
+ - example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb
263
268
  - example/zoo-app/Gemfile
264
269
  - example/zoo-app/Gemfile.lock
265
270
  - example/zoo-app/lib/zoo_app/animal_service_client.rb
@@ -273,42 +278,62 @@ files:
273
278
  - lib/pact/configuration.rb
274
279
  - lib/pact/consumer.rb
275
280
  - lib/pact/consumer/app_manager.rb
281
+ - lib/pact/consumer/configuration.rb
276
282
  - lib/pact/consumer/consumer_contract_builder.rb
277
283
  - lib/pact/consumer/consumer_contract_builders.rb
278
- - lib/pact/consumer/dsl.rb
279
284
  - lib/pact/consumer/interaction_builder.rb
280
285
  - lib/pact/consumer/interactions_filter.rb
281
286
  - lib/pact/consumer/mock_service.rb
287
+ - lib/pact/consumer/mock_service/app.rb
288
+ - lib/pact/consumer/mock_service/interaction_delete.rb
289
+ - lib/pact/consumer/mock_service/interaction_list.rb
290
+ - lib/pact/consumer/mock_service/interaction_post.rb
291
+ - lib/pact/consumer/mock_service/interaction_replay.rb
292
+ - lib/pact/consumer/mock_service/missing_interactions_get.rb
293
+ - lib/pact/consumer/mock_service/rack_request_helper.rb
294
+ - lib/pact/consumer/mock_service/startup_poll.rb
295
+ - lib/pact/consumer/mock_service/verification_get.rb
282
296
  - lib/pact/consumer/mock_service_client.rb
297
+ - lib/pact/consumer/mock_service_interaction_expectation.rb
298
+ - lib/pact/consumer/request.rb
283
299
  - lib/pact/consumer/rspec.rb
284
300
  - lib/pact/consumer/server.rb
285
301
  - lib/pact/consumer_contract.rb
286
302
  - lib/pact/consumer_contract/consumer_contract.rb
287
303
  - lib/pact/consumer_contract/interaction.rb
304
+ - lib/pact/consumer_contract/request.rb
288
305
  - lib/pact/consumer_contract/service_consumer.rb
289
306
  - lib/pact/consumer_contract/service_provider.rb
290
307
  - lib/pact/json_warning.rb
291
308
  - lib/pact/logging.rb
292
309
  - lib/pact/matchers.rb
310
+ - lib/pact/matchers/index_not_found.rb
293
311
  - lib/pact/matchers/matchers.rb
294
- - lib/pact/pact_task_helper.rb
312
+ - lib/pact/matchers/unexpected_index.rb
313
+ - lib/pact/matchers/unexpected_key.rb
295
314
  - lib/pact/provider.rb
296
315
  - lib/pact/provider/client_project_pact_helper.rb
297
- - lib/pact/provider/dsl.rb
316
+ - lib/pact/provider/configuration.rb
298
317
  - lib/pact/provider/matchers.rb
299
318
  - lib/pact/provider/pact_helper_locator.rb
300
319
  - lib/pact/provider/pact_spec_runner.rb
301
320
  - lib/pact/provider/pact_verification.rb
302
321
  - lib/pact/provider/provider_state.rb
322
+ - lib/pact/provider/request.rb
303
323
  - lib/pact/provider/rspec.rb
304
324
  - lib/pact/provider/test_methods.rb
305
325
  - lib/pact/provider/verification_report.rb
306
326
  - lib/pact/reification.rb
307
- - lib/pact/request.rb
327
+ - lib/pact/shared/dsl.rb
328
+ - lib/pact/shared/key_not_found.rb
329
+ - lib/pact/shared/null_expectation.rb
330
+ - lib/pact/shared/request.rb
308
331
  - lib/pact/something_like.rb
332
+ - lib/pact/symbolize_keys.rb
309
333
  - lib/pact/tasks.rb
334
+ - lib/pact/tasks/task_helper.rb
335
+ - lib/pact/tasks/verification_task.rb
310
336
  - lib/pact/term.rb
311
- - lib/pact/verification_task.rb
312
337
  - lib/pact/version.rb
313
338
  - lib/tasks/pact.rake
314
339
  - pact.gemspec
@@ -316,27 +341,32 @@ files:
316
341
  - spec/features/consumption_spec.rb
317
342
  - spec/features/production_spec.rb
318
343
  - spec/features/provider_states/zebras.rb
344
+ - spec/integration/consumer_spec.rb
319
345
  - spec/integration/pact/consumer_configuration_spec.rb
320
346
  - spec/integration/pact/provider_configuration_spec.rb
321
347
  - spec/lib/pact/configuration_spec.rb
322
348
  - spec/lib/pact/consumer/app_manager_spec.rb
349
+ - spec/lib/pact/consumer/configuration_spec.rb
323
350
  - spec/lib/pact/consumer/consumer_contract_builder_spec.rb
324
- - spec/lib/pact/consumer/dsl_spec.rb
325
351
  - spec/lib/pact/consumer/interaction_builder_spec.rb
326
352
  - spec/lib/pact/consumer/interactions_spec.rb
327
- - spec/lib/pact/consumer/mock_service_spec.rb
353
+ - spec/lib/pact/consumer/mock_service/interaction_list_spec.rb
354
+ - spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb
355
+ - spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb
356
+ - spec/lib/pact/consumer/request_spec.rb
328
357
  - spec/lib/pact/consumer/service_consumer_spec.rb
329
358
  - spec/lib/pact/consumer_contract/consumer_contract_spec.rb
330
359
  - spec/lib/pact/consumer_contract/interaction_spec.rb
360
+ - spec/lib/pact/consumer_contract/request_spec.rb
331
361
  - spec/lib/pact/matchers/matchers_spec.rb
332
- - spec/lib/pact/provider/dsl_spec.rb
362
+ - spec/lib/pact/provider/configuration_spec.rb
333
363
  - spec/lib/pact/provider/pact_helper_locator_spec.rb
334
364
  - spec/lib/pact/provider/pact_spec_runner_spec.rb
335
365
  - spec/lib/pact/provider/provider_state_spec.rb
366
+ - spec/lib/pact/provider/request_spec.rb
336
367
  - spec/lib/pact/provider/rspec_spec.rb
337
368
  - spec/lib/pact/provider/test_methods_spec.rb
338
369
  - spec/lib/pact/reification_spec.rb
339
- - spec/lib/pact/request_spec.rb
340
370
  - spec/lib/pact/term_spec.rb
341
371
  - spec/lib/pact/verification_task_spec.rb
342
372
  - spec/spec_helper.rb
@@ -345,6 +375,7 @@ files:
345
375
  - spec/support/consumer_contract_template.json
346
376
  - spec/support/factories.rb
347
377
  - spec/support/pact_helper.rb
378
+ - spec/support/shared_examples_for_request.rb
348
379
  - spec/support/test_app_fail.json
349
380
  - spec/support/test_app_pass.json
350
381
  - tasks/pact-test.rake
@@ -377,27 +408,32 @@ test_files:
377
408
  - spec/features/consumption_spec.rb
378
409
  - spec/features/production_spec.rb
379
410
  - spec/features/provider_states/zebras.rb
411
+ - spec/integration/consumer_spec.rb
380
412
  - spec/integration/pact/consumer_configuration_spec.rb
381
413
  - spec/integration/pact/provider_configuration_spec.rb
382
414
  - spec/lib/pact/configuration_spec.rb
383
415
  - spec/lib/pact/consumer/app_manager_spec.rb
416
+ - spec/lib/pact/consumer/configuration_spec.rb
384
417
  - spec/lib/pact/consumer/consumer_contract_builder_spec.rb
385
- - spec/lib/pact/consumer/dsl_spec.rb
386
418
  - spec/lib/pact/consumer/interaction_builder_spec.rb
387
419
  - spec/lib/pact/consumer/interactions_spec.rb
388
- - spec/lib/pact/consumer/mock_service_spec.rb
420
+ - spec/lib/pact/consumer/mock_service/interaction_list_spec.rb
421
+ - spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb
422
+ - spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb
423
+ - spec/lib/pact/consumer/request_spec.rb
389
424
  - spec/lib/pact/consumer/service_consumer_spec.rb
390
425
  - spec/lib/pact/consumer_contract/consumer_contract_spec.rb
391
426
  - spec/lib/pact/consumer_contract/interaction_spec.rb
427
+ - spec/lib/pact/consumer_contract/request_spec.rb
392
428
  - spec/lib/pact/matchers/matchers_spec.rb
393
- - spec/lib/pact/provider/dsl_spec.rb
429
+ - spec/lib/pact/provider/configuration_spec.rb
394
430
  - spec/lib/pact/provider/pact_helper_locator_spec.rb
395
431
  - spec/lib/pact/provider/pact_spec_runner_spec.rb
396
432
  - spec/lib/pact/provider/provider_state_spec.rb
433
+ - spec/lib/pact/provider/request_spec.rb
397
434
  - spec/lib/pact/provider/rspec_spec.rb
398
435
  - spec/lib/pact/provider/test_methods_spec.rb
399
436
  - spec/lib/pact/reification_spec.rb
400
- - spec/lib/pact/request_spec.rb
401
437
  - spec/lib/pact/term_spec.rb
402
438
  - spec/lib/pact/verification_task_spec.rb
403
439
  - spec/spec_helper.rb
@@ -406,5 +442,6 @@ test_files:
406
442
  - spec/support/consumer_contract_template.json
407
443
  - spec/support/factories.rb
408
444
  - spec/support/pact_helper.rb
445
+ - spec/support/shared_examples_for_request.rb
409
446
  - spec/support/test_app_fail.json
410
447
  - spec/support/test_app_pass.json
@@ -1,157 +0,0 @@
1
- require_relative 'consumer_contract_builders'
2
-
3
- module Pact::Consumer
4
- module DSL
5
-
6
- module Configuration
7
- def add_provider_verification &block
8
- provider_verifications << block
9
- end
10
- def provider_verifications
11
- @provider_verifications ||= []
12
- end
13
- end
14
-
15
- def service_consumer name, &block
16
- ServiceConsumerDSL.new(name, &block).create_service_consumer
17
- end
18
-
19
- class ServiceConsumerDSL
20
-
21
- def initialize name, &block
22
- @name = name
23
- consumer = Pact::ServiceConsumer.new name: @name
24
- @app = nil
25
- @port = nil
26
- instance_eval(&block)
27
- end
28
-
29
- def validate
30
- raise "Please provide a consumer name" unless (@name && !@name.empty?)
31
- raise "Please provide a port for the consumer app" if @app && !@port
32
- end
33
-
34
- def app app
35
- @app = app
36
- end
37
-
38
- def port port
39
- @port = port
40
- end
41
-
42
- def has_pact_with service_provider_name, &block
43
- Provider.new(service_provider_name, @name, &block).create_consumer_contract_builder
44
- end
45
-
46
- def create_service_consumer
47
- validate
48
- register_consumer_app if @app
49
- end
50
-
51
- def register_consumer_app
52
- Pact::Consumer::AppManager.instance.register @app, @port
53
- end
54
- end
55
-
56
-
57
-
58
-
59
- #OLD ####
60
- def with_provider name, &block
61
- Provider.new(name, &block).create_consumer_contract_builder
62
- end
63
-
64
- alias_method :with_service_provider, :with_provider
65
-
66
- class Provider
67
- def initialize name, consumer_name = Pact.configuration.consumer.name, &block
68
- @name = name
69
- @service = nil
70
- @consumer_name = consumer_name
71
- instance_eval(&block)
72
- end
73
-
74
- def service name, &block
75
- @service = Service.new(name, &block)
76
- end
77
-
78
- alias_method :mock_service, :service
79
-
80
- def create_consumer_contract_builder
81
- validate
82
- consumer_contract_builder_from_attributes
83
- end
84
-
85
- def validate
86
- raise "Please configure a service for #{@name}" unless @service
87
- end
88
-
89
- def consumer_contract_builder_from_attributes
90
- consumer_contract_builder_fields = {
91
- :consumer_name => @consumer_name,
92
- :provider_name => @name,
93
- :pactfile_write_mode => Pact.configuration.pactfile_write_mode
94
- }
95
- @service.configure_consumer_contract_builder consumer_contract_builder_fields
96
- end
97
- end
98
-
99
- class Service
100
- def initialize name, &block
101
- @name = name
102
- @port = nil
103
- @standalone = false
104
- @verify = true
105
- instance_eval(&block)
106
- end
107
-
108
- def port port
109
- @port = port
110
- end
111
-
112
- def standalone standalone
113
- @standalone = standalone
114
- end
115
-
116
- def verify verify
117
- @verify = verify
118
- end
119
-
120
- def configure_consumer_contract_builder consumer_contract_builder_fields
121
- validate
122
- unless @standalone
123
- AppManager.instance.register_mock_service_for consumer_contract_builder_fields[:provider_name], "http://localhost:#{@port}"
124
- end
125
- consumer_contract_builder = Pact::Consumer::ConsumerContractBuilder.new consumer_contract_builder_fields.merge({port: @port})
126
- create_mock_services_module_method consumer_contract_builder
127
- setup_verification(consumer_contract_builder) if @verify
128
- consumer_contract_builder
129
- end
130
-
131
-
132
- def setup_verification consumer_contract_builder
133
- Pact.configuration.add_provider_verification do | example_description |
134
- consumer_contract_builder.verify example_description
135
- end
136
- end
137
-
138
- private
139
-
140
- # This makes the consumer_contract_builder available via a module method with the given identifier
141
- # as the method name.
142
- # I feel this should be defined somewhere else, but I'm not sure where
143
- def create_mock_services_module_method consumer_contract_builder
144
- Pact::Consumer::ConsumerContractBuilders.send(:define_method, @name.to_sym) do
145
- consumer_contract_builder
146
- end
147
- end
148
-
149
- def validate
150
- raise "Please provide a port for service #{@name}" unless @port
151
- end
152
- end
153
- end
154
- end
155
-
156
- Pact.send(:extend, Pact::Consumer::DSL)
157
- Pact::Configuration.send(:include, Pact::Consumer::DSL::Configuration)