pact_broker 2.29.0 → 2.30.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 +23 -0
 - data/lib/pact_broker/api/resources/pact_versions.rb +5 -1
 - data/lib/pact_broker/app.rb +3 -1
 - data/lib/pact_broker/configuration.rb +2 -1
 - data/lib/pact_broker/doc/views/consumer.markdown +1 -1
 - data/lib/pact_broker/doc/views/pact/all-pact-versions.markdown +10 -0
 - data/lib/pact_broker/pacts/repository.rb +8 -0
 - data/lib/pact_broker/pacts/service.rb +5 -11
 - data/lib/pact_broker/ui/view_models/index_items.rb +4 -0
 - data/lib/pact_broker/ui/views/index/_getting-started.haml +6 -0
 - data/lib/pact_broker/ui/views/index/show-with-tags.haml +2 -0
 - data/lib/pact_broker/ui/views/index/show.haml +2 -0
 - data/lib/pact_broker/version.rb +1 -1
 - data/lib/pact_broker/webhooks/webhook_event.rb +6 -1
 - data/lib/rack/pact_broker/accepts_html_filter.rb +7 -7
 - data/lib/rack/pact_broker/convert_404_to_hal.rb +1 -1
 - data/public/stylesheets/index.css +5 -0
 - data/spec/features/delete_pact_versions_spec.rb +29 -0
 - data/spec/lib/pact_broker/pacts/service_spec.rb +51 -2
 - data/spec/support/logging.rb +1 -0
 - data/spec/support/shared_context.rb +17 -0
 - metadata +6 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: '081cc254335adf8cdabb9bfbc1819c8bf23bb292'
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c02b5d34019e3f645df1a47bdc271f0cb0f32919
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: a58feed7d9ff5c59f84387cd8e5293fbdd480d11ce6ca6f7ee0a12bc86fba8c2d127f1a7135efb4cabb8bbdabae2a44bc9ed5ebf31125def2a810806a3a822ec
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 613811b6f2f348e0a18ea825e995b6a33fcf72ca50f66065c84a8de88eb9e20d308a776d4d4eef9c641c0b98870dca36df3391990272fd00b86b6a0ba2831ff0
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,3 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <a name="v2.30.0"></a>
         
     | 
| 
      
 2 
     | 
    
         
            +
            ### v2.30.0 (2019-03-29)
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            #### Features
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            * add helper text on index page for getting started	 ([cdeb2cd9](/../../commit/cdeb2cd9))
         
     | 
| 
      
 8 
     | 
    
         
            +
            * allow rack protection to be turned off so that the headers can be managed in nginx	 ([941371ec](/../../commit/941371ec))
         
     | 
| 
      
 9 
     | 
    
         
            +
            * allow all pacts between a given consumer and provider to be deleted at once	 ([9f1ce9c3](/../../commit/9f1ce9c3))
         
     | 
| 
      
 10 
     | 
    
         
            +
            * correctly identify javascript and css content types	 ([6470d199](/../../commit/6470d199))
         
     | 
| 
      
 11 
     | 
    
         
            +
            * add .css and .js file extensions to middleware that sets the accept header	 ([eb1cd323](/../../commit/eb1cd323))
         
     | 
| 
      
 12 
     | 
    
         
            +
            * add helper text on index page for getting started	 ([222d8965](/../../commit/222d8965))
         
     | 
| 
      
 13 
     | 
    
         
            +
            * allow rack protection to be turned off so that the headers can be managed in nginx	 ([b43e60ee](/../../commit/b43e60ee))
         
     | 
| 
      
 14 
     | 
    
         
            +
            * allow all pacts between a given consumer and provider to be deleted at once	 ([0c8106b6](/../../commit/0c8106b6))
         
     | 
| 
      
 15 
     | 
    
         
            +
            * correctly identify javascript and css content types	 ([03e156cb](/../../commit/03e156cb))
         
     | 
| 
      
 16 
     | 
    
         
            +
            * add .css and .js file extensions to middleware that sets the accept header	 ([2aa533dc](/../../commit/2aa533dc))
         
     | 
| 
      
 17 
     | 
    
         
            +
            * add a new webhook event for contract_published	 ([2e2a2034](/../../commit/2e2a2034))
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            * **matrix**
         
     | 
| 
      
 20 
     | 
    
         
            +
              * improve reasons in response when pacticipant cannot be deployed	 ([85e11616](/../../commit/85e11616))
         
     | 
| 
      
 21 
     | 
    
         
            +
              * allow provider to be deployed to an environment without the consumer having to be deployed there already	 ([125c2722](/../../commit/125c2722))
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       1 
24 
     | 
    
         
             
            <a name="v2.29.0"></a>
         
     | 
| 
       2 
25 
     | 
    
         
             
            ### v2.29.0 (2019-03-15)
         
     | 
| 
       3 
26 
     | 
    
         | 
| 
         @@ -13,7 +13,7 @@ module PactBroker 
     | 
|
| 
       13 
13 
     | 
    
         
             
                    end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                    def allowed_methods
         
     | 
| 
       16 
     | 
    
         
            -
                      ["GET", "OPTIONS"]
         
     | 
| 
      
 16 
     | 
    
         
            +
                      ["GET", "DELETE", "OPTIONS"]
         
     | 
| 
       17 
17 
     | 
    
         
             
                    end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                    def resource_exists?
         
     | 
| 
         @@ -29,6 +29,10 @@ module PactBroker 
     | 
|
| 
       29 
29 
     | 
    
         
             
                      pact_service.find_all_pact_versions_between consumer_name, :and => provider_name
         
     | 
| 
       30 
30 
     | 
    
         
             
                    end
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
      
 32 
     | 
    
         
            +
                    def delete_resource
         
     | 
| 
      
 33 
     | 
    
         
            +
                      pact_service.delete_all_pact_versions_between(consumer_name, and: provider_name)
         
     | 
| 
      
 34 
     | 
    
         
            +
                      true
         
     | 
| 
      
 35 
     | 
    
         
            +
                    end
         
     | 
| 
       32 
36 
     | 
    
         
             
                  end
         
     | 
| 
       33 
37 
     | 
    
         
             
                end
         
     | 
| 
       34 
38 
     | 
    
         
             
              end
         
     | 
    
        data/lib/pact_broker/app.rb
    CHANGED
    
    | 
         @@ -118,7 +118,9 @@ module PactBroker 
     | 
|
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                def configure_middleware
         
     | 
| 
       120 
120 
     | 
    
         
             
                  # NOTE THAT NONE OF THIS IS PROTECTED BY AUTH - is that ok?
         
     | 
| 
       121 
     | 
    
         
            -
                   
     | 
| 
      
 121 
     | 
    
         
            +
                  if configuration.use_rack_protection
         
     | 
| 
      
 122 
     | 
    
         
            +
                    @app_builder.use Rack::Protection, except: [:path_traversal, :remote_token, :session_hijacking, :http_origin]
         
     | 
| 
      
 123 
     | 
    
         
            +
                  end
         
     | 
| 
       122 
124 
     | 
    
         
             
                  @app_builder.use Rack::PactBroker::InvalidUriProtection
         
     | 
| 
       123 
125 
     | 
    
         
             
                  @app_builder.use Rack::PactBroker::StoreBaseURL
         
     | 
| 
       124 
126 
     | 
    
         
             
                  @app_builder.use Rack::PactBroker::AddPactBrokerVersionHeader
         
     | 
| 
         @@ -32,7 +32,7 @@ module PactBroker 
     | 
|
| 
       32 
32 
     | 
    
         
             
                  :base_equality_only_on_content_that_affects_verification_results
         
     | 
| 
       33 
33 
     | 
    
         
             
                ]
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                attr_accessor :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :use_hal_browser, :html_pact_renderer
         
     | 
| 
      
 35 
     | 
    
         
            +
                attr_accessor :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :use_hal_browser, :html_pact_renderer, :use_rack_protection
         
     | 
| 
       36 
36 
     | 
    
         
             
                attr_accessor :validate_database_connection_config, :enable_diagnostic_endpoints, :version_parser, :sha_generator
         
     | 
| 
       37 
37 
     | 
    
         
             
                attr_accessor :use_case_sensitive_resource_names, :order_versions_by_date
         
     | 
| 
       38 
38 
     | 
    
         
             
                attr_accessor :check_for_potential_duplicate_pacticipant_names
         
     | 
| 
         @@ -62,6 +62,7 @@ module PactBroker 
     | 
|
| 
       62 
62 
     | 
    
         
             
                  config.log_dir = File.expand_path("./log")
         
     | 
| 
       63 
63 
     | 
    
         
             
                  config.auto_migrate_db = true
         
     | 
| 
       64 
64 
     | 
    
         
             
                  config.auto_migrate_db_data = true
         
     | 
| 
      
 65 
     | 
    
         
            +
                  config.use_rack_protection = true
         
     | 
| 
       65 
66 
     | 
    
         
             
                  config.use_hal_browser = true
         
     | 
| 
       66 
67 
     | 
    
         
             
                  config.validate_database_connection_config = true
         
     | 
| 
       67 
68 
     | 
    
         
             
                  config.enable_diagnostic_endpoints = true
         
     | 
| 
         @@ -0,0 +1,10 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # All versions of a pact between a given consumer and provider
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Allowed methods: `GET`, `DELETE`
         
     | 
| 
      
 4 
     | 
    
         
            +
            Path: `/pacts/provider/{provider}/consumer/{consumer}/versions`
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            This resource returns a history of all the versions of the given pact between a consumer and provider.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            ## Deleting pacts
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            Sending a `DELETE` to this resource will delete all the pacts between the specified applications.
         
     | 
| 
         @@ -234,6 +234,14 @@ module PactBroker 
     | 
|
| 
       234 
234 
     | 
    
         
             
                    end
         
     | 
| 
       235 
235 
     | 
    
         
             
                  end
         
     | 
| 
       236 
236 
     | 
    
         | 
| 
      
 237 
     | 
    
         
            +
                  def find_previous_pacts pact
         
     | 
| 
      
 238 
     | 
    
         
            +
                    if pact.consumer_version_tag_names.any?
         
     | 
| 
      
 239 
     | 
    
         
            +
                      pact.consumer_version_tag_names.map { |tag| find_previous_pact(pact, tag) }
         
     | 
| 
      
 240 
     | 
    
         
            +
                    else
         
     | 
| 
      
 241 
     | 
    
         
            +
                      [find_previous_pact(pact, :untagged)]
         
     | 
| 
      
 242 
     | 
    
         
            +
                    end
         
     | 
| 
      
 243 
     | 
    
         
            +
                  end
         
     | 
| 
      
 244 
     | 
    
         
            +
             
     | 
| 
       237 
245 
     | 
    
         
             
                  private
         
     | 
| 
       238 
246 
     | 
    
         | 
| 
       239 
247 
     | 
    
         
             
                  def find_previous_distinct_pact_by_sha pact
         
     | 
| 
         @@ -108,7 +108,7 @@ module PactBroker 
     | 
|
| 
       108 
108 
     | 
    
         | 
| 
       109 
109 
     | 
    
         
             
                  # TODO also take into account overridden revisions
         
     | 
| 
       110 
110 
     | 
    
         
             
                  def pact_is_new_or_pact_has_changed_since_previous_version? pact
         
     | 
| 
       111 
     | 
    
         
            -
                    find_previous_pacts(pact).any? { |previous_pact| previous_pact.nil? || pact.json_content != previous_pact.json_content}
         
     | 
| 
      
 111 
     | 
    
         
            +
                    pact_repository.find_previous_pacts(pact).any? { |previous_pact| previous_pact.nil? || pact.json_content != previous_pact.json_content}
         
     | 
| 
       112 
112 
     | 
    
         
             
                  end
         
     | 
| 
       113 
113 
     | 
    
         | 
| 
       114 
114 
     | 
    
         
             
                  private
         
     | 
| 
         @@ -118,10 +118,11 @@ module PactBroker 
     | 
|
| 
       118 
118 
     | 
    
         
             
                    logger.debug "Content #{params[:json_content]}"
         
     | 
| 
       119 
119 
     | 
    
         
             
                    updated_pact = pact_repository.update existing_pact.id, params
         
     | 
| 
       120 
120 
     | 
    
         | 
| 
      
 121 
     | 
    
         
            +
                    webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
         
     | 
| 
       121 
122 
     | 
    
         
             
                    if existing_pact.json_content != updated_pact.json_content
         
     | 
| 
       122 
123 
     | 
    
         
             
                      webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
         
     | 
| 
       123 
124 
     | 
    
         
             
                    else
         
     | 
| 
       124 
     | 
    
         
            -
                      logger.debug "Pact has not changed since previous  
     | 
| 
      
 125 
     | 
    
         
            +
                      logger.debug "Pact has not changed since previous version, not triggering webhooks for changed content"
         
     | 
| 
       125 
126 
     | 
    
         
             
                    end
         
     | 
| 
       126 
127 
     | 
    
         | 
| 
       127 
128 
     | 
    
         
             
                    updated_pact
         
     | 
| 
         @@ -137,18 +138,11 @@ module PactBroker 
     | 
|
| 
       137 
138 
     | 
    
         | 
| 
       138 
139 
     | 
    
         
             
                  def trigger_webhooks pact
         
     | 
| 
       139 
140 
     | 
    
         
             
                    # TODO add tests for this
         
     | 
| 
      
 141 
     | 
    
         
            +
                    webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
         
     | 
| 
       140 
142 
     | 
    
         
             
                    if pact_is_new_or_pact_has_changed_since_previous_version?(pact)
         
     | 
| 
       141 
143 
     | 
    
         
             
                      webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
         
     | 
| 
       142 
144 
     | 
    
         
             
                    else
         
     | 
| 
       143 
     | 
    
         
            -
                      logger.debug "Pact has not changed since previous version, not triggering webhooks"
         
     | 
| 
       144 
     | 
    
         
            -
                    end
         
     | 
| 
       145 
     | 
    
         
            -
                  end
         
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
                  def find_previous_pacts pact
         
     | 
| 
       148 
     | 
    
         
            -
                    if pact.consumer_version_tag_names.any?
         
     | 
| 
       149 
     | 
    
         
            -
                      pact.consumer_version_tag_names.map { |tag| pact_repository.find_previous_pact(pact, tag) }
         
     | 
| 
       150 
     | 
    
         
            -
                    else
         
     | 
| 
       151 
     | 
    
         
            -
                      [pact_repository.find_previous_pact(pact, :untagged)]
         
     | 
| 
      
 145 
     | 
    
         
            +
                      logger.debug "Pact has not changed since previous version, not triggering webhooks for changed content"
         
     | 
| 
       152 
146 
     | 
    
         
             
                    end
         
     | 
| 
       153 
147 
     | 
    
         
             
                  end
         
     | 
| 
       154 
148 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,6 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            %div.getting-started
         
     | 
| 
      
 2 
     | 
    
         
            +
              %h3 Welcome!
         
     | 
| 
      
 3 
     | 
    
         
            +
              %p
         
     | 
| 
      
 4 
     | 
    
         
            +
                Just getting started? Confused as to why there's nothing "clicky clicky" to see here? The Pact workflow is a "code first" approach. Your pacts will be generated by your consumer tests and then published here, ready to be retrieved by your provider tests for verification.
         
     | 
| 
      
 5 
     | 
    
         
            +
              %p
         
     | 
| 
      
 6 
     | 
    
         
            +
                For step by step instructions on getting started, check out the <a href="https://docs.pact.io/best_practices/pact_nirvana">Effective Pact Setup Guide</a>.
         
     | 
| 
         @@ -3,6 +3,8 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
              %script{type: 'text/javascript', src:'/javascripts/jquery.tablesorter.min.js'}
         
     | 
| 
       4 
4 
     | 
    
         
             
              .container
         
     | 
| 
       5 
5 
     | 
    
         
             
                = render :haml, :'index/_navbar', :layout => false, locals: {tag_toggle: false}
         
     | 
| 
      
 6 
     | 
    
         
            +
                - if index_items.empty?
         
     | 
| 
      
 7 
     | 
    
         
            +
                  = render :haml, :'index/_getting-started', :layout => false
         
     | 
| 
       6 
8 
     | 
    
         
             
                %h1.page-header
         
     | 
| 
       7 
9 
     | 
    
         
             
                  Pacts
         
     | 
| 
       8 
10 
     | 
    
         
             
                %table.table.table-bordered.table-striped{ id: 'relationships' }
         
     | 
| 
         @@ -3,6 +3,8 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
              %script{type: 'text/javascript', src:'/javascripts/jquery.tablesorter.min.js'}
         
     | 
| 
       4 
4 
     | 
    
         
             
              .container
         
     | 
| 
       5 
5 
     | 
    
         
             
                = render :haml, :'index/_navbar', :layout => false, locals: {tag_toggle: true}
         
     | 
| 
      
 6 
     | 
    
         
            +
                - if index_items.empty?
         
     | 
| 
      
 7 
     | 
    
         
            +
                  = render :haml, :'index/_getting-started', :layout => false
         
     | 
| 
       6 
8 
     | 
    
         
             
                %h1.page-header
         
     | 
| 
       7 
9 
     | 
    
         
             
                  Pacts
         
     | 
| 
       8 
10 
     | 
    
         
             
                %table.table.table-bordered.table-striped{ id: 'relationships' }
         
     | 
    
        data/lib/pact_broker/version.rb
    CHANGED
    
    
| 
         @@ -5,18 +5,23 @@ module PactBroker 
     | 
|
| 
       5 
5 
     | 
    
         
             
              module Webhooks
         
     | 
| 
       6 
6 
     | 
    
         
             
                class WebhookEvent < Sequel::Model
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
                  CONTRACT_PUBLISHED = 'contract_published'
         
     | 
| 
       8 
9 
     | 
    
         
             
                  CONTRACT_CONTENT_CHANGED = 'contract_content_changed'
         
     | 
| 
       9 
10 
     | 
    
         
             
                  VERIFICATION_PUBLISHED = 'provider_verification_published'
         
     | 
| 
       10 
11 
     | 
    
         
             
                  DEFAULT_EVENT_NAME = CONTRACT_CONTENT_CHANGED
         
     | 
| 
       11 
12 
     | 
    
         
             
                  #CONTRACT_VERIFIABLE_CONTENT_CHANGED = 'contract_verifiable_content_changed'
         
     | 
| 
       12 
13 
     | 
    
         
             
                  #VERIFICATION_STATUS_CHANGED = 'verification_status_changed'
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                  EVENT_NAMES = [CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED]
         
     | 
| 
      
 15 
     | 
    
         
            +
                  EVENT_NAMES = [CONTRACT_PUBLISHED, CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED]
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
                  dataset_module do
         
     | 
| 
       17 
18 
     | 
    
         
             
                    include PactBroker::Repositories::Helpers
         
     | 
| 
       18 
19 
     | 
    
         
             
                  end
         
     | 
| 
       19 
20 
     | 
    
         | 
| 
      
 21 
     | 
    
         
            +
                  def contract_published?
         
     | 
| 
      
 22 
     | 
    
         
            +
                    name == CONTRACT_PUBLISHED
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
       20 
25 
     | 
    
         
             
                  def contract_content_changed?
         
     | 
| 
       21 
26 
     | 
    
         
             
                    name == CONTRACT_CONTENT_CHANGED
         
     | 
| 
       22 
27 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1,29 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Decides whether this is a browser request or a request for the API
         
     | 
| 
       1 
2 
     | 
    
         
             
            module Rack
         
     | 
| 
       2 
3 
     | 
    
         
             
              module PactBroker
         
     | 
| 
       3 
4 
     | 
    
         
             
                class AcceptsHtmlFilter
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
5 
     | 
    
         
             
                  def initialize app
         
     | 
| 
       6 
6 
     | 
    
         
             
                    @app = app
         
     | 
| 
       7 
7 
     | 
    
         
             
                  end
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                  def call env
         
     | 
| 
       10 
     | 
    
         
            -
                    if  
     | 
| 
      
 10 
     | 
    
         
            +
                    if accepts_web_content_types_and_not_api_media env
         
     | 
| 
       11 
11 
     | 
    
         
             
                      @app.call(env)
         
     | 
| 
       12 
12 
     | 
    
         
             
                    else
         
     | 
| 
       13 
13 
     | 
    
         
             
                      [404, {},[]]
         
     | 
| 
       14 
14 
     | 
    
         
             
                    end
         
     | 
| 
       15 
15 
     | 
    
         
             
                  end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                  def  
     | 
| 
      
 17 
     | 
    
         
            +
                  def accepts_web_content_types_and_not_api_media env
         
     | 
| 
       18 
18 
     | 
    
         
             
                    accept = env['HTTP_ACCEPT'] || ''
         
     | 
| 
       19 
     | 
    
         
            -
                     
     | 
| 
      
 19 
     | 
    
         
            +
                    accepts_web_content_types(accept) && !accepts_api_content_types(accept)
         
     | 
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                  def  
     | 
| 
       23 
     | 
    
         
            -
                    accept.include?("html")
         
     | 
| 
      
 22 
     | 
    
         
            +
                  def accepts_web_content_types(accept)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    accept.include?("*/*") || accept.include?("html") || accept.include?("text/css") || accept.include?("text/javascript")
         
     | 
| 
       24 
24 
     | 
    
         
             
                  end
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                  def  
     | 
| 
      
 26 
     | 
    
         
            +
                  def accepts_api_content_types accept
         
     | 
| 
       27 
27 
     | 
    
         
             
                    accept.include?("json") || accept.include?("csv")
         
     | 
| 
       28 
28 
     | 
    
         
             
                  end
         
     | 
| 
       29 
29 
     | 
    
         
             
                end
         
     | 
| 
         @@ -9,7 +9,7 @@ module Rack 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  def call env
         
     | 
| 
       10 
10 
     | 
    
         
             
                    response = @app.call(env)
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                    if response.first == 404 && response[1]['Content-Type'] == 'text/html' && !(env['HTTP_ACCEPT'] =~ /html/)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    if response.first == 404 && response[1]['Content-Type'] == 'text/html' && !(env['HTTP_ACCEPT'] =~ /html|javascript|css/)
         
     | 
| 
       13 
13 
     | 
    
         
             
                      [404, { 'Content-Type' => 'application/hal+json'},[]]
         
     | 
| 
       14 
14 
     | 
    
         
             
                    else
         
     | 
| 
       15 
15 
     | 
    
         
             
                      response
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            describe "Deleting pact versions" do
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              let(:path) { "/pacts/provider/Bar/consumer/Foo/versions" }
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              subject { delete(path)  }
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              context "when the pact exists" do
         
     | 
| 
      
 8 
     | 
    
         
            +
                before do
         
     | 
| 
      
 9 
     | 
    
         
            +
                  TestDataBuilder.new
         
     | 
| 
      
 10 
     | 
    
         
            +
                    .create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
         
     | 
| 
      
 11 
     | 
    
         
            +
                    .create_provider("Baz")
         
     | 
| 
      
 12 
     | 
    
         
            +
                    .create_pact
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                it "deletes the pacts" do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  expect{ subject }.to change{ PactBroker::Pacts::PactPublication.count }.by(-1)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                it "returns a 204" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  expect(subject.status).to be 204
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              context "when the pact does not exist" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                it "returns a 404 Not Found" do
         
     | 
| 
      
 26 
     | 
    
         
            +
                  expect(subject.status).to be 404
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -7,9 +7,59 @@ module PactBroker 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
              module Pacts
         
     | 
| 
       9 
9 
     | 
    
         
             
                describe Service do
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
10 
     | 
    
         
             
                  let(:td) { TestDataBuilder.new }
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
      
 12 
     | 
    
         
            +
                  describe "create_or_update_pact" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                    include_context "stubbed repositories"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    before do
         
     | 
| 
      
 16 
     | 
    
         
            +
                      allow(described_class).to receive(:webhook_service).and_return(webhook_service)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      allow(pacticipant_repository).to receive(:find_by_name_or_create).with(params[:consumer_name]).and_return(consumer)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      allow(pacticipant_repository).to receive(:find_by_name_or_create).with(params[:provider_name]).and_return(provider)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      allow(version_repository).to receive(:find_by_pacticipant_id_and_number_or_create).and_return(version)
         
     | 
| 
      
 20 
     | 
    
         
            +
                      allow(pact_repository).to receive(:find_by_version_and_provider).and_return(existing_pact)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      allow(pact_repository).to receive(:create).and_return(new_pact)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      allow(pact_repository).to receive(:update).and_return(new_pact)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      allow(pact_repository).to receive(:find_previous_pacts).and_return(previous_pacts)
         
     | 
| 
      
 24 
     | 
    
         
            +
                      allow(webhook_service).to receive(:trigger_webhooks)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    let(:webhook_service) { class_double("PactBroker::Webhooks::Service").as_stubbed_const }
         
     | 
| 
      
 28 
     | 
    
         
            +
                    let(:consumer) { double('consumer', id: 1) }
         
     | 
| 
      
 29 
     | 
    
         
            +
                    let(:provider) { double('provider', id: 2) }
         
     | 
| 
      
 30 
     | 
    
         
            +
                    let(:version) { double('version', id: 3, pacticipant_id: 1) }
         
     | 
| 
      
 31 
     | 
    
         
            +
                    let(:existing_pact) { nil }
         
     | 
| 
      
 32 
     | 
    
         
            +
                    let(:new_pact) { double('new_pact', json_content: json_content) }
         
     | 
| 
      
 33 
     | 
    
         
            +
                    let(:json_content) { { the: "contract" }.to_json }
         
     | 
| 
      
 34 
     | 
    
         
            +
                    let(:previous_pacts) { [] }
         
     | 
| 
      
 35 
     | 
    
         
            +
                    let(:params) do
         
     | 
| 
      
 36 
     | 
    
         
            +
                      {
         
     | 
| 
      
 37 
     | 
    
         
            +
                        consumer_name: "Foo",
         
     | 
| 
      
 38 
     | 
    
         
            +
                        provider_name: "Bar",
         
     | 
| 
      
 39 
     | 
    
         
            +
                        consumer_version_number: "1",
         
     | 
| 
      
 40 
     | 
    
         
            +
                        json_content: json_content
         
     | 
| 
      
 41 
     | 
    
         
            +
                      }
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    subject { Service.create_or_update_pact(params) }
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    context "when no pact exists with the same params" do
         
     | 
| 
      
 47 
     | 
    
         
            +
                      it "triggers webhooks for contract publications" do
         
     | 
| 
      
 48 
     | 
    
         
            +
                        expect(webhook_service).to receive(:trigger_webhooks).with(new_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED)
         
     | 
| 
      
 49 
     | 
    
         
            +
                        subject
         
     | 
| 
      
 50 
     | 
    
         
            +
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    context "when a pact exists with the same params" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                      let(:existing_pact) { double('existing_pact', id: 4, json_content: { the: "contract" }.to_json) }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                      it "triggers webhooks for contract publications" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                        expect(webhook_service).to receive(:trigger_webhooks).with(new_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED)
         
     | 
| 
      
 58 
     | 
    
         
            +
                        subject
         
     | 
| 
      
 59 
     | 
    
         
            +
                      end
         
     | 
| 
      
 60 
     | 
    
         
            +
                    end
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       13 
63 
     | 
    
         
             
                  describe "find_distinct_pacts_between" do
         
     | 
| 
       14 
64 
     | 
    
         
             
                    let(:pact_1) { double('pact 1', json_content: 'content 1')}
         
     | 
| 
       15 
65 
     | 
    
         
             
                    let(:pact_2) { double('pact 2', json_content: 'content 2')}
         
     | 
| 
         @@ -27,7 +77,6 @@ module PactBroker 
     | 
|
| 
       27 
77 
     | 
    
         
             
                    it "returns the distinct pacts" do
         
     | 
| 
       28 
78 
     | 
    
         
             
                      expect(subject).to eq [pact_4, pact_2, pact_1]
         
     | 
| 
       29 
79 
     | 
    
         
             
                    end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
80 
     | 
    
         
             
                  end
         
     | 
| 
       32 
81 
     | 
    
         | 
| 
       33 
82 
     | 
    
         
             
                  describe "#pact_is_new_or_pact_has_changed_since_previous_version?" do
         
     | 
    
        data/spec/support/logging.rb
    CHANGED
    
    
| 
         @@ -2,9 +2,26 @@ RSpec.shared_context "stubbed services" do 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
              let(:pact_service) { class_double("PactBroker::Pacts::Service").as_stubbed_const }
         
     | 
| 
       4 
4 
     | 
    
         
             
              let(:pacticipant_service) { class_double("PactBroker::Pacticipants::Service").as_stubbed_const }
         
     | 
| 
      
 5 
     | 
    
         
            +
              let(:version_service) { class_double("PactBroker::Versions::Service").as_stubbed_const }
         
     | 
| 
      
 6 
     | 
    
         
            +
              let(:webhook_service) { class_double("PactBroker::Webhooks::Service").as_stubbed_const }
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
8 
     | 
    
         
             
              before do
         
     | 
| 
       7 
9 
     | 
    
         
             
                allow_any_instance_of(described_class).to receive(:pact_service).and_return(pact_service)
         
     | 
| 
       8 
10 
     | 
    
         
             
                allow_any_instance_of(described_class).to receive(:pacticipant_service).and_return(pacticipant_service)
         
     | 
| 
      
 11 
     | 
    
         
            +
                allow_any_instance_of(described_class).to receive(:version_service).and_return(version_service)
         
     | 
| 
      
 12 
     | 
    
         
            +
                allow_any_instance_of(described_class).to receive(:webhook_service).and_return(webhook_service)
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            RSpec.shared_context "stubbed repositories" do
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              let(:pact_repository) { instance_double("PactBroker::Pacts::Repository") }
         
     | 
| 
      
 19 
     | 
    
         
            +
              let(:pacticipant_repository) { instance_double("PactBroker::Pacticipants::Repository") }
         
     | 
| 
      
 20 
     | 
    
         
            +
              let(:version_repository) { instance_double("PactBroker::Version::Repository") }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              before do
         
     | 
| 
      
 23 
     | 
    
         
            +
                allow(described_class).to receive(:pact_repository).and_return(pact_repository)
         
     | 
| 
      
 24 
     | 
    
         
            +
                allow(described_class).to receive(:pacticipant_repository).and_return(pacticipant_repository)
         
     | 
| 
      
 25 
     | 
    
         
            +
                allow(described_class).to receive(:version_repository).and_return(version_repository)
         
     | 
| 
       9 
26 
     | 
    
         
             
              end
         
     | 
| 
       10 
27 
     | 
    
         
             
            end
         
     | 
    
        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. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.30.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: 2019- 
     | 
| 
      
 13 
     | 
    
         
            +
            date: 2019-04-01 00:00:00.000000000 Z
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies:
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       16 
16 
     | 
    
         
             
              name: httparty
         
     | 
| 
         @@ -881,6 +881,7 @@ files: 
     | 
|
| 
       881 
881 
     | 
    
         
             
            - lib/pact_broker/doc/views/layouts/main.haml
         
     | 
| 
       882 
882 
     | 
    
         
             
            - lib/pact_broker/doc/views/not_found.markdown
         
     | 
| 
       883 
883 
     | 
    
         
             
            - lib/pact_broker/doc/views/pact-versions.markdown
         
     | 
| 
      
 884 
     | 
    
         
            +
            - lib/pact_broker/doc/views/pact/all-pact-versions.markdown
         
     | 
| 
       884 
885 
     | 
    
         
             
            - lib/pact_broker/doc/views/pact/diff-previous-distinct.markdown
         
     | 
| 
       885 
886 
     | 
    
         
             
            - lib/pact_broker/doc/views/pact/diff.markdown
         
     | 
| 
       886 
887 
     | 
    
         
             
            - lib/pact_broker/doc/views/pact/latest-pact-version.markdown
         
     | 
| 
         @@ -979,6 +980,7 @@ files: 
     | 
|
| 
       979 
980 
     | 
    
         
             
            - lib/pact_broker/ui/view_models/matrix_tag.rb
         
     | 
| 
       980 
981 
     | 
    
         
             
            - lib/pact_broker/ui/views/clusters/show.haml
         
     | 
| 
       981 
982 
     | 
    
         
             
            - lib/pact_broker/ui/views/groups/show.html.erb
         
     | 
| 
      
 983 
     | 
    
         
            +
            - lib/pact_broker/ui/views/index/_getting-started.haml
         
     | 
| 
       982 
984 
     | 
    
         
             
            - lib/pact_broker/ui/views/index/_navbar.haml
         
     | 
| 
       983 
985 
     | 
    
         
             
            - lib/pact_broker/ui/views/index/show-with-tags.haml
         
     | 
| 
       984 
986 
     | 
    
         
             
            - lib/pact_broker/ui/views/index/show.haml
         
     | 
| 
         @@ -1094,6 +1096,7 @@ files: 
     | 
|
| 
       1094 
1096 
     | 
    
         
             
            - spec/features/create_webhook_spec.rb
         
     | 
| 
       1095 
1097 
     | 
    
         
             
            - spec/features/delete_label_spec.rb
         
     | 
| 
       1096 
1098 
     | 
    
         
             
            - spec/features/delete_pact_spec.rb
         
     | 
| 
      
 1099 
     | 
    
         
            +
            - spec/features/delete_pact_versions_spec.rb
         
     | 
| 
       1097 
1100 
     | 
    
         
             
            - spec/features/delete_tagged_pact_versions_spec.rb
         
     | 
| 
       1098 
1101 
     | 
    
         
             
            - spec/features/delete_version_spec.rb
         
     | 
| 
       1099 
1102 
     | 
    
         
             
            - spec/features/delete_webhook_spec.rb
         
     | 
| 
         @@ -1422,6 +1425,7 @@ test_files: 
     | 
|
| 
       1422 
1425 
     | 
    
         
             
            - spec/features/create_webhook_spec.rb
         
     | 
| 
       1423 
1426 
     | 
    
         
             
            - spec/features/delete_label_spec.rb
         
     | 
| 
       1424 
1427 
     | 
    
         
             
            - spec/features/delete_pact_spec.rb
         
     | 
| 
      
 1428 
     | 
    
         
            +
            - spec/features/delete_pact_versions_spec.rb
         
     | 
| 
       1425 
1429 
     | 
    
         
             
            - spec/features/delete_tagged_pact_versions_spec.rb
         
     | 
| 
       1426 
1430 
     | 
    
         
             
            - spec/features/delete_version_spec.rb
         
     | 
| 
       1427 
1431 
     | 
    
         
             
            - spec/features/delete_webhook_spec.rb
         
     |