pact_broker 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +15 -2
  3. data/CHANGELOG.md +9 -0
  4. data/CONTRIBUTING.md +15 -0
  5. data/config/database.travis.yml +13 -0
  6. data/config/database.yml +25 -13
  7. data/db/migrations/32_create_latest_verifications.rb +6 -5
  8. data/db/migrations/33_create_config_table.rb +1 -1
  9. data/db/migrations/34_create_index_on_consumer_version_order.rb +10 -0
  10. data/db/migrations/35_create_index_on_names.rb +11 -0
  11. data/db/migrations/36_create_webhook_execution.rb +16 -0
  12. data/example/pact_broker_database.sqlite3 +0 -0
  13. data/lib/db.rb +6 -1
  14. data/lib/pact_broker/api/contracts/put_pact_params_contract.rb +1 -0
  15. data/lib/pact_broker/app.rb +1 -0
  16. data/lib/pact_broker/domain/order_versions.rb +37 -15
  17. data/lib/pact_broker/domain/relationship.rb +11 -5
  18. data/lib/pact_broker/domain/tag.rb +4 -0
  19. data/lib/pact_broker/domain/version.rb +6 -1
  20. data/lib/pact_broker/domain/webhook_execution_result.rb +7 -2
  21. data/lib/pact_broker/domain/webhook_request.rb +24 -2
  22. data/lib/pact_broker/pacticipants/service.rb +4 -2
  23. data/lib/pact_broker/pacts/all_pact_publications.rb +1 -1
  24. data/lib/pact_broker/pacts/repository.rb +3 -3
  25. data/lib/pact_broker/repositories/helpers.rb +16 -0
  26. data/lib/pact_broker/ui/view_models/relationship.rb +9 -0
  27. data/lib/pact_broker/ui/views/relationships/show.haml +9 -0
  28. data/lib/pact_broker/version.rb +1 -1
  29. data/lib/pact_broker/webhooks/execution.rb +17 -0
  30. data/lib/pact_broker/webhooks/repository.rb +20 -2
  31. data/lib/pact_broker/webhooks/service.rb +4 -1
  32. data/public/stylesheets/relationships.css +1 -0
  33. data/script/publish-2.sh +1 -0
  34. data/script/publish-new.sh +1 -0
  35. data/script/publish-not-a-pact.sh +1 -0
  36. data/script/publish.sh +1 -0
  37. data/script/record_verification.sh +1 -0
  38. data/script/recreate-pg-db.sh +2 -0
  39. data/spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb +20 -0
  40. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +2 -1
  41. data/spec/lib/pact_broker/domain/order_versions_spec.rb +37 -15
  42. data/spec/lib/pact_broker/domain/version_spec.rb +14 -0
  43. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +49 -6
  44. data/spec/lib/pact_broker/domain/webhook_spec.rb +1 -0
  45. data/spec/lib/pact_broker/pacticipants/service_spec.rb +28 -4
  46. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +1 -1
  47. data/spec/lib/pact_broker/pacts/repository_spec.rb +10 -10
  48. data/spec/lib/pact_broker/tags/repository_spec.rb +2 -2
  49. data/spec/lib/pact_broker/ui/controllers/relationships_spec.rb +7 -7
  50. data/spec/lib/pact_broker/webhooks/repository_spec.rb +52 -4
  51. data/spec/lib/pact_broker/webhooks/service_spec.rb +6 -1
  52. data/spec/migrations/23_pact_versions_spec.rb +1 -1
  53. data/spec/support/database_cleaner.rb +5 -1
  54. data/spec/support/provider_state_builder.rb +8 -0
  55. data/spec/support/rspec_matchers.rb +9 -0
  56. data/tasks/database.rb +3 -2
  57. data/tasks/db.rake +41 -3
  58. metadata +10 -3
  59. data/lib/pact_broker/api/contracts/consumer_version_number_validation.rb +0 -27
@@ -58,7 +58,8 @@ module PactBroker
58
58
  pact_repository.find_latest_pacts
59
59
  .collect do | pact|
60
60
  latest_verification = verification_service.find_latest_verification_for(pact.consumer, pact.provider)
61
- PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, latest_verification
61
+ webhooks = webhook_service.find_by_consumer_and_provider pact.consumer, pact.provider
62
+ PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, latest_verification, webhooks
62
63
  end
63
64
  end
64
65
 
@@ -75,9 +76,10 @@ module PactBroker
75
76
  def self.delete name
76
77
  pacticipant = find_pacticipant_by_name name
77
78
  connection = PactBroker::Domain::Pacticipant.new.db
78
- version_ids = PactBroker::Domain::Version.where(pacticipant_id: pacticipant.id).select(:id)
79
+ version_ids = PactBroker::Domain::Version.where(pacticipant_id: pacticipant.id).select_for_subquery(:id) #stupid mysql doesn't allow subqueries
79
80
  select_pacticipant = "select id from pacticipants where name = '#{name}'"
80
81
  tag_repository.delete_by_version_id version_ids
82
+ webhook_repository.delete_executions_by_pacticipant pacticipant
81
83
  pact_repository.delete_by_version_id version_ids
82
84
  connection.run("delete from pact_publications where provider_id = #{pacticipant.id}")
83
85
  connection.run("delete from verifications where pact_version_id IN (select id from pact_versions where provider_id = #{pacticipant.id})")
@@ -64,7 +64,7 @@ module PactBroker
64
64
 
65
65
  def to_domain
66
66
  domain = to_domain_without_tags
67
- domain.consumer_version.tags = tags
67
+ domain.consumer_version.tags = tags.sort
68
68
  domain
69
69
  end
70
70
 
@@ -44,7 +44,7 @@ module PactBroker
44
44
  .consumer(params.consumer_name)
45
45
  .provider(params.provider_name)
46
46
  .consumer_version_number(params.consumer_version_number)
47
- .select(:id)
47
+ .select_for_subquery(:id)
48
48
  PactPublication.where(id: id).delete
49
49
  end
50
50
 
@@ -64,9 +64,9 @@ module PactBroker
64
64
 
65
65
  def find_latest_pact_versions_for_provider provider_name, tag = nil
66
66
  if tag
67
- LatestTaggedPactPublications.provider(provider_name).order(:consumer_name).where(tag_name: tag).order(:consumer_name).collect(&:to_domain)
67
+ LatestTaggedPactPublications.provider(provider_name).order_ignore_case(:consumer_name).where(tag_name: tag).collect(&:to_domain)
68
68
  else
69
- LatestPactPublications.provider(provider_name).order(:consumer_name).collect(&:to_domain)
69
+ LatestPactPublications.provider(provider_name).order_ignore_case(:consumer_name).collect(&:to_domain)
70
70
  end
71
71
  end
72
72
 
@@ -11,6 +11,22 @@ module PactBroker
11
11
  def case_sensitivity_options
12
12
  {case_insensitive: !PactBroker.configuration.use_case_sensitive_resource_names}
13
13
  end
14
+
15
+ def order_ignore_case column_name = :name
16
+ order(Sequel.function(:lower, column_name))
17
+ end
18
+
19
+ def mysql?
20
+ Sequel::Model.db.adapter_scheme.to_s =~ /mysql/
21
+ end
22
+
23
+ def select_for_subquery column
24
+ if mysql? #stoopid mysql doesn't allow subqueries
25
+ select(column).collect{ | it | it[column] }
26
+ else
27
+ select(column)
28
+ end
29
+ end
14
30
  end
15
31
  end
16
32
  end
@@ -33,6 +33,15 @@ module PactBroker
33
33
  "#{pactigration_base_url('', @relationship)}/latest"
34
34
  end
35
35
 
36
+ def any_webhooks?
37
+ @relationship.any_webhooks?
38
+ end
39
+
40
+ def webhooks_url
41
+ url = PactBroker::Api::PactBrokerUrls.webhooks_for_pact_url @relationship.latest_pact.consumer, @relationship.latest_pact.provider, ''
42
+ "/hal-browser/browser.html##{url}"
43
+ end
44
+
36
45
  def last_verified_date
37
46
  if @relationship.ever_verified?
38
47
  date = @relationship.latest_verification.execution_date
@@ -30,6 +30,8 @@
30
30
  %th
31
31
  %th
32
32
  Latest pact published
33
+ %th
34
+ Webhooks
33
35
  %th
34
36
  Last verified
35
37
  %tbody
@@ -49,6 +51,13 @@
49
51
  %td
50
52
  %td
51
53
  = relationship.publication_date_of_latest_pact
54
+ %td
55
+ - if relationship.any_webhooks?
56
+ %a{:href => relationship.webhooks_url}
57
+ Edit
58
+ - else
59
+ %a{:href => relationship.webhooks_url}
60
+ Create
52
61
  %td{class: relationship.verification_status, title: relationship.verification_tooltip, "data-toggle": "tooltip", "data-placement": "left"}
53
62
  %div
54
63
  = relationship.last_verified_date
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '2.0.2'
2
+ VERSION = '2.0.3'
3
3
  end
@@ -0,0 +1,17 @@
1
+ require 'sequel'
2
+
3
+ module PactBroker
4
+ module Webhooks
5
+ class Execution < Sequel::Model(:webhook_executions)
6
+
7
+ associate(:many_to_one, :webhook, :class => "PactBroker::Webhooks::Webhook", :key => :webhook_id, :primary_key => :id)
8
+ associate(:many_to_one, :pact_publication, :class => "PactBroker::Pacts::PactPublication", :key => :pact_publication_id, :primary_key => :id)
9
+ associate(:many_to_one, :provider, :class => "PactBroker::Domain::Pacticipant", :key => :provider_id, :primary_key => :id)
10
+ associate(:many_to_one, :consumer, :class => "PactBroker::Domain::Pacticipant", :key => :consumer_id, :primary_key => :id)
11
+
12
+ end
13
+
14
+ Execution.plugin :timestamps
15
+
16
+ end
17
+ end
@@ -3,7 +3,7 @@ require 'pact_broker/domain/webhook'
3
3
  require 'pact_broker/domain/pacticipant'
4
4
  require 'pact_broker/db'
5
5
  require 'pact_broker/webhooks/webhook'
6
-
6
+ require 'pact_broker/webhooks/execution'
7
7
 
8
8
  module PactBroker
9
9
  module Webhooks
@@ -43,6 +43,24 @@ module PactBroker
43
43
  Webhook.where(consumer_id: consumer.id, provider_id: provider.id).collect(&:to_domain)
44
44
  end
45
45
 
46
+ def create_execution webhook, webhook_execution_result
47
+ db_webhook = Webhook.where(uuid: webhook.uuid).single_record
48
+ execution = Execution.create(
49
+ webhook: db_webhook,
50
+ consumer: db_webhook.consumer,
51
+ provider: db_webhook.provider,
52
+ success: webhook_execution_result.success?,
53
+ logs: webhook_execution_result.logs)
54
+ end
55
+
56
+ def delete_executions_by_pacticipant pacticipant
57
+ Execution.where(consumer: pacticipant).delete
58
+ Execution.where(provider: pacticipant).delete
59
+ end
60
+
61
+ def unlink_executions_by_webhook_uuid uuid
62
+ Execution.where(webhook: Webhook.where(uuid: uuid)).update(webhook_id: nil)
63
+ end
46
64
  end
47
65
  end
48
- end
66
+ end
@@ -31,6 +31,7 @@ module PactBroker
31
31
  end
32
32
 
33
33
  def self.delete_by_uuid uuid
34
+ webhook_repository.delete_executions_by_webhook_uuid uuid
34
35
  webhook_repository.delete_by_uuid uuid
35
36
  end
36
37
 
@@ -43,7 +44,9 @@ module PactBroker
43
44
  end
44
45
 
45
46
  def self.execute_webhook_now webhook
46
- webhook.execute
47
+ webhook_execution_result = webhook.execute
48
+ webhook_repository.create_execution webhook, webhook_execution_result
49
+ webhook_execution_result
47
50
  end
48
51
 
49
52
  def self.find_by_consumer_and_provider consumer, provider
@@ -18,6 +18,7 @@ table#relationships {
18
18
  table#relationships td,
19
19
  table#relationships th {
20
20
  text-align: left;
21
+ vertical-align: middle
21
22
  }
22
23
 
23
24
  table#relationships th,
data/script/publish-2.sh CHANGED
@@ -1,3 +1,4 @@
1
1
  curl -v -XPUT \-H "Content-Type: application/json" \
2
2
  -d@spec/fixtures/a_consumer-a_provider-2.json \
3
3
  http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.1
4
+ echo ""
@@ -7,3 +7,4 @@ curl -v -XPUT \-H "Content-Type: application/json" \
7
7
  -d@tmp.json \
8
8
  http://127.0.0.1:9292/pacts/provider/Bar/consumer/Foo/version/${next_version}
9
9
  rm tmp.json
10
+ echo ""
@@ -1,3 +1,4 @@
1
1
  curl -v -XPUT \-H "Content-Type: application/json" \
2
2
  -d '[1]' \
3
3
  http://localhost:9292/pacts/provider/A%20Not%20Pact%20Provider/consumer/A%20Not%20Pact%20Consumer/version/1.0.0
4
+ echo ""
data/script/publish.sh CHANGED
@@ -1,3 +1,4 @@
1
1
  curl -v -XPUT \-H "Content-Type: application/json" \
2
2
  -d@script/foo-bar.json \
3
3
  http://127.0.0.1:9292/pacts/provider/Bar/consumer/Foo/version/1.0.0
4
+ echo ""
@@ -1,3 +1,4 @@
1
1
  curl -v -XPOST \-H "Content-Type: application/json" \
2
2
  -d@spec/fixtures/record_verification.json \
3
3
  http://127.0.0.1:9292/pacts/provider/Animal%20Service/consumer/Zoo%20App/version/1.0.2/verifications
4
+ echo ""
@@ -9,3 +9,5 @@ echo "export PACT_BROKER_DATABASE_USERNAME=pact_broker"
9
9
  echo "export PACT_BROKER_DATABASE_PASSWORD=pact_broker"
10
10
  echo "export PACT_BROKER_DATABASE_NAME=pact_broker"
11
11
  echo "export PACT_BROKER_DATABASE_HOST=${ip}"
12
+ echo "To test:"
13
+ echo "psql -h \$PACT_BROKER_DATABASE_HOST -d \$PACT_BROKER_DATABASE_NAME -U \$PACT_BROKER_DATABASE_USERNAME"
@@ -5,8 +5,13 @@ module PactBroker
5
5
  module Api
6
6
  module Contracts
7
7
  describe PutPactParamsContract do
8
+ before do
9
+ allow(PactBroker.configuration).to receive(:order_versions_by_date).and_return(order_versions_by_date)
10
+ end
11
+
8
12
  let(:json_content) { {'some' => 'json' }.to_json }
9
13
  let(:pact_params) { Pacts::PactParams.new(attributes) }
14
+ let(:order_versions_by_date) { false }
10
15
 
11
16
  let(:valid_attributes) do
12
17
  {
@@ -65,6 +70,21 @@ module PactBroker
65
70
  end
66
71
  end
67
72
 
73
+ context "when order_versions_by_date is true" do
74
+ let(:order_versions_by_date) { true }
75
+
76
+ context "with an invalid version number" do
77
+ let(:attributes) do
78
+ valid_attributes.merge(consumer_version_number: 'blah')
79
+ end
80
+
81
+ it "does not return an error" do
82
+ expect(subject.errors[:consumer_version_number]).to be_empty
83
+ end
84
+ end
85
+ end
86
+
87
+
68
88
  context "with a consumer name in the pact that does not match the consumer name in the path" do
69
89
  let(:attributes) do
70
90
  valid_attributes.merge(consumer_name: "another consumer")
@@ -8,7 +8,8 @@ module PactBroker
8
8
 
9
9
  describe "to_json" do
10
10
 
11
- let(:webhook_execution_result) { PactBroker::Domain::WebhookExecutionResult.new(response, error)}
11
+ let(:webhook_execution_result) { PactBroker::Domain::WebhookExecutionResult.new(response, logs, error)}
12
+ let(:logs) { "logs" }
12
13
  let(:headers) { { "Something" => ["blah", "thing"]} }
13
14
  let(:response) { double('http_response', code: '200', body: response_body, to_hash: headers) }
14
15
  let(:response_body) { 'body' }
@@ -4,20 +4,22 @@ require 'pact_broker/domain/order_versions.rb'
4
4
 
5
5
  describe PactBroker::Domain::OrderVersions do
6
6
 
7
+ before do
8
+ allow(PactBroker.configuration).to receive(:order_versions_by_date).and_return(false)
9
+ end
7
10
  context "when order_versions_by_date is false (the default)" do
8
11
  before do
9
12
  ProviderStateBuilder.new
10
13
  .create_condor
11
- .create_condor_version('1.3.0')
12
14
  .create_condor_version('1.5.0')
13
15
  .create_condor_version('1.4.0')
16
+ .create_condor_version('1.3.0')
14
17
  .create_condor_version('1.6.0')
15
18
  end
16
19
 
17
20
  let(:ordered_versions) { PactBroker::Domain::Version.order(:order).all.collect(&:number) }
18
- let(:condor) { PactBroker::Domain::Pacticipant.where(name: 'Condor').single_record }
19
21
 
20
- it "orders the versions so they can be loaded from the database in order" do
22
+ it "orders the versions semantically" do
21
23
  expect(ordered_versions).to eq(['1.3.0', '1.4.0', '1.5.0', '1.6.0'])
22
24
  end
23
25
  end
@@ -27,15 +29,15 @@ describe PactBroker::Domain::OrderVersions do
27
29
  allow(PactBroker.configuration).to receive(:order_versions_by_date).and_return(true)
28
30
  end
29
31
  let(:consumer) { ProviderStateBuilder.new.create_consumer.and_return(:consumer) }
30
- let!(:version_1) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '2', created_at: DateTime.new(2017)) }
31
- let!(:version_2) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '1', created_at: DateTime.new(2017)) }
32
- let!(:version_3) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '3', created_at: DateTime.new(2016)) }
33
- let!(:version_4) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '4', created_at: DateTime.new(2018)) }
32
+ let!(:version_1) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '2') }
33
+ let!(:version_2) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '1') }
34
+ let!(:version_3) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '3') }
35
+ let!(:version_4) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '4') }
34
36
 
35
37
  let(:ordered_versions) { PactBroker::Domain::Version.order(:order).all.collect(&:number) }
36
38
 
37
- it "orders by date, then id" do
38
- expect(ordered_versions).to eq(['3', '2', '1', '4'])
39
+ it "orders by insertion order" do
40
+ expect(ordered_versions).to eq(['2', '1', '3', '4'])
39
41
  end
40
42
 
41
43
  end
@@ -53,12 +55,32 @@ describe PactBroker::Domain::OrderVersions do
53
55
 
54
56
  let(:ordered_versions) { PactBroker::Domain::Version.order(:order).all.collect(&:number) }
55
57
 
56
- it "sorts the unparseable version as being first and maintains their relative order" do
57
- Sequel::Model.db[:versions].where(number: '1').update(number: 'z')
58
- Sequel::Model.db[:versions].where(number: '2').update(number: 'a')
59
- Sequel::Model.db[:versions].where(number: '4').update(number: 'h')
60
- PactBroker::Domain::Version.create(number: '5', pacticipant_id: consumer.id)
61
- expect(ordered_versions).to eq(['z', 'a', 'h', '3', '5'])
58
+ context "when the new version is considered to be the latest" do
59
+ before do
60
+ Sequel::Model.db[:versions].where(number: '1').update(number: 'z')
61
+ Sequel::Model.db[:versions].where(number: '2').update(number: 'a')
62
+ Sequel::Model.db[:versions].where(number: '4').update(number: 'h')
63
+ end
64
+
65
+ it "just uses the next order number for the new version" do
66
+ PactBroker::Domain::Version.create(number: '5', pacticipant_id: consumer.id)
67
+ expect(ordered_versions).to eq(['z', 'a', '3', 'h', '5'])
68
+ end
69
+ end
70
+
71
+ context "when the new version is considered to be earlier than the previous latest version" do
72
+
73
+ before do
74
+ Sequel::Model.db[:versions].where(number: '2').update(number: 'z')
75
+ Sequel::Model.db[:versions].where(number: '3').update(number: 'a')
76
+ end
77
+
78
+ it "inserts the new version in the right place" do
79
+ # 1 z a 4
80
+ PactBroker::Domain::Version.create(number: '2', pacticipant_id: consumer.id)
81
+ expect(ordered_versions).to eq(['1', 'z', 'a', '2', '4'])
82
+ end
83
+
62
84
  end
63
85
  end
64
86
 
@@ -21,6 +21,20 @@ module PactBroker
21
21
  expect(version.latest_pact_publication.id).to eq pact.id
22
22
  end
23
23
  end
24
+
25
+ describe "uq_ver_ppt_ord" do
26
+ let(:consumer) do
27
+ ProviderStateBuilder.new
28
+ .create_consumer
29
+ .and_return(:consumer)
30
+ end
31
+
32
+ it "does not allow two versions with the same pacticipant and order" do
33
+ Sequel::Model.db[:versions].insert(number: '1', order: 0, pacticipant_id: consumer.id, created_at: DateTime.new(2017), updated_at: DateTime.new(2017))
34
+ expect { Sequel::Model.db[:versions].insert(number: '2', order: 0, pacticipant_id: consumer.id, created_at: DateTime.new(2017), updated_at: DateTime.new(2017)) }
35
+ .to raise_error(Sequel::UniqueConstraintViolation)
36
+ end
37
+ end
24
38
  end
25
39
  end
26
40
  end
@@ -12,12 +12,14 @@ module PactBroker
12
12
  let(:password) { nil }
13
13
  let(:url) { 'http://example.org/hook' }
14
14
  let(:body) { 'body' }
15
+ let(:logs) { StringIO.new }
16
+ let(:execution_logger) { Logger.new(logs) }
15
17
 
16
18
  subject do
17
19
  WebhookRequest.new(
18
20
  method: 'post',
19
21
  url: url,
20
- headers: {'Content-type' => 'text/plain'},
22
+ headers: {'Content-Type' => 'text/plain'},
21
23
  username: username,
22
24
  password: password,
23
25
  body: body)
@@ -48,7 +50,7 @@ module PactBroker
48
50
  let!(:http_request) do
49
51
  stub_request(:post, "http://example.org/hook").
50
52
  with(:headers => {'Content-Type'=>'text/plain'}, :body => 'body').
51
- to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/plain, blah'})
53
+ to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/foo, blah'})
52
54
  end
53
55
 
54
56
  it "executes the configured request" do
@@ -70,6 +72,47 @@ module PactBroker
70
72
  subject.execute
71
73
  end
72
74
 
75
+ describe "execution logs" do
76
+ before do
77
+
78
+ end
79
+
80
+ let(:logs) { subject.execute.logs }
81
+
82
+ it "logs the request method and path" do
83
+ expect(logs).to include "POST http://example.org/hook"
84
+ end
85
+
86
+ it "logs the request headers" do
87
+ expect(logs).to include "Content-Type: text/plain"
88
+ end
89
+
90
+ it "logs the request body" do
91
+ expect(logs).to include body
92
+ end
93
+
94
+ it "logs the response status" do
95
+ expect(logs).to include "HTTP/1.0 302"
96
+ end
97
+
98
+ it "logs the response headers" do
99
+ expect(logs).to include "Content-Type: text/foo, blah"
100
+ end
101
+
102
+ it "logs the response body" do
103
+ expect(logs).to include "respbod"
104
+ end
105
+
106
+ context "with basic auth" do
107
+ let(:username) { 'username' }
108
+ let(:password) { 'password' }
109
+
110
+ it "logs the username and a starred password" do
111
+ expect(logs).to include "POST http://username:**********@example.org/hook"
112
+ end
113
+ end
114
+ end
115
+
73
116
  context "when a username and password are specified" do
74
117
 
75
118
  let(:username) { 'username' }
@@ -81,7 +124,7 @@ module PactBroker
81
124
  basic_auth: [username, password],
82
125
  :headers => {'Content-Type'=>'text/plain'},
83
126
  :body => 'body').
84
- to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/plain, blah'})
127
+ to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/foo, blah'})
85
128
  end
86
129
 
87
130
  it "uses the credentials" do
@@ -97,7 +140,7 @@ module PactBroker
97
140
  # webmock will set the request signature scheme to 'https' _only_ if the use_ssl option is set
98
141
  stub_request(:post, "https://example.org/hook").
99
142
  with(:headers => {'Content-Type'=>'text/plain'}, :body => 'body').
100
- to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/plain, blah'})
143
+ to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/foo, blah'})
101
144
  end
102
145
 
103
146
  it "uses SSL" do
@@ -112,7 +155,7 @@ module PactBroker
112
155
  let!(:http_request) do
113
156
  stub_request(:post, "http://example.org/hook").
114
157
  with(:headers => {'Content-Type'=>'text/plain'}, :body => body.to_json).
115
- to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/plain, blah'})
158
+ to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/foo, blah'})
116
159
  end
117
160
 
118
161
  it "converts the body to JSON before submitting the request" do
@@ -127,7 +170,7 @@ module PactBroker
127
170
  let!(:http_request) do
128
171
  stub_request(:post, "http://example.org/hook").
129
172
  with(:headers => {'Content-Type'=>'text/plain'}, :body => nil).
130
- to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/plain, blah'})
173
+ to_return(:status => 302, :body => "respbod", :headers => {'Content-Type' => 'text/foo, blah'})
131
174
  end
132
175
 
133
176
  it "executes the request without a body" do