pact_broker 2.68.1 → 2.69.0

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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release_gem.yml +7 -1
  3. data/CHANGELOG.md +17 -0
  4. data/Gemfile +2 -1
  5. data/db/ddl_statements/latest_verification_ids_for_consumer_and_provider.rb +25 -0
  6. data/db/migrations/20180524_create_latest_verifications_for_consumer_and_provider.rb +4 -11
  7. data/db/migrations/20180614_update_latest_verification_ids_for_consumer_and_provider.rb +6 -18
  8. data/db/migrations/20201026_update_latest_verification_ids_for_consumer_and_provider.rb +14 -0
  9. data/lib/pact/doc/interaction_view_model.rb +12 -0
  10. data/lib/pact/doc/markdown/interaction.erb +3 -3
  11. data/lib/pact/doc/markdown/interaction_renderer.rb +2 -1
  12. data/lib/pact_broker/api/decorators/pact_decorator.rb +8 -0
  13. data/lib/pact_broker/api/resources/pact_content_diff.rb +1 -1
  14. data/lib/pact_broker/api/resources/webhooks.rb +1 -1
  15. data/lib/pact_broker/db/clean.rb +30 -10
  16. data/lib/pact_broker/matrix/unresolved_selector.rb +4 -0
  17. data/lib/pact_broker/pacts/latest_pact_publications.rb +15 -0
  18. data/lib/pact_broker/pacts/metadata.rb +5 -1
  19. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +1 -1
  20. data/lib/pact_broker/tasks/clean_task.rb +17 -3
  21. data/lib/pact_broker/version.rb +1 -1
  22. data/pact_broker.gemspec +1 -1
  23. data/spec/lib/pact/doc/interaction_view_model_spec.rb +46 -0
  24. data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +11 -0
  25. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +1 -1
  26. data/spec/lib/pact_broker/db/clean_spec.rb +4 -8
  27. data/spec/support/markdown_pact_v3.json +44 -0
  28. metadata +10 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1076b8629f5570c2304ec89fc169be77c2b6f54aaf832ceec91d5a939806f97
4
- data.tar.gz: 28c09fcdf4d7abc16f367b8c6aaebfd3f3baaa68850ae5809aefb33d92bae8fa
3
+ metadata.gz: 03c656c61487fd81baf9eb94f73fa12ab27bdf5cea1bd2d670af63199123b6ef
4
+ data.tar.gz: '04022874b3eeb6681e79163431ce63c8d6760741dc7ec8db30cc87b8f9257a94'
5
5
  SHA512:
6
- metadata.gz: 6fd730f1c2500942f680f66c4f526b138e71fd6f27a194b85fc280f9f1d959d6ecf79e88cb4aa685d451373cc9c3ac80714751a7d3658ec75c00f874925a8a39
7
- data.tar.gz: 4327534a89cbaae5d76a86bb36aeb220668fd41805837923188e4ae1bfe2e3968d416b4c26338c6b80cc911552bb3f41db2ac0feef4a0bf70470820d1f780136
6
+ metadata.gz: ce0f9fb3186ab25c419b61665245977abfbaa8d245437699c44de54783bde86d8281b950172532d02a31f6aa33f36046dde7a0636075fabe75f3f074c33016c2
7
+ data.tar.gz: f6b8baa8a66b80b50df9223086f8e67dd9233106897b15f5cfa16328e954805de786d4fbe672f3cee5ba831001edd78f5c0a977dfc5d767d4c79aa46a61b1010
@@ -19,11 +19,17 @@ jobs:
19
19
  # checkInterval: 15
20
20
  # env:
21
21
  # GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
22
- - uses: pact-foundation/release-gem@v0.0.11
22
+ - id: release-gem
23
+ uses: pact-foundation/release-gem@v0.0.11
23
24
  env:
24
25
  GEM_HOST_API_KEY: '${{ secrets.RUBYGEMS_API_KEY }}'
25
26
  GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
26
27
  INCREMENT: '${{ github.event.client_payload.increment }}'
28
+ outputs:
29
+ gem_name: "${{ steps.release-gem.outputs.gem_name }}"
30
+ version: "${{ steps.release-gem.outputs.version }}"
31
+ increment: "${{ steps.release-gem.outputs.increment }}"
32
+
27
33
  notify-gem-released:
28
34
  needs: release
29
35
  strategy:
@@ -1,3 +1,20 @@
1
+ <a name="v2.69.0"></a>
2
+ ### v2.69.0 (2020-11-24)
3
+
4
+ #### Features
5
+
6
+ * **wip**
7
+ * keep pacts as WIP when verified via the pactUrl passed though the webhook template parameters - experimental. ([a9b3fef0](/../../commit/a9b3fef0))
8
+
9
+ * add link to the pact content version ([8eefba5f](/../../commit/8eefba5f))
10
+ * display V3 provider states in HTML (#357) ([8e06a7f2](/../../commit/8e06a7f2))
11
+ * optimise query for determining latest verification for consumer and provider ([7889b051](/../../commit/7889b051))
12
+
13
+ #### Bug Fixes
14
+
15
+ * return a 404 when the base pact for a pact diff doesn't exist ([74d3644d](/../../commit/74d3644d))
16
+ * Add consumer name to inclusion reason log (#358) ([82901891](/../../commit/82901891))
17
+
1
18
  <a name="v2.68.1"></a>
2
19
  ### v2.68.1 (2020-10-24)
3
20
 
data/Gemfile CHANGED
@@ -18,12 +18,13 @@ group :test do
18
18
  gem 'rspec-pact-matchers', '~>0.1'
19
19
  gem 'bundler-audit', '~>0.4'
20
20
  gem 'fakefs', '~>0.4'
21
- gem 'webmock', '~>2.3'
21
+ gem 'webmock', '~>3.9'
22
22
  gem 'rspec', '~>3.0'
23
23
  gem 'rspec-its', '~>1.2'
24
24
  gem 'database_cleaner', '~>1.8', '>= 1.8.1'
25
25
  gem 'timecop', '~> 0.9'
26
26
  gem 'faraday', '~>0.15'
27
+ gem 'faraday_middleware', '~> 0.14'
27
28
  gem 'docker-api', '~>1.34'
28
29
  gem 'approvals', '>=0.0.1', '<1.0.0'
29
30
  end
@@ -0,0 +1,25 @@
1
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V1 = "select
2
+ pv.pacticipant_id as provider_id,
3
+ lpp.consumer_id,
4
+ max(v.id) as latest_verification_id
5
+ from verifications v
6
+ join latest_pact_publications_by_consumer_versions lpp
7
+ on v.pact_version_id = lpp.pact_version_id
8
+ join versions pv
9
+ on v.provider_version_id = pv.id
10
+ group by pv.pacticipant_id, lpp.consumer_id"
11
+
12
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V2 = "select
13
+ provider_id,
14
+ consumer_id,
15
+ max(id) as latest_verification_id
16
+ from verifications v
17
+ group by provider_id, consumer_id"
18
+
19
+
20
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V3 = "select
21
+ provider_id,
22
+ consumer_id,
23
+ max(verification_id) as latest_verification_id
24
+ from latest_verification_id_for_pact_version_and_provider_version v
25
+ group by provider_id, consumer_id"
@@ -1,17 +1,10 @@
1
+ require_relative '../ddl_statements/latest_verification_ids_for_consumer_and_provider'
2
+
1
3
  Sequel.migration do
2
4
  up do
3
- # The latest verification id for each consumer version tag
5
+ # The latest verification id for each consumer/provider
4
6
  create_view(:latest_verification_ids_for_consumer_and_provider,
5
- "select
6
- pv.pacticipant_id as provider_id,
7
- lpp.consumer_id,
8
- max(v.id) as latest_verification_id
9
- from verifications v
10
- join latest_pact_publications_by_consumer_versions lpp
11
- on v.pact_version_id = lpp.pact_version_id
12
- join versions pv
13
- on v.provider_version_id = pv.id
14
- group by pv.pacticipant_id, lpp.consumer_id")
7
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V1)
15
8
 
16
9
  # The most recent verification for each consumer/consumer version tag/provider
17
10
  latest_verifications = from(:verifications)
@@ -1,27 +1,15 @@
1
+ require_relative '../ddl_statements/latest_verification_ids_for_consumer_and_provider'
2
+
1
3
  Sequel.migration do
2
4
  up do
3
- # The latest verification id for each consumer version tag
5
+ # The latest verification id for each consumer/provider
4
6
  create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
5
- "select
6
- provider_id,
7
- consumer_id,
8
- max(id) as latest_verification_id
9
- from verifications v
10
- group by provider_id, consumer_id")
7
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V2)
11
8
  end
12
9
 
13
10
  down do
14
- # The latest verification id for each consumer version tag
11
+ # The latest verification id for each consumer/provider
15
12
  create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
16
- "select
17
- pv.pacticipant_id as provider_id,
18
- lpp.consumer_id,
19
- max(v.id) as latest_verification_id
20
- from verifications v
21
- join latest_pact_publications_by_consumer_versions lpp
22
- on v.pact_version_id = lpp.pact_version_id
23
- join versions pv
24
- on v.provider_version_id = pv.id
25
- group by pv.pacticipant_id, lpp.consumer_id")
13
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V1)
26
14
  end
27
15
  end
@@ -0,0 +1,14 @@
1
+ require_relative 'migration_helper'
2
+ require_relative '../ddl_statements/latest_verification_ids_for_consumer_and_provider'
3
+
4
+ Sequel.migration do
5
+ up do
6
+ create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
7
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V3)
8
+ end
9
+
10
+ down do
11
+ create_or_replace_view(:latest_verification_ids_for_consumer_and_provider,
12
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_AND_PROVIDER_V2)
13
+ end
14
+ end
@@ -8,6 +8,8 @@ module Pact
8
8
 
9
9
  include Pact::ActiveSupportSupport
10
10
 
11
+ MARKDOWN_BOLD_CHARACTERS = '**'
12
+
11
13
  def initialize interaction, consumer_contract
12
14
  @interaction = interaction
13
15
  @consumer_contract = consumer_contract
@@ -52,6 +54,16 @@ module Pact
52
54
  markdown_escape apply_capitals(@interaction.provider_state.strip, start_of_sentence)
53
55
  end
54
56
 
57
+ def formatted_provider_states mark_bold: false
58
+ bold_marker = mark_bold ? MARKDOWN_BOLD_CHARACTERS : ''
59
+
60
+ (@interaction.provider_states || []).map do |ps|
61
+ "#{bold_marker}" \
62
+ "#{markdown_escape(apply_capitals(ps.name.strip, false))}" \
63
+ "#{bold_marker}"
64
+ end.join(' and ')
65
+ end
66
+
55
67
  def description start_of_sentence = false
56
68
  return '' unless @interaction.description
57
69
  markdown_escape apply_capitals(@interaction.description.strip, start_of_sentence)
@@ -1,6 +1,6 @@
1
- <a name="<%= interaction.id %>"></a>
2
- <%= if interaction.has_provider_state?
3
- "Given **#{h(interaction.provider_state)}**, upon receiving"
1
+ <a name="<%= interaction.id %>"></a><% formatted_provider_states = h(interaction.formatted_provider_states mark_bold: true) %>
2
+ <%= if !formatted_provider_states.empty?
3
+ "Given #{formatted_provider_states}, upon receiving"
4
4
  else
5
5
  "Upon receiving"
6
6
  end
@@ -13,7 +13,8 @@ module Pact
13
13
  end
14
14
 
15
15
  def render_summary
16
- suffix = interaction.has_provider_state? ? " given #{h(interaction.provider_state)}" : ""
16
+ formatted_provider_states = h(interaction.formatted_provider_states)
17
+ suffix = formatted_provider_states.empty? ? "" : " given #{formatted_provider_states}"
17
18
  "* [#{h(interaction.description(true))}](##{interaction.id})#{suffix}\n\n"
18
19
  end
19
20
 
@@ -50,6 +50,14 @@ module PactBroker
50
50
  }
51
51
  end
52
52
 
53
+ link :'pb:pact-version' do | options |
54
+ {
55
+ title: "Pact content version permalink",
56
+ name: represented.pact_version_sha,
57
+ href: pact_version_url(represented, options.fetch(:base_url))
58
+ }
59
+ end
60
+
53
61
  link :'pb:latest-pact-version' do | options |
54
62
  {
55
63
  title: "Latest version of this pact",
@@ -15,7 +15,7 @@ module PactBroker
15
15
  end
16
16
 
17
17
  def resource_exists?
18
- consumer && provider
18
+ pact
19
19
  end
20
20
 
21
21
  def to_text
@@ -51,7 +51,7 @@ module PactBroker
51
51
  end
52
52
 
53
53
  def policy_name
54
- :'webhooks::webhooks'
54
+ request.post? ? :'webhooks::webhook' : :'webhooks::webhooks'
55
55
  end
56
56
 
57
57
  private
@@ -25,17 +25,17 @@ module PactBroker
25
25
  end
26
26
 
27
27
  def keep
28
- options[:keep] || [PactBroker::Matrix::UnresolvedSelector.new(tag: true, latest: true)]
28
+ options[:keep] || [PactBroker::Matrix::UnresolvedSelector.new(tag: true, latest: true), PactBroker::Matrix::UnresolvedSelector.new(latest: true)]
29
29
  end
30
30
 
31
- def resolve_ids(query)
31
+ def resolve_ids(query, column_name = :id)
32
32
  # query
33
- Unionable.new(query.collect { |h| h[:id] })
33
+ Unionable.new(query.collect { |h| h[column_name] })
34
34
  end
35
35
 
36
36
  def pact_publication_ids_to_keep
37
37
  @pact_publication_ids_to_keep ||= pact_publication_ids_to_keep_for_version_ids_to_keep
38
- .union(pact_publications_to_keep_for_verification_ids_to_keep)
38
+ .union(latest_pact_publication_ids_to_keep)
39
39
  .union(latest_tagged_pact_publications_ids_to_keep)
40
40
  end
41
41
 
@@ -43,16 +43,17 @@ module PactBroker
43
43
  @pact_publication_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:pact_publications].select(:id).where(consumer_version_id: version_ids_to_keep))
44
44
  end
45
45
 
46
- def pact_publications_to_keep_for_verification_ids_to_keep
47
- @pact_publications_to_keep_for_verification_ids_to_keep ||= resolve_ids(db[:pact_publications].select(:id).where(pact_version_id: db[:verifications].select(:pact_version_id).where(id: verification_ids_to_keep_for_version_ids_to_keep)))
48
- end
49
-
50
46
  def latest_tagged_pact_publications_ids_to_keep
51
47
  @latest_tagged_pact_publications_ids_to_keep ||= resolve_ids(keep.select(&:tag).select(&:latest).collect do | selector |
52
48
  PactBroker::Pacts::LatestTaggedPactPublications.select(:id).for_selector(selector)
53
49
  end.reduce(&:union))
54
50
  end
55
51
 
52
+
53
+ def latest_pact_publication_ids_to_keep
54
+ @latest_pact_publication_ids_to_keep ||= resolve_ids(db[:latest_pact_publications].select(:id))
55
+ end
56
+
56
57
  def pact_publication_ids_to_delete
57
58
  @pact_publication_ids_to_delete ||= resolve_ids(db[:pact_publications].select(:id).where(id: pact_publication_ids_to_keep).invert)
58
59
  end
@@ -62,12 +63,31 @@ module PactBroker
62
63
  @verification_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:verifications].select(:id).where(provider_version_id: version_ids_to_keep))
63
64
  end
64
65
 
66
+ def verification_ids_to_keep_because_latest_verification_for_latest_pact
67
+ @verification_ids_to_keep_because_latest_verification ||= resolve_ids(
68
+ db[:latest_verification_ids_for_pact_versions]
69
+ .select(:latest_verification_id)
70
+ .where(pact_version_id:
71
+ db[:latest_pact_publications].select(:pact_version_id)
72
+ ),
73
+ :latest_verification_id
74
+ )
75
+ end
76
+
65
77
  def verification_ids_to_keep_for_pact_publication_ids_to_keep
66
- @verification_ids_to_keep_for_pact_publication_ids_to_keep ||= resolve_ids(db[:verifications].select(:id).where(pact_version_id: db[:pact_publications].select(:pact_version_id).where(id: pact_publication_ids_to_keep_for_version_ids_to_keep)))
78
+ @verification_ids_to_keep_for_pact_publication_ids_to_keep ||= resolve_ids(
79
+ db[:latest_verification_id_for_pact_version_and_provider_version]
80
+ .select(:verification_id)
81
+ .where(pact_version_id:
82
+ db[:pact_publications]
83
+ .select(:pact_version_id)
84
+ .where(id: pact_publication_ids_to_keep_for_version_ids_to_keep)
85
+ )
86
+ )
67
87
  end
68
88
 
69
89
  def verification_ids_to_keep
70
- @verification_ids_to_keep ||= verification_ids_to_keep_for_version_ids_to_keep.union(verification_ids_to_keep_for_pact_publication_ids_to_keep)
90
+ @verification_ids_to_keep ||= verification_ids_to_keep_for_version_ids_to_keep.union(verification_ids_to_keep_because_latest_verification_for_latest_pact)
71
91
  end
72
92
 
73
93
  def verification_ids_to_delete
@@ -17,6 +17,10 @@ module PactBroker
17
17
  !!latest
18
18
  end
19
19
 
20
+ def overall_latest?
21
+ latest? && !tag && !max_age
22
+ end
23
+
20
24
  def latest
21
25
  self[:latest]
22
26
  end
@@ -8,6 +8,21 @@ module PactBroker
8
8
  class LatestPactPublications < LatestPactPublicationsByConsumerVersion
9
9
  set_dataset(:latest_pact_publications)
10
10
 
11
+ # def dataset_module
12
+ # def where_age_less_than(days)
13
+ # start_date = Date.today - days
14
+ # where{ latest_pact_publications[:created_at] >= start_date }
15
+ # end
16
+
17
+ # def for_selector(selector)
18
+ # query = self
19
+ # query = query.where(consumer_name: selector.pacticipant_name) if selector.pacticipant_name
20
+ # query = query.where(tag_name: selector.tag) if selector.tag && selector.tag.is_a?(String)
21
+ # query = query.where_age_less_than(selector.max_age) if selector.max_age
22
+ # query
23
+ # end
24
+ # end
25
+
11
26
  # This pact may well be the latest for certain tags, but in this query
12
27
  # we don't know what they are
13
28
  def to_domain
@@ -1,3 +1,5 @@
1
+ require 'pact_broker/feature_toggle'
2
+
1
3
  module PactBroker
2
4
  module Pacts
3
5
  module Metadata
@@ -27,10 +29,12 @@ module PactBroker
27
29
  # parameters. This is part of ensuring that verification results webhooks
28
30
  # go back to the correct consumer version number (eg for git statuses)
29
31
  def build_metadata_for_webhook_triggered_by_pact_publication(pact)
30
- {
32
+ metadata = {
31
33
  consumer_version_number: pact.consumer_version_number,
32
34
  consumer_version_tags: pact.consumer_version_tag_names
33
35
  }
36
+ metadata[:wip] = "true" if PactBroker.feature_enabled?(:experimental_webhook_wip)
37
+ metadata
34
38
  end
35
39
  end
36
40
  end
@@ -29,7 +29,7 @@ module PactBroker
29
29
  version_text = head_consumer_tags.size == 1 ? "version" : "versions"
30
30
  if wip?
31
31
  # WIP pacts will always have tags, because it is part of the definition of being a WIP pact
32
- "The pact at #{pact_version_url} is being verified because it is a 'work in progress' pact (ie. it is the pact for the latest #{version_text} of Foo tagged with #{joined_head_consumer_tags} and is still in pending state). #{READ_MORE_WIP}"
32
+ "The pact at #{pact_version_url} is being verified because it is a 'work in progress' pact (ie. it is the pact for the latest #{version_text} of #{consumer_name} tagged with #{joined_head_consumer_tags} and is still in pending state). #{READ_MORE_WIP}"
33
33
  else
34
34
  criteria_or_criterion = selectors.size > 1 ? "criteria" : "criterion"
35
35
  "The pact at #{pact_version_url} is being verified because it matches the following configured selection #{criteria_or_criterion}: #{selector_descriptions}#{same_content_note}"
@@ -3,6 +3,7 @@ module PactBroker
3
3
  class CleanTask < ::Rake::TaskLib
4
4
 
5
5
  attr_accessor :database_connection
6
+ attr_accessor :keep
6
7
 
7
8
  def initialize &block
8
9
  rake_task &block
@@ -11,11 +12,24 @@ module PactBroker
11
12
  def rake_task &block
12
13
  namespace :pact_broker do
13
14
  namespace :db do
14
- desc "Clean unused pacts and verifications from database"
15
+ desc "Clean unnecessary pacts and verifications from database"
15
16
  task :clean do | t, args |
16
- require 'pact_broker/db/clean'
17
+
17
18
  instance_eval(&block)
18
- PactBroker::DB::Clean.call(database_connection)
19
+
20
+ require 'pact_broker/db/clean'
21
+ require 'pact_broker/matrix/unresolved_selector'
22
+ require 'yaml'
23
+
24
+ keep_selectors = nil
25
+ if keep
26
+ keep_selectors = [*keep].collect do | hash |
27
+ PactBroker::Matrix::UnresolvedSelector.new(hash)
28
+ end
29
+ end
30
+ # TODO time it
31
+ results = PactBroker::DB::Clean.call(database_connection, keep: keep_selectors)
32
+ puts results.to_yaml
19
33
  end
20
34
  end
21
35
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '2.68.1'
2
+ VERSION = '2.69.0'
3
3
  end
@@ -53,7 +53,7 @@ Gem::Specification.new do |gem|
53
53
  gem.add_runtime_dependency 'semver2', '~> 3.4.2'
54
54
  gem.add_runtime_dependency 'rack', '>= 2.2.3', '~> 2.2'
55
55
  gem.add_runtime_dependency 'redcarpet', '>=3.3.2', '~>3.3'
56
- gem.add_runtime_dependency 'pact-support', '~> 1.14', '>= 1.14.1'
56
+ gem.add_runtime_dependency 'pact-support', '1.15.0'
57
57
  gem.add_runtime_dependency 'padrino-core', '>= 0.14.3', '~> 0.14'
58
58
  gem.add_runtime_dependency 'sinatra', '>= 2.0.8.1', '< 3.0'
59
59
  gem.add_runtime_dependency 'haml', '~>5.0'
@@ -181,6 +181,52 @@ module Pact
181
181
  end
182
182
  end
183
183
  end
184
+
185
+ describe "formatted_provider_states" do
186
+ let(:consumer_contract) { Pact::ConsumerContract.from_uri './spec/support/markdown_pact.json' }
187
+ let(:interaction) { consumer_contract.interactions.first }
188
+
189
+ context "when no provider state" do
190
+ let(:interaction) { consumer_contract.interactions.last }
191
+
192
+ it "returns an empty string" do
193
+ expect(subject.formatted_provider_states).to eq ""
194
+ end
195
+ end
196
+
197
+ context "when marking provider states in bold" do
198
+ it "formats the provider state in bold" do
199
+ expect(subject.formatted_provider_states mark_bold: true).to eq "**alligators exist**"
200
+ end
201
+ end
202
+
203
+ context "when not marking provider states in bold" do
204
+ it "formats the provider state without bold" do
205
+ expect(subject.formatted_provider_states).to eq "alligators exist"
206
+ end
207
+ end
208
+
209
+ context "when using v3 specification" do
210
+ let(:consumer_contract) { Pact::ConsumerContract.from_uri './spec/support/markdown_pact_v3.json' }
211
+ let(:interaction) { consumer_contract.interactions.first }
212
+
213
+ context "when marking provider states in bold" do
214
+ it "formats the provider states in bold" do
215
+ expected_result = '**alligators exist** and **the city of Tel Aviv has a zoo** ' \
216
+ 'and **the zoo keeps record of its alligator population**'
217
+ expect(subject.formatted_provider_states mark_bold: true).to eq expected_result
218
+ end
219
+ end
220
+
221
+ context "when not marking provider states in bold" do
222
+ it "formats the provider states without bold" do
223
+ expected_result = 'alligators exist and the city of Tel Aviv has a zoo ' \
224
+ 'and the zoo keeps record of its alligator population'
225
+ expect(subject.formatted_provider_states).to eq expected_result
226
+ end
227
+ end
228
+ end
229
+ end
184
230
  end
185
231
  end
186
232
  end
@@ -12,6 +12,17 @@ module Pact
12
12
  subject { ConsumerContractRenderer.new(consumer_contract) }
13
13
 
14
14
  describe "#call" do
15
+ context "when using V3 specification" do
16
+ context "when an interaction has multiple provider states" do
17
+ let(:consumer_contract) { Pact::ConsumerContract.from_uri './spec/support/markdown_pact_v3.json' }
18
+
19
+ it "displays all provider states in the interaction title" do
20
+ expect(subject.call).to include 'Given **alligators exist** and **the city of Tel Aviv has a zoo** ' \
21
+ 'and **the zoo keeps record of its alligator population**, upon receiving'
22
+ end
23
+ end
24
+ end
25
+
15
26
  context "with markdown characters in the pacticipant names" do
16
27
  let(:consumer_contract) { Pact::ConsumerContract.from_uri './spec/support/markdown_pact_with_markdown_chars_in_names.json' }
17
28
 
@@ -107,7 +107,7 @@ module PactBroker
107
107
 
108
108
  describe "webhook metadata" do
109
109
  let(:expected_metadata) do
110
- { consumer_version_number: "123/456", consumer_version_tags: %w[dev] }
110
+ { consumer_version_number: "123/456", consumer_version_tags: %w[dev], wip: "true" }
111
111
  end
112
112
 
113
113
  it "builds the webhook metadata" do
@@ -33,6 +33,8 @@ module PactBroker
33
33
  .create_pact
34
34
  .create_consumer_version("6", tag_names: %w{foo})
35
35
  .create_pact
36
+ .create_consumer_version("7")
37
+ .create_pact
36
38
  end
37
39
 
38
40
  let(:options) { { keep: [all_prod_selector, latest_dev_selector] } }
@@ -43,12 +45,14 @@ module PactBroker
43
45
  expect(PactBroker::Domain::Version.where(number: "4").count).to be 1
44
46
  expect(PactBroker::Domain::Version.where(number: "5").count).to be 1
45
47
  expect(PactBroker::Domain::Version.where(number: "6").count).to be 1
48
+ expect(PactBroker::Domain::Version.where(number: "7").count).to be 1
46
49
  subject
47
50
  expect(PactBroker::Domain::Version.where(number: "1").count).to be 1
48
51
  expect(PactBroker::Domain::Version.where(number: "3").count).to be 1
49
52
  expect(PactBroker::Domain::Version.where(number: "4").count).to be 0
50
53
  expect(PactBroker::Domain::Version.where(number: "5").count).to be 1
51
54
  expect(PactBroker::Domain::Version.where(number: "6").count).to be 0
55
+ expect(PactBroker::Domain::Version.where(number: "7").count).to be 1 # doesn't delete overall latest
52
56
  end
53
57
  end
54
58
 
@@ -97,12 +101,6 @@ module PactBroker
97
101
  }.by(-1)
98
102
  end
99
103
 
100
- it "does not delete the pact publication that belongs to the latest verification" do
101
- expect{ subject }.to_not change {
102
- PactBroker::Pacts::PactPublication.where(consumer_version: PactBroker::Domain::Version.where_pacticipant_name("Foo").where(number: "2")).count
103
- }
104
- end
105
-
106
104
  it "deletes the pact publication that does not belongs to the latest verification" do
107
105
  expect{ subject }.to change {
108
106
  PactBroker::Pacts::PactPublication.where(consumer_version: PactBroker::Domain::Version.where_pacticipant_name("Foo").where(number: "1")).count
@@ -110,8 +108,6 @@ module PactBroker
110
108
  end
111
109
  end
112
110
 
113
-
114
-
115
111
  context "with orphan pact versions" do
116
112
  before do
117
113
  # Create a pact that will not be deleted
@@ -0,0 +1,44 @@
1
+ {
2
+ "provider": {
3
+ "name": "Some Provider"
4
+ },
5
+ "consumer": {
6
+ "name": "Some Consumer"
7
+ },
8
+ "interactions": [
9
+ {
10
+ "description": "a request to list all alligators in Tel Aviv",
11
+ "providerStates": [
12
+ {"name": "alligators exist", "params" : {}},
13
+ {"name": "the city of Tel Aviv has a zoo", "params" : {}},
14
+ {"name": "the zoo keeps record of its alligator population", "params" : {}}
15
+ ],
16
+ "params": {},
17
+ "request": {
18
+ "method": "get",
19
+ "path": "/alligators"
20
+ },
21
+ "response": {
22
+ "headers" : {"Content-Type": "application/json"},
23
+ "status" : 200,
24
+ "body" : {
25
+ "alligators": [{
26
+ "name": "Bob",
27
+ "phoneNumber" : {
28
+ "json_class": "Pact::Term",
29
+ "data": {
30
+ "generate": "12345678",
31
+ "matcher": {"json_class":"Regexp","o":0,"s":"\\d+"}
32
+ }
33
+ }
34
+ }]
35
+ }
36
+ }
37
+ }
38
+ ],
39
+ "metadata": {
40
+ "pactSpecification": {
41
+ "version": "3.0.0"
42
+ }
43
+ }
44
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.68.1
4
+ version: 2.69.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bethany Skurrie
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-10-25 00:00:00.000000000 Z
13
+ date: 2020-11-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -174,22 +174,16 @@ dependencies:
174
174
  name: pact-support
175
175
  requirement: !ruby/object:Gem::Requirement
176
176
  requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '1.14'
180
- - - ">="
177
+ - - '='
181
178
  - !ruby/object:Gem::Version
182
- version: 1.14.1
179
+ version: 1.15.0
183
180
  type: :runtime
184
181
  prerelease: false
185
182
  version_requirements: !ruby/object:Gem::Requirement
186
183
  requirements:
187
- - - "~>"
188
- - !ruby/object:Gem::Version
189
- version: '1.14'
190
- - - ">="
184
+ - - '='
191
185
  - !ruby/object:Gem::Version
192
- version: 1.14.1
186
+ version: 1.15.0
193
187
  - !ruby/object:Gem::Dependency
194
188
  name: padrino-core
195
189
  requirement: !ruby/object:Gem::Requirement
@@ -403,6 +397,7 @@ files:
403
397
  - db/ddl_statements/latest_pact_publications_by_consumer_versions.rb
404
398
  - db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb
405
399
  - db/ddl_statements/latest_triggered_webhooks.rb
400
+ - db/ddl_statements/latest_verification_ids_for_consumer_and_provider.rb
406
401
  - db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb
407
402
  - db/ddl_statements/latest_verification_ids_for_pact_versions.rb
408
403
  - db/migrations/000001_create_pacticipant_table.rb
@@ -523,6 +518,7 @@ files:
523
518
  - db/migrations/20201006_add_wip_to_verification.rb
524
519
  - db/migrations/20201023_create_verification_number_sequence.rb
525
520
  - db/migrations/20201024_create_version_order_sequence.rb
521
+ - db/migrations/20201026_update_latest_verification_ids_for_consumer_and_provider.rb
526
522
  - db/migrations/migration_helper.rb
527
523
  - db/test/backwards_compatibility/.rspec
528
524
  - db/test/backwards_compatibility/Appraisals
@@ -1357,6 +1353,7 @@ files:
1357
1353
  - spec/support/interaction_view_model_with_terms.json
1358
1354
  - spec/support/logging.rb
1359
1355
  - spec/support/markdown_pact.json
1356
+ - spec/support/markdown_pact_v3.json
1360
1357
  - spec/support/markdown_pact_with_html.json
1361
1358
  - spec/support/markdown_pact_with_markdown_chars_in_names.json
1362
1359
  - spec/support/metadata_test_server.rb
@@ -1751,6 +1748,7 @@ test_files:
1751
1748
  - spec/support/interaction_view_model_with_terms.json
1752
1749
  - spec/support/logging.rb
1753
1750
  - spec/support/markdown_pact.json
1751
+ - spec/support/markdown_pact_v3.json
1754
1752
  - spec/support/markdown_pact_with_html.json
1755
1753
  - spec/support/markdown_pact_with_markdown_chars_in_names.json
1756
1754
  - spec/support/metadata_test_server.rb