pact_broker 2.65.0 → 2.66.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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +14 -0
 - data/db/ddl_statements/latest_triggered_webhooks.rb +66 -0
 - data/db/migrations/20180119_update_latest_triggered_webhooks.rb +5 -39
 - data/db/migrations/20200930_update_latest_triggered_webhooks.rb +15 -0
 - data/db/migrations/migration_helper.rb +10 -2
 - data/lib/pact_broker/api/decorators/decorator_context.rb +2 -2
 - data/lib/pact_broker/api/decorators/pagination_links.rb +34 -0
 - data/lib/pact_broker/api/decorators/versions_decorator.rb +5 -1
 - data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
 - data/lib/pact_broker/api/resources/index.rb +1 -1
 - data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +11 -1
 - data/lib/pact_broker/api/resources/versions.rb +12 -1
 - data/lib/pact_broker/db/clean.rb +100 -43
 - data/lib/pact_broker/doc/views/pacticipant/versions.markdown +9 -0
 - data/lib/pact_broker/domain/pacticipant.rb +4 -0
 - data/lib/pact_broker/domain/tag.rb +2 -0
 - data/lib/pact_broker/domain/version.rb +1 -0
 - data/lib/pact_broker/feature_toggle.rb +8 -4
 - data/lib/pact_broker/matrix/service.rb +3 -0
 - data/lib/pact_broker/pacticipants/repository.rb +6 -5
 - data/lib/pact_broker/pacticipants/service.rb +5 -18
 - data/lib/pact_broker/pacts/latest_tagged_pact_publications.rb +15 -1
 - data/lib/pact_broker/tags/repository.rb +2 -5
 - data/lib/pact_broker/test/test_data_builder.rb +22 -2
 - data/lib/pact_broker/ui/views/matrix/show.haml +8 -0
 - data/lib/pact_broker/version.rb +1 -1
 - data/spec/features/get_versions_spec.rb +8 -0
 - data/spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb +14 -9
 - data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +10 -4
 - data/spec/lib/pact_broker/db/clean_spec.rb +72 -4
 - data/spec/lib/pact_broker/feature_toggle_spec.rb +9 -1
 - data/spec/lib/pact_broker/pacticipants/repository_spec.rb +8 -1
 - data/spec/lib/pact_broker/pacts/latest_tagged_pact_publications_spec.rb +99 -0
 - data/spec/lib/pact_broker/webhooks/repository_spec.rb +20 -0
 - metadata +8 -2
 
| 
         @@ -0,0 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Pacticipant versions
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Allowed methods: `GET`
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Path: `/pacticipants/{pacticipant}/versions`
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            A list of pacticipant versions in order from newest to oldest.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            To paginate, append `?pageNumber=x&pageSize=x` and follow the `next` relation until it is no longer present.
         
     | 
| 
         @@ -30,6 +30,10 @@ module PactBroker 
     | 
|
| 
       30 
30 
     | 
    
         
             
                  end
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                  def before_destroy
         
     | 
| 
      
 33 
     | 
    
         
            +
                    PactBroker::Pacts::PactPublication.where(provider: self).delete
         
     | 
| 
      
 34 
     | 
    
         
            +
                    PactBroker::Domain::Verification.where(consumer: self).or(provider: self).delete
         
     | 
| 
      
 35 
     | 
    
         
            +
                    PactBroker::Domain::Version.where(pacticipant: self).delete
         
     | 
| 
      
 36 
     | 
    
         
            +
                    PactBroker::Pacts::PactVersion.where(consumer: self).or(provider: self).delete
         
     | 
| 
       33 
37 
     | 
    
         
             
                    PactBroker::Domain::Label.where(pacticipant: self).destroy
         
     | 
| 
       34 
38 
     | 
    
         
             
                    super
         
     | 
| 
       35 
39 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -10,6 +10,8 @@ module PactBroker 
     | 
|
| 
       10 
10 
     | 
    
         
             
                    include PactBroker::Repositories::Helpers
         
     | 
| 
       11 
11 
     | 
    
         
             
                  end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
      
 13 
     | 
    
         
            +
                  plugin :insert_ignore, identifying_columns: [:name, :version_id]
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       13 
15 
     | 
    
         
             
                  unrestrict_primary_key
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
                  associate(:many_to_one, :version, :class => "PactBroker::Domain::Version", :key => :version_id, :primary_key => :id)
         
     | 
| 
         @@ -1,7 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module PactBroker
         
     | 
| 
       2 
2 
     | 
    
         
             
              class FeatureToggle
         
     | 
| 
       3 
     | 
    
         
            -
                def self.enabled?(feature)
         
     | 
| 
       4 
     | 
    
         
            -
                   
     | 
| 
      
 3 
     | 
    
         
            +
                def self.enabled?(feature, ignore_env)
         
     | 
| 
      
 4 
     | 
    
         
            +
                  if ignore_env
         
     | 
| 
      
 5 
     | 
    
         
            +
                    feature_in_env_var?(feature)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  else
         
     | 
| 
      
 7 
     | 
    
         
            +
                    not_production? || feature_in_env_var?(feature)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
       5 
9 
     | 
    
         
             
                end
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
                def self.not_production?
         
     | 
| 
         @@ -17,7 +21,7 @@ module PactBroker 
     | 
|
| 
       17 
21 
     | 
    
         
             
                end
         
     | 
| 
       18 
22 
     | 
    
         
             
              end
         
     | 
| 
       19 
23 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
              def self.feature_enabled?(feature)
         
     | 
| 
       21 
     | 
    
         
            -
                FeatureToggle.enabled?(feature)
         
     | 
| 
      
 24 
     | 
    
         
            +
              def self.feature_enabled?(feature, ignore_env = false)
         
     | 
| 
      
 25 
     | 
    
         
            +
                FeatureToggle.enabled?(feature, ignore_env)
         
     | 
| 
       22 
26 
     | 
    
         
             
              end
         
     | 
| 
       23 
27 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,3 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'pact_broker/logging'
         
     | 
| 
       1 
2 
     | 
    
         
             
            require 'pact_broker/repositories'
         
     | 
| 
       2 
3 
     | 
    
         
             
            require 'pact_broker/matrix/row'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'pact_broker/matrix/deployment_status_summary'
         
     | 
| 
         @@ -9,8 +10,10 @@ module PactBroker 
     | 
|
| 
       9 
10 
     | 
    
         
             
                  extend self
         
     | 
| 
       10 
11 
     | 
    
         
             
                  extend PactBroker::Repositories
         
     | 
| 
       11 
12 
     | 
    
         
             
                  extend PactBroker::Services
         
     | 
| 
      
 13 
     | 
    
         
            +
                  include PactBroker::Logging
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
                  def find selectors, options = {}
         
     | 
| 
      
 16 
     | 
    
         
            +
                    logger.info "Querying matrix", selectors: selectors, options: options
         
     | 
| 
       14 
17 
     | 
    
         
             
                    query_results = matrix_repository.find selectors, options
         
     | 
| 
       15 
18 
     | 
    
         
             
                    deployment_status_summary = DeploymentStatusSummary.new(query_results.rows, query_results.resolved_selectors, query_results.integrations)
         
     | 
| 
       16 
19 
     | 
    
         
             
                    QueryResultsWithDeploymentStatusSummary.new(query_results, deployment_status_summary)
         
     | 
| 
         @@ -8,6 +8,7 @@ module PactBroker 
     | 
|
| 
       8 
8 
     | 
    
         
             
                class Repository
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                  include PactBroker::Repositories::Helpers
         
     | 
| 
      
 11 
     | 
    
         
            +
                  include PactBroker::Repositories
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
13 
     | 
    
         
             
                  def find_by_name name
         
     | 
| 
       13 
14 
     | 
    
         
             
                    pacticipants = PactBroker::Domain::Pacticipant.where(name_like(:name, name)).all
         
     | 
| 
         @@ -35,11 +36,11 @@ module PactBroker 
     | 
|
| 
       35 
36 
     | 
    
         
             
                    query.order_ignore_case(Sequel[:pacticipants][:name]).eager(:labels).eager(:latest_version).all
         
     | 
| 
       36 
37 
     | 
    
         
             
                  end
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                  def find_all_pacticipant_versions_in_reverse_order name
         
     | 
| 
       39 
     | 
    
         
            -
                     
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
      
 39 
     | 
    
         
            +
                  def find_all_pacticipant_versions_in_reverse_order name, pagination_options = nil
         
     | 
| 
      
 40 
     | 
    
         
            +
                    pacticipant = pacticipant_repository.find_by_name!(name)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    query = PactBroker::Domain::Version.where(pacticipant: pacticipant).reverse_order(:order)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    query = query.paginate(pagination_options[:page_number], pagination_options[:page_size]) if pagination_options
         
     | 
| 
      
 43 
     | 
    
         
            +
                    query
         
     | 
| 
       43 
44 
     | 
    
         
             
                  end
         
     | 
| 
       44 
45 
     | 
    
         | 
| 
       45 
46 
     | 
    
         
             
                  def find_by_name_or_create name
         
     | 
| 
         @@ -52,8 +52,8 @@ module PactBroker 
     | 
|
| 
       52 
52 
     | 
    
         
             
                    pacticipant_repository.find options
         
     | 
| 
       53 
53 
     | 
    
         
             
                  end
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                  def self.find_all_pacticipant_versions_in_reverse_order name
         
     | 
| 
       56 
     | 
    
         
            -
                    pacticipant_repository.find_all_pacticipant_versions_in_reverse_order(name)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  def self.find_all_pacticipant_versions_in_reverse_order name, pagination_options = nil
         
     | 
| 
      
 56 
     | 
    
         
            +
                    pacticipant_repository.find_all_pacticipant_versions_in_reverse_order(name, pagination_options)
         
     | 
| 
       57 
57 
     | 
    
         
             
                  end
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
59 
     | 
    
         
             
                  def self.find_pacticipant_repository_url_by_pacticipant_name name
         
     | 
| 
         @@ -79,21 +79,8 @@ module PactBroker 
     | 
|
| 
       79 
79 
     | 
    
         | 
| 
       80 
80 
     | 
    
         
             
                  def self.delete name
         
     | 
| 
       81 
81 
     | 
    
         
             
                    pacticipant = find_pacticipant_by_name name
         
     | 
| 
       82 
     | 
    
         
            -
                     
     | 
| 
       83 
     | 
    
         
            -
                     
     | 
| 
       84 
     | 
    
         
            -
                    select_pacticipant = "select id from pacticipants where name = '#{name}'"
         
     | 
| 
       85 
     | 
    
         
            -
                    tag_repository.delete_by_version_id version_ids
         
     | 
| 
       86 
     | 
    
         
            -
                    webhook_service.delete_all_webhhook_related_objects_by_pacticipant pacticipant
         
     | 
| 
       87 
     | 
    
         
            -
                    pact_repository.delete_by_version_id version_ids
         
     | 
| 
       88 
     | 
    
         
            -
                    connection.run("delete from pact_publications where provider_id = #{pacticipant.id}")
         
     | 
| 
       89 
     | 
    
         
            -
                    connection.run("delete from verifications where pact_version_id IN (select id from pact_versions where provider_id = #{pacticipant.id})")
         
     | 
| 
       90 
     | 
    
         
            -
                    connection.run("delete from verifications where pact_version_id IN (select id from pact_versions where consumer_id = #{pacticipant.id})")
         
     | 
| 
       91 
     | 
    
         
            -
                    connection.run("delete from pact_versions where provider_id = #{pacticipant.id}")
         
     | 
| 
       92 
     | 
    
         
            -
                    connection.run("delete from pact_versions where consumer_id = #{pacticipant.id}")
         
     | 
| 
       93 
     | 
    
         
            -
                    connection.run("delete from versions where pacticipant_id = #{pacticipant.id}")
         
     | 
| 
       94 
     | 
    
         
            -
                    version_repository.delete_by_id version_ids
         
     | 
| 
       95 
     | 
    
         
            -
                    label_repository.delete_by_pacticipant_id(pacticipant.id)
         
     | 
| 
       96 
     | 
    
         
            -
                    connection.run("delete from pacticipants where id = #{pacticipant.id}")
         
     | 
| 
      
 82 
     | 
    
         
            +
                    webhook_service.delete_all_webhhook_related_objects_by_pacticipant(pacticipant)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    pacticipant.destroy
         
     | 
| 
       97 
84 
     | 
    
         
             
                  end
         
     | 
| 
       98 
85 
     | 
    
         | 
| 
       99 
86 
     | 
    
         
             
                  def self.delete_if_orphan(pacticipant)
         
     | 
| 
         @@ -105,4 +92,4 @@ module PactBroker 
     | 
|
| 
       105 
92 
     | 
    
         
             
                  end
         
     | 
| 
       106 
93 
     | 
    
         
             
                end
         
     | 
| 
       107 
94 
     | 
    
         
             
              end
         
     | 
| 
       108 
     | 
    
         
            -
            end
         
     | 
| 
      
 95 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -3,10 +3,24 @@ require 'pact_broker/pacts/head_pact' 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module PactBroker
         
     | 
| 
       5 
5 
     | 
    
         
             
              module Pacts
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
6 
     | 
    
         
             
                class LatestTaggedPactPublications < LatestPactPublicationsByConsumerVersion
         
     | 
| 
       8 
7 
     | 
    
         
             
                  set_dataset(:latest_tagged_pact_publications)
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
                  dataset_module do
         
     | 
| 
      
 10 
     | 
    
         
            +
                    def where_age_less_than(days)
         
     | 
| 
      
 11 
     | 
    
         
            +
                      start_date = Date.today - days
         
     | 
| 
      
 12 
     | 
    
         
            +
                      where{ latest_tagged_pact_publications[:created_at] >= start_date }
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    def for_selector(selector)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      query = self
         
     | 
| 
      
 17 
     | 
    
         
            +
                      query = query.where(consumer_name: selector.pacticipant_name) if selector.pacticipant_name
         
     | 
| 
      
 18 
     | 
    
         
            +
                      query = query.where(tag_name: selector.tag) if selector.tag && selector.tag.is_a?(String)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      query = query.where_age_less_than(selector.max_age) if selector.max_age
         
     | 
| 
      
 20 
     | 
    
         
            +
                      query
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       10 
24 
     | 
    
         
             
                  def to_domain
         
     | 
| 
       11 
25 
     | 
    
         
             
                    HeadPact.new(super, consumer_version_number, tag_name)
         
     | 
| 
       12 
26 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -10,12 +10,9 @@ module PactBroker 
     | 
|
| 
       10 
10 
     | 
    
         
             
                  def create args
         
     | 
| 
       11 
11 
     | 
    
         
             
                    params = {
         
     | 
| 
       12 
12 
     | 
    
         
             
                      name: args.fetch(:name),
         
     | 
| 
       13 
     | 
    
         
            -
                      version_id: args.fetch(:version).id 
     | 
| 
       14 
     | 
    
         
            -
                      created_at: Sequel.datetime_class.now,
         
     | 
| 
       15 
     | 
    
         
            -
                      updated_at: Sequel.datetime_class.now
         
     | 
| 
      
 13 
     | 
    
         
            +
                      version_id: args.fetch(:version).id
         
     | 
| 
       16 
14 
     | 
    
         
             
                    }
         
     | 
| 
       17 
     | 
    
         
            -
                    Domain::Tag. 
     | 
| 
       18 
     | 
    
         
            -
                    Domain::Tag.find(name: args[:name], version_id: args[:version].id)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Domain::Tag.new(params).insert_ignore
         
     | 
| 
       19 
16 
     | 
    
         
             
                  end
         
     | 
| 
       20 
17 
     | 
    
         | 
| 
       21 
18 
     | 
    
         
             
                  def find args
         
     | 
| 
         @@ -293,8 +293,9 @@ module PactBroker 
     | 
|
| 
       293 
293 
     | 
    
         
             
                  def create_triggered_webhook params = {}
         
     | 
| 
       294 
294 
     | 
    
         
             
                    params.delete(:comment)
         
     | 
| 
       295 
295 
     | 
    
         
             
                    trigger_uuid = params[:trigger_uuid] || webhook_service.next_uuid
         
     | 
| 
      
 296 
     | 
    
         
            +
                    event_name = params.key?(:event_name) ? params[:event_name] : @webhook.events.first.name # could be nil, for backwards compatibility
         
     | 
| 
       296 
297 
     | 
    
         
             
                    verification = @webhook.trigger_on_provider_verification_published? ? @verification : nil
         
     | 
| 
       297 
     | 
    
         
            -
                    @triggered_webhook = webhook_repository.create_triggered_webhook trigger_uuid, @webhook, @pact, verification, PactBroker::Webhooks::Service::RESOURCE_CREATION,  
     | 
| 
      
 298 
     | 
    
         
            +
                    @triggered_webhook = webhook_repository.create_triggered_webhook trigger_uuid, @webhook, @pact, verification, PactBroker::Webhooks::Service::RESOURCE_CREATION, event_name
         
     | 
| 
       298 
299 
     | 
    
         
             
                    @triggered_webhook.update(status: params[:status]) if params[:status]
         
     | 
| 
       299 
300 
     | 
    
         
             
                    set_created_at_if_set params[:created_at], :triggered_webhooks, {id: @triggered_webhook.id}
         
     | 
| 
       300 
301 
     | 
    
         
             
                    self
         
     | 
| 
         @@ -329,7 +330,7 @@ module PactBroker 
     | 
|
| 
       329 
330 
     | 
    
         | 
| 
       330 
331 
     | 
    
         
             
                    if tag_names.any?
         
     | 
| 
       331 
332 
     | 
    
         
             
                      tag_names.each do | tag_name |
         
     | 
| 
       332 
     | 
    
         
            -
                        PactBroker::Domain::Tag. 
     | 
| 
      
 333 
     | 
    
         
            +
                        PactBroker::Domain::Tag.new(name: tag_name, version: @provider_version).insert_ignore
         
     | 
| 
       333 
334 
     | 
    
         
             
                        set_created_at_if_set(parameters[:created_at], :tags, version_id: @provider_version.id, name: tag_name)
         
     | 
| 
       334 
335 
     | 
    
         
             
                      end
         
     | 
| 
       335 
336 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -407,6 +408,25 @@ module PactBroker 
     | 
|
| 
       407 
408 
     | 
    
         
             
                    end
         
     | 
| 
       408 
409 
     | 
    
         
             
                  end
         
     | 
| 
       409 
410 
     | 
    
         | 
| 
      
 411 
     | 
    
         
            +
                  def random_json_content(consumer_name, provider_name)
         
     | 
| 
      
 412 
     | 
    
         
            +
                    {
         
     | 
| 
      
 413 
     | 
    
         
            +
                      "consumer" => {
         
     | 
| 
      
 414 
     | 
    
         
            +
                         "name" => consumer_name
         
     | 
| 
      
 415 
     | 
    
         
            +
                       },
         
     | 
| 
      
 416 
     | 
    
         
            +
                       "provider" => {
         
     | 
| 
      
 417 
     | 
    
         
            +
                         "name" => provider_name
         
     | 
| 
      
 418 
     | 
    
         
            +
                       },
         
     | 
| 
      
 419 
     | 
    
         
            +
                       "interactions" => [{
         
     | 
| 
      
 420 
     | 
    
         
            +
                          "request" => {
         
     | 
| 
      
 421 
     | 
    
         
            +
                            "method" => "GET",
         
     | 
| 
      
 422 
     | 
    
         
            +
                            "path" => "/things/#{rand}"
         
     | 
| 
      
 423 
     | 
    
         
            +
                          },
         
     | 
| 
      
 424 
     | 
    
         
            +
                          "response" => {
         
     | 
| 
      
 425 
     | 
    
         
            +
                            "status" => 200
         
     | 
| 
      
 426 
     | 
    
         
            +
                          }
         
     | 
| 
      
 427 
     | 
    
         
            +
                       }],
         
     | 
| 
      
 428 
     | 
    
         
            +
                     }.to_json
         
     | 
| 
      
 429 
     | 
    
         
            +
                  end
         
     | 
| 
       410 
430 
     | 
    
         | 
| 
       411 
431 
     | 
    
         
             
                  private
         
     | 
| 
       412 
432 
     | 
    
         | 
| 
         @@ -51,6 +51,14 @@ 
     | 
|
| 
       51 
51 
     | 
    
         
             
                        %input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
       53 
53 
     | 
    
         | 
| 
      
 54 
     | 
    
         
            +
                  - if options.latest || options.tag
         
     | 
| 
      
 55 
     | 
    
         
            +
                    .selector
         
     | 
| 
      
 56 
     | 
    
         
            +
                      %label{for: 'to'}
         
     | 
| 
      
 57 
     | 
    
         
            +
                        = options.latest ? 'To' : 'With all'
         
     | 
| 
      
 58 
     | 
    
         
            +
                      %input{name: 'tag', id: 'to', value: options.tag }
         
     | 
| 
      
 59 
     | 
    
         
            +
                      %input{name: 'latest', value: options.latest.to_s, hidden: true}
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
       54 
62 
     | 
    
         
             
                  %div.top-of-group
         
     | 
| 
       55 
63 
     | 
    
         
             
                    .input-group
         
     | 
| 
       56 
64 
     | 
    
         
             
                      %input{type: 'radio', name: "latestby", class: '', value: '', id: 'all_rows', checked: options.all_rows_checked}
         
     | 
    
        data/lib/pact_broker/version.rb
    CHANGED
    
    
| 
         @@ -21,6 +21,14 @@ describe "Get versions" do 
     | 
|
| 
       21 
21 
     | 
    
         
             
                it "returns a list of links to the versions" do
         
     | 
| 
       22 
22 
     | 
    
         
             
                  expect(last_response_body[:_links][:"versions"].size).to eq 2
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                context "with pagination options" do
         
     | 
| 
      
 26 
     | 
    
         
            +
                  subject { get(path, { 'pageSize' => '1', 'pageNumber' => '1' }) }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  it "paginates the response" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                    expect(last_response_body[:_links][:"versions"].size).to eq 1
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
       24 
32 
     | 
    
         
             
              end
         
     | 
| 
       25 
33 
     | 
    
         | 
| 
       26 
34 
     | 
    
         
             
              context "when the pacticipant does not exist" do
         
     | 
| 
         @@ -3,32 +3,38 @@ require 'pact_broker/api/decorators/versions_decorator' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'pact_broker/domain/version'
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module PactBroker
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
6 
     | 
    
         
             
              module Api
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
7 
     | 
    
         
             
                module Decorators
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
8 
     | 
    
         
             
                  describe VersionsDecorator do
         
     | 
| 
       12 
9 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                    let(:options) { {base_url: 'http://example.org', pacticipant_name: "Consumer" }}
         
     | 
| 
      
 10 
     | 
    
         
            +
                    let(:options) { { resource_url: 'http://versions', base_url: 'http://example.org', pacticipant_name: "Consumer", query_string: query_string}}
         
     | 
| 
      
 11 
     | 
    
         
            +
                    let(:query_string) { nil }
         
     | 
| 
      
 12 
     | 
    
         
            +
                    let(:versions) { [] }
         
     | 
| 
       14 
13 
     | 
    
         | 
| 
       15 
14 
     | 
    
         
             
                    subject { JSON.parse VersionsDecorator.new(versions).to_json(user_options: options), symbolize_names: true }
         
     | 
| 
       16 
15 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                    context "with no  
     | 
| 
       18 
     | 
    
         
            -
                       
     | 
| 
      
 16 
     | 
    
         
            +
                    context "with no query string" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                      its([:_links, :self, :href]) { is_expected.to eq 'http://versions' }
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
      
 20 
     | 
    
         
            +
                    context "with a query string" do
         
     | 
| 
      
 21 
     | 
    
         
            +
                      let(:query_string) { 'foo=bar' }
         
     | 
| 
      
 22 
     | 
    
         
            +
                      its([:_links, :self, :href]) { is_expected.to eq 'http://versions?foo=bar' }
         
     | 
| 
      
 23 
     | 
    
         
            +
                    end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    context "with no versions" do
         
     | 
| 
       20 
26 
     | 
    
         
             
                      it "doesn't blow up" do
         
     | 
| 
       21 
27 
     | 
    
         
             
                        subject
         
     | 
| 
       22 
28 
     | 
    
         
             
                      end
         
     | 
| 
       23 
29 
     | 
    
         
             
                    end
         
     | 
| 
       24 
30 
     | 
    
         | 
| 
       25 
31 
     | 
    
         
             
                    context "with versions" do
         
     | 
| 
       26 
     | 
    
         
            -
                      let(:version) do
         
     | 
| 
      
 32 
     | 
    
         
            +
                      let!(:version) do
         
     | 
| 
       27 
33 
     | 
    
         
             
                        TestDataBuilder.new
         
     | 
| 
       28 
34 
     | 
    
         
             
                          .create_consumer("Consumer")
         
     | 
| 
       29 
35 
     | 
    
         
             
                          .create_consumer_version("1.2.3")
         
     | 
| 
       30 
36 
     | 
    
         
             
                          .create_consumer_version_tag("prod")
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
                          .and_return(:consumer_version)
         
     | 
| 
       32 
38 
     | 
    
         
             
                      end
         
     | 
| 
       33 
39 
     | 
    
         
             
                      let(:versions) { [version] }
         
     | 
| 
       34 
40 
     | 
    
         | 
| 
         @@ -37,7 +43,6 @@ module PactBroker 
     | 
|
| 
       37 
43 
     | 
    
         
             
                        expect(subject[:_embedded][:versions].size).to eq 1
         
     | 
| 
       38 
44 
     | 
    
         
             
                      end
         
     | 
| 
       39 
45 
     | 
    
         
             
                    end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
46 
     | 
    
         
             
                  end
         
     | 
| 
       42 
47 
     | 
    
         
             
                end
         
     | 
| 
       43 
48 
     | 
    
         
             
              end
         
     | 
| 
         @@ -5,11 +5,11 @@ module PactBroker 
     | 
|
| 
       5 
5 
     | 
    
         
             
                module Resources
         
     | 
| 
       6 
6 
     | 
    
         
             
                  describe DefaultBaseResource do
         
     | 
| 
       7 
7 
     | 
    
         
             
                    let(:request) { double('request', body: body, uri: uri, base_uri: URI("http://example.org/"), env: env).as_null_object }
         
     | 
| 
       8 
     | 
    
         
            -
                    let(:response) { double('response') }
         
     | 
| 
      
 8 
     | 
    
         
            +
                    let(:response) { double('response').as_null_object }
         
     | 
| 
       9 
9 
     | 
    
         
             
                    let(:uri) { URI('http://example.org/path?query') }
         
     | 
| 
       10 
10 
     | 
    
         
             
                    let(:body) { double('body', to_s: body_string) }
         
     | 
| 
       11 
11 
     | 
    
         
             
                    let(:body_string) { '' }
         
     | 
| 
       12 
     | 
    
         
            -
                    let(:env) { double('env') }
         
     | 
| 
      
 12 
     | 
    
         
            +
                    let(:env) { double('env').as_null_object }
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                    subject { BaseResource.new(request, response) }
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
         @@ -100,6 +100,10 @@ module PactBroker 
     | 
|
| 
       100 
100 
     | 
    
         
             
                    end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
102 
     | 
    
         
             
                    describe "decorator_options" do
         
     | 
| 
      
 103 
     | 
    
         
            +
                      before do
         
     | 
| 
      
 104 
     | 
    
         
            +
                        allow(env).to receive(:[]).with("QUERY_STRING").and_return("foo=bar")
         
     | 
| 
      
 105 
     | 
    
         
            +
                      end
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
       103 
107 
     | 
    
         
             
                      context "with no overrides" do
         
     | 
| 
       104 
108 
     | 
    
         
             
                        it "returns the default decorator options" do
         
     | 
| 
       105 
109 
     | 
    
         
             
                          expect(subject.decorator_options).to eq(
         
     | 
| 
         @@ -107,7 +111,8 @@ module PactBroker 
     | 
|
| 
       107 
111 
     | 
    
         
             
                              base_url: "http://example.org",
         
     | 
| 
       108 
112 
     | 
    
         
             
                              resource_url: "http://example.org/path",
         
     | 
| 
       109 
113 
     | 
    
         
             
                              env: env,
         
     | 
| 
       110 
     | 
    
         
            -
                              resource_title: nil
         
     | 
| 
      
 114 
     | 
    
         
            +
                              resource_title: nil,
         
     | 
| 
      
 115 
     | 
    
         
            +
                              query_string: "foo=bar"
         
     | 
| 
       111 
116 
     | 
    
         
             
                            }
         
     | 
| 
       112 
117 
     | 
    
         
             
                          )
         
     | 
| 
       113 
118 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -121,7 +126,8 @@ module PactBroker 
     | 
|
| 
       121 
126 
     | 
    
         
             
                              resource_url: "http://example.org/path",
         
     | 
| 
       122 
127 
     | 
    
         
             
                              env: env,
         
     | 
| 
       123 
128 
     | 
    
         
             
                              resource_title: "foo",
         
     | 
| 
       124 
     | 
    
         
            -
                              something: "else"
         
     | 
| 
      
 129 
     | 
    
         
            +
                              something: "else",
         
     | 
| 
      
 130 
     | 
    
         
            +
                              query_string: "foo=bar"
         
     | 
| 
       125 
131 
     | 
    
         
             
                            }
         
     | 
| 
       126 
132 
     | 
    
         
             
                          )
         
     | 
| 
       127 
133 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -7,6 +7,11 @@ module PactBroker 
     | 
|
| 
       7 
7 
     | 
    
         
             
              module DB
         
     | 
| 
       8 
8 
     | 
    
         
             
                # Inner queries don't work on MySQL. Seriously, MySQL???
         
     | 
| 
       9 
9 
     | 
    
         
             
                describe Clean, pending: IS_MYSQL  do
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def pact_publication_count_for(consumer_name, version_number)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    PactBroker::Pacts::PactPublication.where(consumer_version: PactBroker::Domain::Version.where_pacticipant_name(consumer_name).where(number: version_number)).count
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       10 
15 
     | 
    
         
             
                  let(:options) { {} }
         
     | 
| 
       11 
16 
     | 
    
         
             
                  let(:db) { PactBroker::DB.connection }
         
     | 
| 
       12 
17 
     | 
    
         | 
| 
         @@ -47,6 +52,66 @@ module PactBroker 
     | 
|
| 
       47 
52 
     | 
    
         
             
                      end
         
     | 
| 
       48 
53 
     | 
    
         
             
                    end
         
     | 
| 
       49 
54 
     | 
    
         | 
| 
      
 55 
     | 
    
         
            +
                    context "when the latest pact for a tag does not belong to the latest version for a tag" do
         
     | 
| 
      
 56 
     | 
    
         
            +
                      before do
         
     | 
| 
      
 57 
     | 
    
         
            +
                        td.create_pact_with_hierarchy("Foo", "1", "Bar").comment("delete, not latest pact for dev")
         
     | 
| 
      
 58 
     | 
    
         
            +
                          .create_consumer_version_tag("dev")
         
     | 
| 
      
 59 
     | 
    
         
            +
                          .create_pact_with_hierarchy("Foo", "2", "Bar").comment("keep, latest pact for dev")
         
     | 
| 
      
 60 
     | 
    
         
            +
                          .create_consumer_version_tag("dev")
         
     | 
| 
      
 61 
     | 
    
         
            +
                          .create_consumer_version("3").comment("keep, latest version for dev")
         
     | 
| 
      
 62 
     | 
    
         
            +
                          .create_consumer_version_tag("dev")
         
     | 
| 
      
 63 
     | 
    
         
            +
                      end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                      it "deletes the not-latest pact" do
         
     | 
| 
      
 66 
     | 
    
         
            +
                        expect { subject }.to change { pact_publication_count_for("Foo", "1") }.by(-1)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                      it "does not delete the pact latest" do
         
     | 
| 
      
 70 
     | 
    
         
            +
                        expect { subject }.to_not change { pact_publication_count_for("Foo", "2") }
         
     | 
| 
      
 71 
     | 
    
         
            +
                      end
         
     | 
| 
      
 72 
     | 
    
         
            +
                    end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    context "when a verification for the latest tagged version belongs to a pact that is not the latest tagged version" do
         
     | 
| 
      
 75 
     | 
    
         
            +
                      before do
         
     | 
| 
      
 76 
     | 
    
         
            +
                        td.create_pact_with_hierarchy("Foo", "1", "Bar", td.random_json_content("Foo", "Bar"))
         
     | 
| 
      
 77 
     | 
    
         
            +
                          .create_consumer_version_tag("dev").comment("delete, not latest, not verified by latest Bar")
         
     | 
| 
      
 78 
     | 
    
         
            +
                          .create_verification(provider_version: "3", tag_names: "dev").comment("delete, not latest")
         
     | 
| 
      
 79 
     | 
    
         
            +
                          .create_pact_with_hierarchy("Foo", "2", "Bar", td.random_json_content("Foo", "Bar"))
         
     | 
| 
      
 80 
     | 
    
         
            +
                          .create_consumer_version_tag("dev").comment("can't delete because it is verified by the latest dev version of the provider")
         
     | 
| 
      
 81 
     | 
    
         
            +
                          .create_verification(provider_version: "4", tag_names: "dev").comment("keep")
         
     | 
| 
      
 82 
     | 
    
         
            +
                          .create_pact_with_hierarchy("Foo", "3", "Bar", td.random_json_content("Foo", "Bar"))
         
     | 
| 
      
 83 
     | 
    
         
            +
                          .create_consumer_version_tag("dev").comment("keep")
         
     | 
| 
      
 84 
     | 
    
         
            +
                      end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                      let(:options) { { keep: [latest_dev_selector] } }
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                      it "does not delete the latest verification" do
         
     | 
| 
      
 89 
     | 
    
         
            +
                        expect{ subject }.to_not change {
         
     | 
| 
      
 90 
     | 
    
         
            +
                          PactBroker::Domain::Verification.where(provider_version: PactBroker::Domain::Version.where_pacticipant_name("Bar").where(number: "4")).count
         
     | 
| 
      
 91 
     | 
    
         
            +
                        }
         
     | 
| 
      
 92 
     | 
    
         
            +
                      end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                      it "deletes the non-latest verification" do
         
     | 
| 
      
 95 
     | 
    
         
            +
                        expect{ subject }.to change {
         
     | 
| 
      
 96 
     | 
    
         
            +
                          PactBroker::Domain::Verification.where(provider_version: PactBroker::Domain::Version.where_pacticipant_name("Bar").where(number: "3")).count
         
     | 
| 
      
 97 
     | 
    
         
            +
                        }.by(-1)
         
     | 
| 
      
 98 
     | 
    
         
            +
                      end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 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 
     | 
    
         
            +
                      it "deletes the pact publication that does not belongs to the latest verification" do
         
     | 
| 
      
 107 
     | 
    
         
            +
                        expect{ subject }.to change {
         
     | 
| 
      
 108 
     | 
    
         
            +
                          PactBroker::Pacts::PactPublication.where(consumer_version: PactBroker::Domain::Version.where_pacticipant_name("Foo").where(number: "1")).count
         
     | 
| 
      
 109 
     | 
    
         
            +
                        }.by(-1)
         
     | 
| 
      
 110 
     | 
    
         
            +
                      end
         
     | 
| 
      
 111 
     | 
    
         
            +
                    end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
       50 
115 
     | 
    
         
             
                    context "with orphan pact versions" do
         
     | 
| 
       51 
116 
     | 
    
         
             
                      before do
         
     | 
| 
       52 
117 
     | 
    
         
             
                        # Create a pact that will not be deleted
         
     | 
| 
         @@ -69,20 +134,23 @@ module PactBroker 
     | 
|
| 
       69 
134 
     | 
    
         
             
                      end
         
     | 
| 
       70 
135 
     | 
    
         
             
                    end
         
     | 
| 
       71 
136 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                    context "with triggered and executed" do
         
     | 
| 
      
 137 
     | 
    
         
            +
                    context "with triggered and executed webhooks" do
         
     | 
| 
       73 
138 
     | 
    
         
             
                      before do
         
     | 
| 
       74 
139 
     | 
    
         
             
                        td.create_pact_with_hierarchy("Foo", "1", "Bar")
         
     | 
| 
       75 
     | 
    
         
            -
                          .create_consumer_version_tag("dev").comment(" 
     | 
| 
      
 140 
     | 
    
         
            +
                          .create_consumer_version_tag("dev").comment("delete")
         
     | 
| 
       76 
141 
     | 
    
         
             
                          .create_webhook
         
     | 
| 
       77 
142 
     | 
    
         
             
                          .create_triggered_webhook
         
     | 
| 
       78 
143 
     | 
    
         
             
                          .create_webhook_execution
         
     | 
| 
       79 
144 
     | 
    
         
             
                          .add_day
         
     | 
| 
      
 145 
     | 
    
         
            +
                          .create_pact_with_hierarchy("Foo", "2", "Bar")
         
     | 
| 
      
 146 
     | 
    
         
            +
                          .create_consumer_version_tag("dev").comment("keep")
         
     | 
| 
      
 147 
     | 
    
         
            +
                          .create_webhook
         
     | 
| 
       80 
148 
     | 
    
         
             
                          .create_triggered_webhook
         
     | 
| 
       81 
149 
     | 
    
         
             
                          .create_webhook_execution
         
     | 
| 
       82 
150 
     | 
    
         
             
                      end
         
     | 
| 
       83 
151 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
                       
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
      
 152 
     | 
    
         
            +
                      it "deletes the ones associated with the deleted pacts" do
         
     | 
| 
      
 153 
     | 
    
         
            +
                        expect { subject }.to change { PactBroker::Webhooks::TriggeredWebhook.count }.by(-1)
         
     | 
| 
       86 
154 
     | 
    
         
             
                      end
         
     | 
| 
       87 
155 
     | 
    
         
             
                    end
         
     | 
| 
       88 
156 
     | 
    
         
             
                  end
         
     |