pact 1.41.2 → 1.42.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 682d57626c30c4ce3f4e83038a3e5ff54d0f4878
4
- data.tar.gz: 7eb5834ea442abebf6e8739a5a2746514560fdc8
2
+ SHA256:
3
+ metadata.gz: 5246cb251aaa720174fe319b2b7d0f0b9d73bedefb122549704f47db4340541c
4
+ data.tar.gz: e67c6ce61ec87143e7241bee0c1e5238d297dce10ad7b8659601c39d496014c1
5
5
  SHA512:
6
- metadata.gz: 369f376d001db7fac67ed5fce394dd0672c735de178c4c940b67082e7f36e7b8f43e18f2eb91d93403c969a1c26a995c229331f14780563e18b957456951b814
7
- data.tar.gz: db56fdd2c74f3cba9dd6b1e3ec7983eb50a46888f2c6ea7a9a70f2153738be1bbd6a53894a433d70d8f8dd4329b3526334b31c825cc7bcf75d4072e962f4f506
6
+ metadata.gz: '082aafe21839f9a13a49ef86b2782582bdde8cca49ed6486125191950627c7d14e08c48c84e9e3e56ee499eb3535b9c9eab9fdb815a52256fa05aff3f2db7afa'
7
+ data.tar.gz: acacef55a6d67049dad4bcf3a8d30e200f4187ef08ff8cee0a52e74677fc603561a09afe6c4afbac7578cf223e3a4a81619df96b7e7062cec6b35e7554cc395b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,40 @@
1
+ <a name="v1.42.3"></a>
2
+ ### v1.42.3 (2019-11-15)
3
+
4
+
5
+ #### Bug Fixes
6
+
7
+ * **verify**
8
+ * exit with status 0 if all pacts are in pending state ([2f7110b](/../../commit/2f7110b))
9
+
10
+
11
+ <a name="v1.42.2"></a>
12
+ ### v1.42.2 (2019-11-09)
13
+
14
+
15
+ #### Bug Fixes
16
+
17
+ * remove missed &. ([be700d8](/../../commit/be700d8))
18
+
19
+
20
+ <a name="v1.42.1"></a>
21
+ ### v1.42.1 (2019-11-09)
22
+
23
+
24
+ #### Bug Fixes
25
+
26
+ * can't use safe navigation operator because of Ruby 2.2 in Travelling Ruby for the pact-ruby-standalone ([3068ceb](/../../commit/3068ceb))
27
+
28
+
29
+ <a name="v1.42.0"></a>
30
+ ### v1.42.0 (2019-09-26)
31
+
32
+
33
+ #### Features
34
+
35
+ * use new 'pacts for verification' endpoint to retrieve pacts (#199) ([55bb935](/../../commit/55bb935))
36
+
37
+
1
38
  <a name="v1.41.2"></a>
2
39
  ### v1.41.2 (2019-09-10)
3
40
 
@@ -44,15 +44,17 @@ module Pact
44
44
  end
45
45
 
46
46
  def run_specs
47
- exit_code = if options[:pact_uri]
48
- run_with_pact_uri
47
+ exit_code = if options[:pact_uri].is_a?(String)
48
+ run_with_pact_url_string
49
+ elsif options[:pact_uri]
50
+ run_with_pact_uri_object # from pact-provider-verifier
49
51
  else
50
- run_with_configured_pacts
52
+ run_with_configured_pacts_from_pact_helper
51
53
  end
52
54
  exit exit_code
53
55
  end
54
56
 
55
- def run_with_pact_uri
57
+ def run_with_pact_url_string
56
58
  pact_repository_uri_options = {}
57
59
  pact_repository_uri_options[:username] = options[:pact_broker_username] if options[:pact_broker_username]
58
60
  pact_repository_uri_options[:password] = options[:pact_broker_password] if options[:pact_broker_password]
@@ -61,7 +63,11 @@ module Pact
61
63
  Pact::Provider::PactSpecRunner.new([pact_uri], pact_spec_options).run
62
64
  end
63
65
 
64
- def run_with_configured_pacts
66
+ def run_with_pact_uri_object
67
+ Pact::Provider::PactSpecRunner.new([options[:pact_uri]], pact_spec_options).run
68
+ end
69
+
70
+ def run_with_configured_pacts_from_pact_helper
65
71
  pact_urls = Pact.provider_world.pact_urls
66
72
  raise "Please configure a pact to verify" if pact_urls.empty?
67
73
  Pact::Provider::PactSpecRunner.new(pact_urls, pact_spec_options).run
@@ -29,7 +29,7 @@ module Pact
29
29
 
30
30
  def after_suite
31
31
  if Pact.consumer_world.any_pact_examples_ran?
32
- Pact.consumer_world.consumer_contract_builders.each { | c | c.write_pact }
32
+ Pact.consumer_world.consumer_contract_builders.each(&:write_pact)
33
33
  Pact::Doc::Generate.call
34
34
  Pact::MockService::AppManager.instance.kill_all
35
35
  Pact::MockService::AppManager.instance.clear_all
@@ -37,4 +37,4 @@ module Pact
37
37
  end
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -3,7 +3,7 @@ module Pact
3
3
  class SortInteractions
4
4
 
5
5
  def self.call interactions
6
- interactions.sort{|a, b| sortable_id(a) <=> sortable_id(b)}
6
+ interactions.sort_by { |interaction| sortable_id(interaction) }
7
7
  end
8
8
 
9
9
  private
@@ -11,7 +11,6 @@ module Pact
11
11
  def self.sortable_id interaction
12
12
  "#{interaction.description.downcase} #{interaction.response.status} #{(interaction.provider_state || '').downcase}"
13
13
  end
14
-
15
14
  end
16
15
  end
17
- end
16
+ end
@@ -1,6 +1,7 @@
1
1
  require 'pact/retry'
2
2
  require 'pact/hal/authorization_header_redactor'
3
3
  require 'net/http'
4
+ require 'rack'
4
5
 
5
6
  module Pact
6
7
  module Hal
@@ -15,9 +16,11 @@ module Pact
15
16
  end
16
17
 
17
18
  def get href, params = {}, headers = {}
18
- query = params.collect{ |(key, value)| "#{CGI::escape(key)}=#{CGI::escape(value)}" }.join("&")
19
19
  uri = URI(href)
20
- uri.query = query
20
+ if params && params.any?
21
+ existing_params = Rack::Utils.parse_nested_query(uri.query)
22
+ uri.query = Rack::Utils.build_nested_query(existing_params.merge(params))
23
+ end
21
24
  perform_request(create_request(uri, 'Get', nil, headers), uri)
22
25
  end
23
26
 
data/lib/pact/hal/link.rb CHANGED
@@ -40,6 +40,10 @@ module Pact
40
40
  wrap_response(href, @http_client.get(href, payload, headers))
41
41
  end
42
42
 
43
+ def get!(*args)
44
+ get(*args).assert_success!
45
+ end
46
+
43
47
  def put(payload = nil, headers = {})
44
48
  wrap_response(href, @http_client.put(href, payload ? payload.to_json : nil, headers))
45
49
  end
@@ -51,11 +55,25 @@ module Pact
51
55
  def expand(params)
52
56
  expanded_url = expand_url(params, href)
53
57
  new_attrs = @attrs.merge('href' => expanded_url)
54
- Link.new(new_attrs, @http_client)
58
+ Link.new(new_attrs, http_client)
59
+ end
60
+
61
+ def with_query(query)
62
+ if query && query.any?
63
+ uri = URI(href)
64
+ existing_query_params = Rack::Utils.parse_nested_query(uri.query)
65
+ uri.query = Rack::Utils.build_nested_query(existing_query_params.merge(query))
66
+ new_attrs = attrs.merge('href' => uri.to_s)
67
+ Link.new(new_attrs, http_client)
68
+ else
69
+ self
70
+ end
55
71
  end
56
72
 
57
73
  private
58
74
 
75
+ attr_reader :attrs, :http_client
76
+
59
77
  def wrap_response(href, http_response)
60
78
  require 'pact/hal/entity' # avoid circular reference
61
79
  if http_response.success?
@@ -0,0 +1,96 @@
1
+ require 'pact/hal/entity'
2
+ require 'pact/hal/http_client'
3
+ require 'pact/provider/pact_uri'
4
+ require 'pact/errors'
5
+ require 'pact/pact_broker/fetch_pacts'
6
+
7
+ module Pact
8
+ module PactBroker
9
+ class FetchPactURIsForVerification
10
+ attr_reader :provider, :consumer_version_selectors, :provider_version_tags, :broker_base_url, :http_client_options, :http_client
11
+
12
+ PACTS_FOR_VERIFICATION_RELATION = 'beta:provider-pacts-for-verification'.freeze
13
+ PACTS = 'pacts'.freeze
14
+ HREF = 'href'.freeze
15
+ LINKS = '_links'.freeze
16
+ SELF = 'self'.freeze
17
+ EMBEDDED = '_embedded'.freeze
18
+
19
+ def initialize(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
20
+ @provider = provider
21
+ @consumer_version_selectors = consumer_version_selectors || []
22
+ @provider_version_tags = provider_version_tags || []
23
+ @http_client_options = http_client_options
24
+ @broker_base_url = broker_base_url
25
+ @http_client = Pact::Hal::HttpClient.new(http_client_options)
26
+ end
27
+
28
+ def self.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
29
+ new(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options).call
30
+ end
31
+
32
+ def call
33
+ if index.can?(PACTS_FOR_VERIFICATION_RELATION)
34
+ log_message
35
+ pacts_for_verification
36
+ else
37
+ # Fall back to old method of fetching pacts
38
+ consumer_version_tags = consumer_version_selectors.collect{ | selector | selector[:tag] }
39
+ FetchPacts.call(provider, consumer_version_tags, broker_base_url, http_client_options)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def index
46
+ @index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get.assert_success!
47
+ end
48
+
49
+ def pacts_for_verification
50
+ pacts_for_verification_entity.response.body[EMBEDDED][PACTS].collect do | pact |
51
+ metadata = {
52
+ pending: pact["verificationProperties"]["pending"],
53
+ pending_reason: pact["verificationProperties"]["pendingReason"],
54
+ inclusion_reason: pact["verificationProperties"]["inclusionReason"],
55
+ }
56
+ Pact::Provider::PactURI.new(pact[LINKS][SELF][HREF], http_client_options, metadata)
57
+ end
58
+ end
59
+
60
+ def pacts_for_verification_entity
61
+ index
62
+ ._link(PACTS_FOR_VERIFICATION_RELATION)
63
+ .expand(provider: provider)
64
+ .with_query(query)
65
+ .get!
66
+ end
67
+
68
+ def query
69
+ q = {}
70
+ if consumer_version_selectors.any?
71
+ q["consumer_version_selectors"] = consumer_version_selectors
72
+ end
73
+
74
+ if provider_version_tags.any?
75
+ q["provider_version_tags"] = provider_version_tags
76
+ end
77
+ q
78
+ end
79
+
80
+ def log_message
81
+ latest = consumer_version_selectors.any? ? "" : "latest "
82
+ message = "INFO: Fetching #{latest}pacts for #{provider} from #{broker_base_url}"
83
+ if consumer_version_selectors.any?
84
+ desc = consumer_version_selectors.collect do |selector|
85
+ all_or_latest = selector[:all] ? "all" : "latest"
86
+ # TODO support fallback
87
+ name = selector[:fallback] ? "#{selector[:tag]} (or #{selector[:fallback]} if not found)" : selector[:tag]
88
+ "#{all_or_latest} #{name}"
89
+ end.join(", ")
90
+ message << " for tags: #{desc}"
91
+ end
92
+ Pact.configuration.output_stream.puts message
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,19 +1,25 @@
1
1
  require 'pact/pact_broker/fetch_pacts'
2
- require 'pact/pact_broker/fetch_pending_pacts'
2
+ require 'pact/pact_broker/fetch_pact_uris_for_verification'
3
+ require 'pact/provider/pact_uri'
3
4
 
4
5
  #
5
- # @public Use by Pact Provider Verifier
6
+ # @public Used by Pact Provider Verifier
6
7
  #
7
8
  module Pact
8
9
  module PactBroker
9
10
  extend self
10
11
 
12
+ # Keep for backwards compatibility with pact-provider-verifier < 1.23.1
11
13
  def fetch_pact_uris *args
12
14
  Pact::PactBroker::FetchPacts.call(*args).collect(&:uri)
13
15
  end
14
16
 
15
- def fetch_pending_pact_uris *args
16
- Pact::PactBroker::FetchPendingPacts.call(*args).collect(&:uri)
17
+ def fetch_pact_uris_for_verification *args
18
+ Pact::PactBroker::FetchPactURIsForVerification.call(*args)
19
+ end
20
+
21
+ def build_pact_uri(*args)
22
+ Pact::Provider::PactURI.new(*args)
17
23
  end
18
24
  end
19
25
  end
@@ -1,6 +1,6 @@
1
1
  require 'pact/shared/dsl'
2
2
  require 'pact/provider/world'
3
- require 'pact/pact_broker/fetch_pacts'
3
+ require 'pact/pact_broker/fetch_pact_uris_for_verification'
4
4
  require 'pact/errors'
5
5
 
6
6
  module Pact
@@ -14,10 +14,11 @@ module Pact
14
14
  # in parent scope, it will clash with these ones,
15
15
  # so put an underscore in front of the name to be safer.
16
16
 
17
- attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_basic_auth_options, :_verbose
17
+ attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_provider_version_tags, :_basic_auth_options, :_verbose
18
18
 
19
- def initialize(provider_name)
19
+ def initialize(provider_name, provider_version_tags)
20
20
  @_provider_name = provider_name
21
+ @_provider_version_tags = provider_version_tags
21
22
  @_consumer_version_tags = []
22
23
  @_verbose = false
23
24
  end
@@ -45,10 +46,27 @@ module Pact
45
46
  private
46
47
 
47
48
  def create_pact_verification
48
- fetch_pacts = Pact::PactBroker::FetchPacts.new(_provider_name, _consumer_version_tags, _pact_broker_base_url, _basic_auth_options.merge(verbose: _verbose))
49
+ fetch_pacts = Pact::PactBroker::FetchPactURIsForVerification.new(
50
+ _provider_name,
51
+ consumer_version_selectors,
52
+ _provider_version_tags,
53
+ _pact_broker_base_url,
54
+ _basic_auth_options.merge(verbose: _verbose)
55
+ )
56
+
49
57
  Pact.provider_world.add_pact_uri_source fetch_pacts
50
58
  end
51
59
 
60
+ def consumer_version_selectors
61
+ # TODO support "all"
62
+ _consumer_version_tags.collect do | tag |
63
+ {
64
+ tag: tag,
65
+ latest: true
66
+ }
67
+ end
68
+ end
69
+
52
70
  def validate
53
71
  raise Pact::Error.new("Please provide a pact_broker_base_url from which to retrieve the pacts") unless _pact_broker_base_url
54
72
  end
@@ -65,7 +65,7 @@ module Pact
65
65
  end
66
66
 
67
67
  def create_pact_verification_from_broker(&block)
68
- PactVerificationFromBroker.build(name, &block)
68
+ PactVerificationFromBroker.build(name, tags, &block)
69
69
  end
70
70
 
71
71
  def finalize
@@ -22,4 +22,3 @@ module Pact
22
22
  end
23
23
  end
24
24
  end
25
-
@@ -91,7 +91,7 @@ module Pact
91
91
  ::RSpec::Core::CommandLine.new(NoConfigurationOptions.new)
92
92
  .run(::RSpec.configuration.output_stream, ::RSpec.configuration.error_stream)
93
93
  end
94
- options[:ignore_failures] ? 0 : exit_code
94
+ (all_pacts_pending? || options[:ignore_failures]) ? 0 : exit_code
95
95
  end
96
96
 
97
97
  def rspec_runner_options
@@ -159,6 +159,10 @@ module Pact
159
159
  consumer_contract.to_json
160
160
  end
161
161
 
162
+ def all_pacts_pending?
163
+ pact_urls.all?{ | pact_url| pact_url.metadata[:pending] }
164
+ end
165
+
162
166
  def class_exists? name
163
167
  Kernel.const_get name
164
168
  rescue NameError
@@ -1,17 +1,19 @@
1
1
  module Pact
2
2
  module Provider
3
3
  class PactURI
4
- attr_reader :uri, :options
4
+ attr_reader :uri, :options, :metadata
5
5
 
6
- def initialize (uri, options={})
6
+ def initialize (uri, options = nil, metadata = nil)
7
7
  @uri = uri
8
- @options = options
8
+ @options = options || {}
9
+ @metadata = metadata || {} # make sure it's not nil if nil is passed in
9
10
  end
10
11
 
11
12
  def == other
12
13
  other.is_a?(PactURI) &&
13
14
  uri == other.uri &&
14
- options == other.options
15
+ options == other.options &&
16
+ metadata == other.metadata
15
17
  end
16
18
 
17
19
  def basic_auth?
@@ -54,7 +54,7 @@ module Pact
54
54
  end
55
55
 
56
56
  def rack_request_header_for header
57
- with_http_prefix(header.to_s.upcase).gsub('-', '_')
57
+ with_http_prefix(header.to_s.upcase).tr('-', '_')
58
58
  end
59
59
 
60
60
  def rack_request_value_for value
@@ -21,11 +21,13 @@ module Pact
21
21
  include ::RSpec::Core::DSL
22
22
 
23
23
  def honour_pactfile pact_uri, pact_json, options
24
- pact_description = options[:ignore_failures] ? "Pending pact" : "pact"
25
- Pact.configuration.output_stream.puts "INFO: Reading #{pact_description} at #{pact_uri}"
26
- Pact.configuration.output_stream.puts "INFO: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
24
+ Pact.configuration.output_stream.puts "INFO: Reading pact at #{pact_uri}"
25
+ Pact.configuration.output_stream.puts("DEBUG: #{pact_uri.metadata[:inclusion_reason]}") if pact_uri.metadata[:inclusion_reason]
26
+ Pact.configuration.output_stream.puts("DEBUG: #{pact_uri.metadata[:pending_reason]}") if pact_uri.metadata[:pending_reason]
27
+ Pact.configuration.output_stream.puts "DEBUG: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
27
28
  consumer_contract = Pact::ConsumerContract.from_json(pact_json)
28
- ::RSpec.describe "Verifying a #{pact_description} between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}", pactfile_uri: pact_uri do
29
+ suffix = pact_uri.metadata[:pending] ? " [PENDING]": ""
30
+ ::RSpec.describe "Verifying a pact between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}#{suffix}", pactfile_uri: pact_uri do
29
31
  honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri)
30
32
  end
31
33
  end
@@ -74,7 +76,7 @@ module Pact
74
76
  pact_interaction: interaction,
75
77
  pact_interaction_example_description: interaction_description_for_rerun_command(interaction),
76
78
  pact_uri: options[:pact_uri],
77
- pact_ignore_failures: options[:ignore_failures]
79
+ pact_ignore_failures: options[:pact_uri].metadata[:pending] || options[:ignore_failures]
78
80
  }
79
81
 
80
82
  describe description_for(interaction), metadata do
@@ -46,7 +46,7 @@ module Pact
46
46
  def tear_down_provider_states provider_states, consumer, options = {}
47
47
  # If there are no provider state, execute with an nil state to ensure global and base states are executed
48
48
  Pact.configuration.provider_state_tear_down.call(nil, consumer, options) if provider_states.nil? || provider_states.empty?
49
- provider_states.reverse.each do | provider_state |
49
+ provider_states.reverse_each do | provider_state |
50
50
  Pact.configuration.provider_state_tear_down.call(provider_state.name, consumer, options.merge(params: provider_state.params))
51
51
  end
52
52
  end
@@ -43,7 +43,7 @@ module Pact
43
43
  end
44
44
 
45
45
  def pact_uris_from_pact_uri_sources
46
- pact_uri_sources.collect{| pact_uri_source| pact_uri_source.call }.flatten
46
+ pact_uri_sources.collect(&:call).flatten
47
47
  end
48
48
  end
49
49
  end
data/lib/pact/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "1.41.2"
3
+ VERSION = "1.42.3"
4
4
  end
data/pact.gemspec CHANGED
@@ -26,7 +26,6 @@ Gem::Specification.new do |gem|
26
26
  'documentation_uri' => 'https://github.com/pact-foundation/pact-ruby/blob/master/README.md'
27
27
  }
28
28
 
29
- gem.add_runtime_dependency 'randexp', '~> 0.1.7'
30
29
  gem.add_runtime_dependency 'rspec', '>=2.14'
31
30
  gem.add_runtime_dependency 'rack-test', '>= 0.6.3', '< 2.0.0'
32
31
  gem.add_runtime_dependency 'thor'
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.41.2
4
+ version: 1.42.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -12,22 +12,8 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2019-09-09 00:00:00.000000000 Z
15
+ date: 2019-11-15 00:00:00.000000000 Z
16
16
  dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: randexp
19
- requirement: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - "~>"
22
- - !ruby/object:Gem::Version
23
- version: 0.1.7
24
- type: :runtime
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - "~>"
29
- - !ruby/object:Gem::Version
30
- version: 0.1.7
31
17
  - !ruby/object:Gem::Dependency
32
18
  name: rspec
33
19
  requirement: !ruby/object:Gem::Requirement
@@ -323,8 +309,8 @@ files:
323
309
  - lib/pact/hal/http_client.rb
324
310
  - lib/pact/hal/link.rb
325
311
  - lib/pact/pact_broker.rb
312
+ - lib/pact/pact_broker/fetch_pact_uris_for_verification.rb
326
313
  - lib/pact/pact_broker/fetch_pacts.rb
327
- - lib/pact/pact_broker/fetch_pending_pacts.rb
328
314
  - lib/pact/project_root.rb
329
315
  - lib/pact/provider.rb
330
316
  - lib/pact/provider/configuration.rb
@@ -400,7 +386,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
400
386
  version: '0'
401
387
  requirements: []
402
388
  rubyforge_project:
403
- rubygems_version: 2.6.14.3
389
+ rubygems_version: 2.7.6
404
390
  signing_key:
405
391
  specification_version: 4
406
392
  summary: Enables consumer driven contract testing, providing a mock service and DSL
@@ -1,58 +0,0 @@
1
- require 'pact/hal/entity'
2
- require 'pact/hal/http_client'
3
- require 'pact/provider/pact_uri'
4
- require 'pact/errors'
5
-
6
- module Pact
7
- module PactBroker
8
- class FetchPendingPacts
9
- attr_reader :provider, :tags, :broker_base_url, :http_client_options, :http_client, :index_entity
10
-
11
- PENDING_PROVIDER_RELATION = 'beta:pending-provider-pacts'.freeze
12
- WIP_PROVIDER_RELATION = 'beta:wip-provider-pacts'.freeze # deprecated
13
- PACTS = 'pacts'.freeze
14
- PB_PACTS = 'pb:pacts'.freeze
15
- HREF = 'href'.freeze
16
-
17
- def initialize(provider, broker_base_url, http_client_options)
18
- @provider = provider
19
- @http_client_options = http_client_options
20
- @broker_base_url = broker_base_url
21
- @http_client = Pact::Hal::HttpClient.new(http_client_options)
22
- end
23
-
24
- def self.call(provider, broker_base_url, http_client_options)
25
- new(provider, broker_base_url, http_client_options).call
26
- end
27
-
28
- def call
29
- if index.success?
30
- pending_pacts_for_provider
31
- else
32
- raise Pact::Error.new("Error retrieving #{broker_base_url} status=#{index_entity.response.code} #{index_entity.response.raw_body}")
33
- end
34
- end
35
-
36
- private
37
-
38
- def index
39
- @index_entity ||= Pact::Hal::Link.new({ "href" => broker_base_url }, http_client).get.assert_success!
40
- end
41
-
42
- def pending_pacts_for_provider
43
- link = index_entity._link(WIP_PROVIDER_RELATION, PENDING_PROVIDER_RELATION)
44
- if link
45
- get_pact_urls(link.expand(provider: provider).get)
46
- else
47
- []
48
- end
49
- end
50
-
51
- def get_pact_urls(link_by_provider)
52
- link_by_provider.fetch(PB_PACTS, PACTS).collect do |pact|
53
- Pact::Provider::PactURI.new(pact[HREF], http_client_options)
54
- end
55
- end
56
- end
57
- end
58
- end