pacto 0.3.0.pre → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rubocop-todo.yml +0 -27
  4. data/.rubocop.yml +9 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +4 -5
  8. data/CONTRIBUTING.md +112 -0
  9. data/Gemfile +5 -0
  10. data/Guardfile +18 -13
  11. data/README.md +157 -101
  12. data/Rakefile +3 -3
  13. data/features/configuration/strict_matchers.feature +97 -0
  14. data/features/evolve/README.md +11 -0
  15. data/features/evolve/existing_services.feature +82 -0
  16. data/features/generate/README.md +5 -0
  17. data/features/generate/generation.feature +28 -0
  18. data/features/steps/pacto_steps.rb +75 -0
  19. data/features/stub/README.md +2 -0
  20. data/features/stub/templates.feature +46 -0
  21. data/features/support/env.rb +11 -5
  22. data/features/validate/README.md +1 -0
  23. data/features/validate/body_only.feature +85 -0
  24. data/features/{journeys/validation.feature → validate/meta_validation.feature} +41 -24
  25. data/features/validate/validation.feature +36 -0
  26. data/lib/pacto.rb +61 -33
  27. data/lib/pacto/contract.rb +18 -15
  28. data/lib/pacto/contract_factory.rb +14 -11
  29. data/lib/pacto/contract_files.rb +17 -0
  30. data/lib/pacto/contract_list.rb +17 -0
  31. data/lib/pacto/contract_validator.rb +29 -0
  32. data/lib/pacto/core/configuration.rb +19 -17
  33. data/lib/pacto/core/contract_registry.rb +43 -0
  34. data/lib/pacto/core/{callback.rb → hook.rb} +3 -3
  35. data/lib/pacto/core/modes.rb +33 -0
  36. data/lib/pacto/core/validation_registry.rb +45 -0
  37. data/lib/pacto/erb_processor.rb +0 -1
  38. data/lib/pacto/extensions.rb +18 -4
  39. data/lib/pacto/generator.rb +34 -49
  40. data/lib/pacto/generator/filters.rb +41 -0
  41. data/lib/pacto/hooks/erb_hook.rb +4 -3
  42. data/lib/pacto/logger.rb +4 -2
  43. data/lib/pacto/meta_schema.rb +4 -2
  44. data/lib/pacto/rake_task.rb +28 -25
  45. data/lib/pacto/request_clause.rb +43 -0
  46. data/lib/pacto/request_pattern.rb +8 -0
  47. data/lib/pacto/response_clause.rb +15 -0
  48. data/lib/pacto/rspec.rb +102 -0
  49. data/lib/pacto/stubs/uri_pattern.rb +23 -0
  50. data/lib/pacto/stubs/webmock_adapter.rb +69 -0
  51. data/lib/pacto/stubs/webmock_helper.rb +71 -0
  52. data/lib/pacto/ui.rb +7 -0
  53. data/lib/pacto/uri.rb +9 -0
  54. data/lib/pacto/validation.rb +57 -0
  55. data/lib/pacto/validators/body_validator.rb +41 -0
  56. data/lib/pacto/validators/request_body_validator.rb +23 -0
  57. data/lib/pacto/validators/response_body_validator.rb +23 -0
  58. data/lib/pacto/validators/response_header_validator.rb +49 -0
  59. data/lib/pacto/validators/response_status_validator.rb +24 -0
  60. data/lib/pacto/version.rb +1 -1
  61. data/pacto.gemspec +33 -29
  62. data/resources/contract_schema.json +8 -176
  63. data/resources/draft-03.json +174 -0
  64. data/spec/integration/data/strict_contract.json +2 -2
  65. data/spec/integration/e2e_spec.rb +22 -31
  66. data/spec/integration/rspec_spec.rb +94 -0
  67. data/spec/integration/templating_spec.rb +9 -12
  68. data/{lib → spec}/pacto/server.rb +0 -0
  69. data/{lib → spec}/pacto/server/dummy.rb +11 -8
  70. data/{lib → spec}/pacto/server/playback_servlet.rb +1 -1
  71. data/spec/spec_helper.rb +2 -0
  72. data/spec/unit/hooks/erb_hook_spec.rb +15 -15
  73. data/spec/unit/pacto/configuration_spec.rb +2 -10
  74. data/spec/unit/pacto/contract_factory_spec.rb +16 -13
  75. data/spec/unit/pacto/contract_files_spec.rb +42 -0
  76. data/spec/unit/pacto/contract_list_spec.rb +35 -0
  77. data/spec/unit/pacto/contract_spec.rb +43 -44
  78. data/spec/unit/pacto/contract_validator_spec.rb +85 -0
  79. data/spec/unit/pacto/core/configuration_spec.rb +4 -11
  80. data/spec/unit/pacto/core/contract_registry_spec.rb +119 -0
  81. data/spec/unit/pacto/core/modes_spec.rb +18 -0
  82. data/spec/unit/pacto/core/validation_registry_spec.rb +76 -0
  83. data/spec/unit/pacto/core/validation_spec.rb +60 -0
  84. data/spec/unit/pacto/extensions_spec.rb +14 -23
  85. data/spec/unit/pacto/generator/filters_spec.rb +99 -0
  86. data/spec/unit/pacto/generator_spec.rb +34 -73
  87. data/spec/unit/pacto/meta_schema_spec.rb +46 -6
  88. data/spec/unit/pacto/pacto_spec.rb +17 -15
  89. data/spec/unit/pacto/{request_spec.rb → request_clause_spec.rb} +32 -44
  90. data/spec/unit/pacto/request_pattern_spec.rb +22 -0
  91. data/spec/unit/pacto/response_clause_spec.rb +54 -0
  92. data/spec/unit/pacto/stubs/uri_pattern_spec.rb +28 -0
  93. data/spec/unit/pacto/stubs/webmock_adapter_spec.rb +205 -0
  94. data/spec/unit/pacto/stubs/webmock_helper_spec.rb +20 -0
  95. data/spec/unit/pacto/uri_spec.rb +20 -0
  96. data/spec/unit/pacto/validators/body_validator_spec.rb +105 -0
  97. data/spec/unit/pacto/validators/response_header_validator_spec.rb +94 -0
  98. data/spec/unit/pacto/validators/response_status_validator_spec.rb +20 -0
  99. metadata +230 -146
  100. data/features/generation/generation.feature +0 -25
  101. data/lib/pacto/core/contract_repository.rb +0 -44
  102. data/lib/pacto/hash_merge_processor.rb +0 -14
  103. data/lib/pacto/request.rb +0 -57
  104. data/lib/pacto/response.rb +0 -63
  105. data/lib/pacto/response_adapter.rb +0 -24
  106. data/lib/pacto/stubs/built_in.rb +0 -57
  107. data/spec/unit/pacto/core/contract_repository_spec.rb +0 -133
  108. data/spec/unit/pacto/hash_merge_processor_spec.rb +0 -20
  109. data/spec/unit/pacto/response_adapter_spec.rb +0 -25
  110. data/spec/unit/pacto/response_spec.rb +0 -201
  111. data/spec/unit/pacto/stubs/built_in_spec.rb +0 -168
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Pacto
4
+ describe ContractList do
5
+ let(:contract1) { double(:contract_1) }
6
+ let(:contract2) { double(:contract_2) }
7
+
8
+ it 'holds a list of contracts' do
9
+ list = ContractList.new([contract1, contract2])
10
+ expect(list.contracts).to eq([contract1, contract2])
11
+ end
12
+
13
+ context 'when validating' do
14
+ it 'validates every contract on the list' do
15
+ expect(contract1).to receive(:validate_provider)
16
+ expect(contract2).to receive(:validate_provider)
17
+
18
+ list = ContractList.new([contract1, contract2])
19
+ list.validate_all
20
+ end
21
+ end
22
+
23
+ context 'when stubbing' do
24
+ let(:values) { Hash.new }
25
+
26
+ it 'stubs every contract on the list' do
27
+ expect(contract1).to receive(:stub_contract!).with(values)
28
+ expect(contract2).to receive(:stub_contract!).with(values)
29
+
30
+ list = ContractList.new([contract1, contract2])
31
+ list.stub_all(values)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,77 +1,76 @@
1
1
  module Pacto
2
2
  describe Contract do
3
3
  let(:request) { double 'request' }
4
- let(:request_signature) { double 'request_signature' }
5
- let(:response) { double 'response' }
4
+ let(:response) { double 'response definition' }
6
5
  let(:provider) { double 'provider' }
7
- let(:instantiated_response) { double 'instantiated response' }
6
+ let(:file) { 'contranct.json' }
7
+ let(:request_pattern_provider) { double(for: nil) }
8
8
 
9
- subject(:contract) { described_class.new request, response }
9
+ subject(:contract) { Contract.new(request, response, file, 'sample', request_pattern_provider) }
10
10
 
11
11
  before do
12
- response.stub(:instantiate => instantiated_response)
13
12
  Pacto.configuration.provider = provider
14
13
  end
15
14
 
15
+ it 'has a request pattern' do
16
+ pattern = double
17
+ expect(request_pattern_provider).to receive(:for).and_return(pattern)
18
+ expect(contract.request_pattern).to eq pattern
19
+ end
20
+
16
21
  describe '#stub_contract!' do
17
- it 'instantiates the response and registers a stub' do
18
- response.should_receive :instantiate
19
- provider.should_receive(:stub_request!).with request, instantiated_response
22
+ it 'register a stub for the contract' do
23
+ provider.should_receive(:stub_request!).with(request, response)
20
24
  contract.stub_contract!
21
25
  end
22
26
  end
23
27
 
24
- describe '#validate' do
28
+ context 'validations' do
29
+ let(:fake_response) { double('fake response') }
30
+ let(:validation_result) { double 'validation result' }
31
+
25
32
  before do
26
- response.stub(:validate => validation_result)
27
- request.stub(:execute => fake_response)
33
+ allow(Pacto::ContractValidator).to receive(:validate).with(contract, request, fake_response, {}).and_return validation_result
28
34
  end
29
35
 
30
- let(:validation_result) { double 'validation result' }
31
- let(:fake_response) { double 'fake response' }
36
+ describe '#validate_consumer' do
37
+ it 'returns the result of the validation' do
38
+ expect(Pacto::ContractValidator).to receive(:validate).with(contract, request, fake_response, {})
39
+ expect(contract.validate_consumer request, fake_response).to eq validation_result
40
+ end
32
41
 
33
- it 'validates the generated response' do
34
- response.should_receive(:validate).with(fake_response, {})
35
- expect(contract.validate).to eq validation_result
42
+ it 'does not generate another response' do
43
+ request.should_not_receive :execute
44
+ contract.validate_consumer request, fake_response
45
+ end
36
46
  end
37
47
 
38
- it 'returns the result of the validation' do
39
- expect(contract.validate).to eq validation_result
40
- end
48
+ describe '#validate_provider' do
49
+ before do
50
+ allow(request).to receive(:execute).and_return fake_response
51
+ end
41
52
 
42
- it 'generates the response' do
43
- request.should_receive :execute
44
- contract.validate
45
- end
53
+ it 'generates the response' do
54
+ request.should_receive :execute
55
+ contract.validate_provider
56
+ end
46
57
 
47
- context 'when response gotten is provided' do
48
- it 'does not generate the response' do
49
- request.should_not_receive :execute
50
- contract.validate fake_response
58
+ it 'returns the result of the validating the generated response' do
59
+ expect(Pacto::ContractValidator).to receive(:validate).with(contract, request, fake_response, {})
60
+ expect(contract.validate_provider).to eq validation_result
51
61
  end
52
62
  end
53
63
  end
54
64
 
55
65
  describe '#matches?' do
56
- let(:request_matcher) do
57
- double('fake request matcher').tap do |matcher|
58
- matcher.stub(:matches?) { |r| r == request_signature }
59
- end
60
- end
66
+ let(:request_pattern) { double(matches?: true) }
67
+ let(:request_signature) { double }
61
68
 
62
- context 'when the contract is not stubbed' do
63
- it 'returns false' do
64
- expect(contract.matches? request_signature).to be_false
65
- end
66
- end
69
+ it 'delegates to the request pattern' do
70
+ expect(request_pattern_provider).to receive(:for).and_return(request_pattern)
71
+ expect(request_pattern).to receive(:matches?).with(request_signature)
67
72
 
68
- context 'when the contract is stubbed' do
69
- it 'returns true if it matches the request' do
70
- provider.should_receive(:stub_request!).with(request, instantiated_response).and_return(request_matcher)
71
- contract.stub_contract!
72
- expect(contract.matches? request_signature).to be_true
73
- expect(contract.matches? :anything).to be_false
74
- end
73
+ contract.matches?(request_signature)
75
74
  end
76
75
  end
77
76
  end
@@ -0,0 +1,85 @@
1
+ module Pacto
2
+ describe ContractValidator do
3
+ let(:validation_errors) { ['some error', 'another error'] }
4
+
5
+ let(:expected_response) do
6
+ ResponseClause.new(
7
+ 'status' => 200,
8
+ 'headers' => {
9
+ 'Content-Type' => 'application/json'
10
+ },
11
+ 'body' => {:type => 'object', :required => true, :properties => double('body definition properties')}
12
+ )
13
+ end
14
+
15
+ let(:actual_response) do
16
+ double(
17
+ :status => 200,
18
+ :headers => {'Content-Type' => 'application/json', 'Age' => '60'},
19
+ :body => { 'message' => 'response' }
20
+ )
21
+ end
22
+
23
+ let(:actual_request) { double :actual_request }
24
+
25
+ let(:expected_request) do
26
+ RequestClause.new(
27
+ 'http://example.com',
28
+ 'body' => {
29
+ :type => 'object',
30
+ :required => true,
31
+ :properties => double('body definition properties')
32
+ }
33
+ )
34
+ end
35
+
36
+ let(:contract) do
37
+ request_pattern_provider = double(for: nil)
38
+ Contract.new(expected_request, expected_response, 'some_file.json', 'sample', request_pattern_provider)
39
+ end
40
+
41
+ let(:opts) { {} }
42
+
43
+ describe '.validate' do
44
+ before do
45
+ allow(Pacto::Validators::RequestBodyValidator).to receive(:validate).with(expected_request.schema, actual_request).and_return([])
46
+ allow(Pacto::Validators::ResponseBodyValidator).to receive(:validate).with(expected_response.schema, actual_response).and_return([])
47
+ end
48
+
49
+ context 'default validator stack' do
50
+ it 'calls the RequestBodyValidator' do
51
+ expect(Pacto::Validators::RequestBodyValidator).to receive(:validate).with(expected_request.schema, actual_request).and_return(validation_errors)
52
+ expect(ContractValidator.validate contract, actual_request, actual_response, opts).to eq(validation_errors)
53
+ end
54
+
55
+ it 'calls the ResponseStatusValidator' do
56
+ expect(Pacto::Validators::ResponseStatusValidator).to receive(:validate).with(expected_response.status, actual_response.status).and_return(validation_errors)
57
+ expect(ContractValidator.validate contract, actual_request, actual_response, opts).to eq(validation_errors)
58
+ end
59
+
60
+ it 'calls the ResponseHeaderValidator' do
61
+ expect(Pacto::Validators::ResponseHeaderValidator).to receive(:validate).with(expected_response.headers, actual_response.headers).and_return(validation_errors)
62
+ expect(ContractValidator.validate contract, actual_request, actual_response, opts).to eq(validation_errors)
63
+ end
64
+
65
+ it 'calls the ResponseBodyValidator' do
66
+ expect(Pacto::Validators::ResponseBodyValidator).to receive(:validate).with(expected_response.schema, actual_response).and_return(validation_errors)
67
+ expect(ContractValidator.validate contract, actual_request, actual_response, opts).to eq(validation_errors)
68
+ end
69
+ end
70
+
71
+ context 'when headers and body match and the ResponseStatusValidator reports no errors' do
72
+ it 'does not return any errors' do
73
+ # JSON::Validator.should_receive(:fully_validate).
74
+ # with(definition['body'], fake_response.body, :version => :draft3).
75
+ # and_return([])
76
+ expect(Pacto::Validators::RequestBodyValidator).to receive(:validate).with(expected_request.schema, actual_request).and_return([])
77
+ expect(Pacto::Validators::ResponseStatusValidator).to receive(:validate).with(expected_response.status, actual_response.status).and_return([])
78
+ expect(Pacto::Validators::ResponseHeaderValidator).to receive(:validate).with(expected_response.headers, actual_response.headers).and_return([])
79
+ expect(Pacto::Validators::ResponseBodyValidator).to receive(:validate).with(expected_response.schema, actual_response).and_return([])
80
+ expect(ContractValidator.validate contract, actual_request, actual_response, opts).to be_empty
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,13 +1,6 @@
1
1
  describe Pacto do
2
2
  describe '.configure' do
3
3
  let(:contracts_path) { 'path_to_contracts' }
4
- it 'allows preprocessor manual configuration' do
5
- expect(Pacto.configuration.preprocessor).to_not be_nil
6
- Pacto.configure do |c|
7
- c.preprocessor = nil
8
- end
9
- expect(Pacto.configuration.preprocessor).to be_nil
10
- end
11
4
 
12
5
  it 'allows contracts_path manual configuration' do
13
6
  expect(Pacto.configuration.contracts_path).to be_nil
@@ -17,12 +10,12 @@ describe Pacto do
17
10
  expect(Pacto.configuration.contracts_path).to eq(contracts_path)
18
11
  end
19
12
 
20
- it 'register a Pacto Callback' do
21
- callback_block = Pacto::Callback.new { }
13
+ it 'register a Pacto Hook' do
14
+ hook_block = Pacto::Hook.new {}
22
15
  Pacto.configure do |c|
23
- c.register_callback(callback_block)
16
+ c.register_hook(hook_block)
24
17
  end
25
- expect(Pacto.configuration.callback).to eq(callback_block)
18
+ expect(Pacto.configuration.hook).to eq(hook_block)
26
19
  end
27
20
  end
28
21
  end
@@ -0,0 +1,119 @@
1
+ require_relative '../../../../lib/pacto/core/contract_registry'
2
+
3
+ module Pacto
4
+ describe ContractRegistry do
5
+ let(:tag) { 'contract_tag' }
6
+ let(:another_tag) { 'another_tag' }
7
+ let(:contract) { double('contract') }
8
+ let(:contract_factory) { double }
9
+ let(:another_contract) { double('another_contract') }
10
+ let(:request_signature) { double('request signature') }
11
+ let(:contracts_that_match) { create_contracts 2, true }
12
+ let(:contracts_that_dont_match) { create_contracts 3, false }
13
+ let(:all_contracts) { contracts_that_match + contracts_that_dont_match }
14
+
15
+ subject(:contract_list) do
16
+ ContractRegistry.new
17
+ end
18
+
19
+ describe '.register' do
20
+ context 'no tag' do
21
+ it 'registers the contract with the default tag' do
22
+ contract_list.register contract
23
+ expect(contract_list[:default]).to include(contract)
24
+ end
25
+ end
26
+
27
+ context 'one tag' do
28
+ it 'registers a contract under a given tag' do
29
+ contract_list.register(contract, tag)
30
+ expect(contract_list[tag]).to include(contract)
31
+ end
32
+
33
+ it 'does not duplicate a contract when it has already been registered with the same tag' do
34
+ contract_list
35
+ .register(contract, tag)
36
+ .register(contract, tag)
37
+
38
+ expect(contract_list[tag]).to include(contract)
39
+ expect(contract_list[tag]).to have(1).items
40
+ end
41
+ end
42
+
43
+ context 'multiple tags' do
44
+ it 'registers a contract using different tags' do
45
+ contract_list.register(contract, tag, another_tag)
46
+ expect(contract_list[tag]).to include(contract)
47
+ expect(contract_list[another_tag]).to include(contract)
48
+ end
49
+
50
+ it 'registers a tag with different contracts ' do
51
+ contract_list
52
+ .register(contract, tag)
53
+ .register(another_contract, tag)
54
+
55
+ expect(contract_list[tag]).to include(contract, another_contract)
56
+ end
57
+
58
+ end
59
+ end
60
+
61
+ describe '.use' do
62
+ before do
63
+ contract_list
64
+ .register(contract, tag)
65
+ .register(another_contract, :default)
66
+ end
67
+
68
+ context 'when a contract has been registry' do
69
+ let(:response_body) { double('response_body') }
70
+
71
+ it 'stubs a contract with default values' do
72
+ contract.should_receive(:stub_contract!)
73
+ another_contract.should_receive(:stub_contract!)
74
+ contract_list.use(tag)
75
+ end
76
+
77
+ it 'stubs default contract if unused tag' do
78
+ another_contract.should_receive(:stub_contract!)
79
+ contract_list.use(another_tag)
80
+ end
81
+ end
82
+
83
+ context 'when contract has not been registry' do
84
+ it 'raises an argument error' do
85
+ contract_list = ContractRegistry.new
86
+ expect { contract_list.use('unregistry') }.to raise_error ArgumentError
87
+ end
88
+ end
89
+ end
90
+
91
+ describe '.contracts_for' do
92
+ context 'when no contracts are found for a request' do
93
+ it 'returns an empty list' do
94
+ expect(contract_list.contracts_for request_signature).to be_empty
95
+ end
96
+ end
97
+
98
+ context 'when contracts are found for a request' do
99
+ it 'returns the matching contracts' do
100
+ register_and_use all_contracts
101
+ expect(contract_list.contracts_for request_signature).to eq(contracts_that_match)
102
+ end
103
+ end
104
+ end
105
+
106
+ def create_contracts(total, matches)
107
+ total.times.map do
108
+ double('contract',
109
+ :stub_contract! => double('request matcher'),
110
+ :matches? => matches)
111
+ end
112
+ end
113
+
114
+ def register_and_use(contracts)
115
+ contracts.each { |contract| contract_list.register contract }
116
+ contract_list.use :default
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,18 @@
1
+ describe Pacto do
2
+ modes = %w{generate validate}
3
+ modes.each do |mode|
4
+ enable_method = "#{mode}!".to_sym # generate!
5
+ query_method = "#{mode[0..-2]}ing?".to_sym # generating?
6
+ disable_method = "stop_#{mode[0..-2]}ing!".to_sym # stop_generating!
7
+ describe ".#{mode}!" do
8
+ it "tells the provider to enable #{mode} mode" do
9
+ expect(subject.send query_method).to be_false
10
+ subject.send enable_method
11
+ expect(subject.send query_method).to be_true
12
+
13
+ subject.send disable_method
14
+ expect(subject.send query_method).to be_false
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,76 @@
1
+ describe Pacto::ValidationRegistry do
2
+ subject(:registry) { Pacto::ValidationRegistry.instance }
3
+ let(:request_pattern) { WebMock::RequestPattern.new(:get, 'www.example.com') }
4
+ let(:request_signature) { WebMock::RequestSignature.new(:get, 'www.example.com') }
5
+ let(:different_request_signature) { WebMock::RequestSignature.new(:get, 'www.thoughtworks.com') }
6
+ let(:validation) { Pacto::Validation.new(request_signature, double, nil) }
7
+ let(:validation_for_a_similar_request) { Pacto::Validation.new(request_signature, double, nil) }
8
+ let(:validation_for_a_different_request) { Pacto::Validation.new(different_request_signature, double, nil) }
9
+
10
+ before(:each) do
11
+ registry.reset!
12
+ end
13
+
14
+ describe 'reset!' do
15
+ before(:each) do
16
+ registry.register_validation(validation)
17
+ end
18
+
19
+ it 'cleans validations' do
20
+ expect { registry.reset! }.to change { registry.validated? request_pattern }.from([validation]).to(nil)
21
+ end
22
+ end
23
+
24
+ describe 'registering and reporting registered validations' do
25
+ it 'returns registered validation' do
26
+ expect(registry.register_validation validation).to eq(validation)
27
+ end
28
+
29
+ it 'reports if validation is not registered' do
30
+ expect(registry.validated? request_pattern).to be_false
31
+ end
32
+
33
+ it 'registers and returns matching validations' do
34
+ registry.register_validation(validation)
35
+ registry.register_validation(validation_for_a_similar_request)
36
+ registry.register_validation(validation_for_a_different_request)
37
+ expect(registry.validated? request_pattern).to eq([validation, validation_for_a_similar_request])
38
+ end
39
+ end
40
+
41
+ describe '.unmatched_validations' do
42
+ let(:contract) { double('contract', :name => 'test') }
43
+
44
+ it 'returns validations with no contract' do
45
+ allow(contract).to receive(:validate_consumer).with(different_request_signature, anything).and_return(double('results', :empty? => true))
46
+ validation_with_results = Pacto::Validation.new(different_request_signature, double, contract)
47
+ registry.register_validation(validation)
48
+ registry.register_validation(validation_for_a_similar_request)
49
+ registry.register_validation(validation_for_a_different_request)
50
+ registry.register_validation(validation_with_results)
51
+
52
+ expect(registry.unmatched_validations).to match_array([validation, validation_for_a_similar_request, validation_for_a_different_request])
53
+ end
54
+ end
55
+
56
+ describe '.failed_validations' do
57
+ let(:contract) { double('contract', :name => 'test') }
58
+ let(:results2) { double('results2', :empty? => false, :join => 'wtf') }
59
+
60
+ it 'returns validations with unsuccessful results' do
61
+ allow(contract).to receive(:name).and_return 'test'
62
+ allow(contract).to receive(:validate_consumer).with(request_signature, anything).and_return(results2)
63
+ validation_with_successful_results = Pacto::Validation.new(request_signature, double, contract)
64
+ validation_with_unsuccessful_results = Pacto::Validation.new(request_signature, double, contract)
65
+
66
+ expect(validation_with_successful_results).to receive(:successful?).twice.and_return true
67
+ expect(validation_with_unsuccessful_results).to receive(:successful?).twice.and_return false
68
+
69
+ registry.register_validation(validation)
70
+ registry.register_validation(validation_with_successful_results)
71
+ registry.register_validation(validation_with_unsuccessful_results)
72
+
73
+ expect(registry.failed_validations).to match_array([validation_with_unsuccessful_results])
74
+ end
75
+ end
76
+ end