pact 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
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)