pact_broker 2.12.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -5
  3. data/README.md +13 -8
  4. data/bethtest.rb +21 -94
  5. data/db/migrations/20171112_add_test_results.rb +7 -0
  6. data/db/migrations/20171117_create_webhook_events.rb +14 -0
  7. data/db/migrations/20171118_create_webhook_events.rb +18 -0
  8. data/db/migrations/20180108_create_certificates_table.rb +14 -0
  9. data/db/migrations/20180109_migrate_trigger_type.rb +9 -0
  10. data/db/pact_broker_database.sqlite3 +0 -0
  11. data/db/test/backwards_compatibility/gemfiles/1.18.0.gemfile.lock +5 -5
  12. data/db/test/backwards_compatibility/gemfiles/2.0.0.gemfile.lock +5 -5
  13. data/db/test/backwards_compatibility/gemfiles/2.1.0.gemfile.lock +5 -5
  14. data/db/test/backwards_compatibility/gemfiles/2.2.0.gemfile.lock +12 -14
  15. data/db/test/backwards_compatibility/gemfiles/2.3.0.gemfile.lock +12 -14
  16. data/db/test/backwards_compatibility/gemfiles/2.4.2.gemfile.lock +12 -14
  17. data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile.lock +12 -14
  18. data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile.lock +12 -14
  19. data/db/test/backwards_compatibility/gemfiles/head.gemfile.lock +16 -15
  20. data/db/test/change_migration_strategy/before/Gemfile +1 -0
  21. data/example/README.md +65 -0
  22. data/example/config.ru +1 -0
  23. data/example/example_data.sql +17 -0
  24. data/lib/pact_broker/api.rb +1 -1
  25. data/lib/pact_broker/api/contracts/webhook_contract.rb +9 -1
  26. data/lib/pact_broker/api/decorators/verification_decorator.rb +1 -0
  27. data/lib/pact_broker/api/decorators/webhook_decorator.rb +35 -5
  28. data/lib/pact_broker/api/resources/matrix_badge.rb +21 -0
  29. data/lib/pact_broker/certificates/certificate.rb +8 -0
  30. data/lib/pact_broker/certificates/service.rb +41 -0
  31. data/lib/pact_broker/doc/controllers/app.rb +12 -2
  32. data/lib/pact_broker/doc/views/webhooks.markdown +37 -2
  33. data/lib/pact_broker/domain/verification.rb +2 -0
  34. data/lib/pact_broker/domain/webhook.rb +2 -1
  35. data/lib/pact_broker/domain/webhook_request.rb +22 -4
  36. data/lib/pact_broker/error.rb +5 -0
  37. data/lib/pact_broker/matrix/parse_query.rb +7 -10
  38. data/lib/pact_broker/matrix/repository.rb +5 -32
  39. data/lib/pact_broker/matrix/service.rb +21 -3
  40. data/lib/pact_broker/pacts/repository.rb +9 -2
  41. data/lib/pact_broker/pacts/service.rb +2 -2
  42. data/lib/pact_broker/services.rb +5 -0
  43. data/lib/pact_broker/ui/app.rb +15 -0
  44. data/lib/pact_broker/ui/controllers/matrix.rb +58 -3
  45. data/lib/pact_broker/ui/views/matrix/show.haml +65 -10
  46. data/lib/pact_broker/verifications/service.rb +6 -1
  47. data/lib/pact_broker/version.rb +1 -1
  48. data/lib/pact_broker/webhooks/job.rb +1 -1
  49. data/lib/pact_broker/webhooks/repository.rb +17 -0
  50. data/lib/pact_broker/webhooks/service.rb +8 -7
  51. data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -1
  52. data/lib/pact_broker/webhooks/webhook.rb +3 -0
  53. data/lib/pact_broker/webhooks/webhook_event.rb +24 -0
  54. data/pact_broker.gemspec +2 -1
  55. data/public/javascripts/matrix.js +60 -0
  56. data/public/stylesheets/matrix.css +12 -0
  57. data/script/db-spec.sh +1 -0
  58. data/script/foo-bar-verification.json +57 -0
  59. data/script/insert-self-signed-certificate-from-url.rb +32 -0
  60. data/script/publish-verification.sh +5 -0
  61. data/script/seed-matrix.rb +6 -5
  62. data/script/seed.rb +67 -59
  63. data/spec/features/create_webhook_spec.rb +4 -1
  64. data/spec/features/get_matrix_badge_spec.rb +40 -0
  65. data/spec/features/publish_verification_spec.rb +28 -4
  66. data/spec/fixtures/certificate-invalid.pem +29 -0
  67. data/spec/fixtures/certificate.pem +53 -0
  68. data/spec/fixtures/certificates/cacert.pem +21 -0
  69. data/spec/fixtures/certificates/cert.pem +20 -0
  70. data/spec/fixtures/certificates/key.pem +27 -0
  71. data/spec/fixtures/certificates/self-signed.badssl.com.pem +21 -0
  72. data/spec/fixtures/verification.json +4 -1
  73. data/spec/fixtures/webhook_valid.json +3 -0
  74. data/spec/integration/webhooks/certificate_spec.rb +80 -0
  75. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +20 -0
  76. data/spec/lib/pact_broker/api/decorators/pact_webhooks_status_decorator_spec.rb +2 -2
  77. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +5 -0
  78. data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +1 -0
  79. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +29 -19
  80. data/spec/lib/pact_broker/api/resources/badge_spec.rb +61 -0
  81. data/spec/lib/pact_broker/api/resources/matrix_badge_spec.rb +11 -0
  82. data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +8 -9
  83. data/spec/lib/pact_broker/certificates/service_spec.rb +60 -0
  84. data/spec/lib/pact_broker/domain/verification_spec.rb +13 -0
  85. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +0 -4
  86. data/spec/lib/pact_broker/matrix/service_spec.rb +40 -8
  87. data/spec/lib/pact_broker/pacts/repository_spec.rb +18 -1
  88. data/spec/lib/pact_broker/webhooks/job_spec.rb +1 -1
  89. data/spec/lib/pact_broker/webhooks/repository_spec.rb +53 -13
  90. data/spec/lib/pact_broker/webhooks/service_spec.rb +9 -6
  91. data/spec/migrations/change_migration_strategy_spec.rb +13 -14
  92. data/spec/spec_helper.rb +4 -0
  93. data/spec/support/ssl_webhook_server.rb +37 -0
  94. data/spec/support/test_data_builder.rb +12 -4
  95. data/tasks/database.rb +9 -7
  96. data/tasks/database/table_dependency_calculator.rb +44 -0
  97. metadata +57 -6
  98. data/lib/pact_broker/doc/views/pact-webhooks.markdown +0 -50
  99. data/lib/pact_broker/doc/views/webhooks-create.markdown +0 -38
  100. data/lib/pact_broker/doc/views/webhooks-webhooks.markdown +0 -15
@@ -10,7 +10,7 @@ module PactBroker
10
10
  allow(PactBroker::Webhooks::Service).to receive(:update_triggered_webhook_status)
11
11
  end
12
12
 
13
- let(:triggered_webhook) { instance_double("PactBroker::Webhooks::TriggeredWebhook", webhook_uuid: '1234') }
13
+ let(:triggered_webhook) { instance_double("PactBroker::Webhooks::TriggeredWebhook", webhook_uuid: '1234', id: 1) }
14
14
  let(:result) { instance_double("PactBroker::Domain::WebhookExecutionResult", success?: success)}
15
15
  let(:success) { true }
16
16
 
@@ -18,22 +18,30 @@ module PactBroker
18
18
  password: 'password',
19
19
  body: body)
20
20
  end
21
- let(:webhook) { Domain::Webhook.new(request: request)}
21
+ let(:event) do
22
+ PactBroker::Webhooks::WebhookEvent.new(name: 'something_happened')
23
+ end
24
+ let(:events) { [event]}
25
+ let(:webhook) { Domain::Webhook.new(request: request, events: events)}
22
26
  let(:test_data_builder) { TestDataBuilder.new }
23
27
  let(:consumer) { test_data_builder.create_pacticipant 'Consumer'; test_data_builder.pacticipant}
24
28
  let(:provider) { test_data_builder.create_pacticipant 'Provider'; test_data_builder.pacticipant}
25
29
  let(:uuid) { 'the-uuid' }
26
30
  let(:created_webhook_record) { ::DB::PACT_BROKER_DB[:webhooks].order(:id).last }
27
31
  let(:created_headers) { ::DB::PACT_BROKER_DB[:webhook_headers].where(webhook_id: created_webhook_record[:id]).order(:name).all }
28
- let(:expected_webhook_record) { {
29
- :uuid=>"the-uuid",
30
- :method=>"post",
31
- :url=>"http://example.org",
32
- :username => 'username',
33
- :password => "cGFzc3dvcmQ=",
34
- :body=>body.to_json,
35
- :consumer_id=> consumer.id,
36
- :provider_id=> provider.id } }
32
+ let(:created_events) { ::DB::PACT_BROKER_DB[:webhook_events].where(webhook_id: created_webhook_record[:id]).order(:name).all }
33
+ let(:expected_webhook_record) do
34
+ {
35
+ uuid: "the-uuid",
36
+ method: "post",
37
+ url: "http://example.org",
38
+ username: 'username',
39
+ password: "cGFzc3dvcmQ=",
40
+ body: body.to_json,
41
+ consumer_id: consumer.id,
42
+ provider_id: provider.id
43
+ }
44
+ end
37
45
 
38
46
  describe "#create" do
39
47
 
@@ -53,6 +61,10 @@ module PactBroker
53
61
  expect(created_headers.last[:value]).to eq "application/json"
54
62
  end
55
63
 
64
+ it "saves the webhook events" do
65
+ expect(subject.events.first[:name]).to eq "something_happened"
66
+ end
67
+
56
68
  end
57
69
 
58
70
  describe "delete_by_uuid" do
@@ -193,6 +205,7 @@ module PactBroker
193
205
  let(:td) { TestDataBuilder.new }
194
206
  let(:old_webhook_params) do
195
207
  {
208
+ events: [{ name: 'something' }],
196
209
  uuid: uuid,
197
210
  method: 'POST',
198
211
  url: 'http://example.org',
@@ -210,13 +223,16 @@ module PactBroker
210
223
  headers: {'Content-Type' => 'text/plain'}
211
224
  }
212
225
  end
226
+ let(:new_event) do
227
+ PactBroker::Webhooks::WebhookEvent.new(name: 'something_else')
228
+ end
213
229
  before do
214
230
  td.create_consumer
215
231
  .create_provider
216
232
  .create_webhook(old_webhook_params)
217
233
  end
218
234
  let(:new_webhook) do
219
- PactBroker::Domain::Webhook.new(request: PactBroker::Domain::WebhookRequest.new(new_webhook_params))
235
+ PactBroker::Domain::Webhook.new(events: [new_event], request: PactBroker::Domain::WebhookRequest.new(new_webhook_params))
220
236
  end
221
237
 
222
238
  subject { Repository.new.update_by_uuid uuid, new_webhook }
@@ -230,6 +246,7 @@ module PactBroker
230
246
  expect(updated_webhook.request.headers).to eq 'Content-Type' => 'text/plain'
231
247
  expect(updated_webhook.request.username).to eq nil
232
248
  expect(updated_webhook.request.password).to eq nil
249
+ expect(updated_webhook.events.first.name).to eq 'something_else'
233
250
  end
234
251
  end
235
252
 
@@ -286,6 +303,29 @@ module PactBroker
286
303
  end
287
304
  end
288
305
 
306
+ describe "find_by_consumer_and_provider_and_event_name" do
307
+ let(:test_data_builder) { TestDataBuilder.new }
308
+ subject { Repository.new.find_by_consumer_and_provider_and_event_name test_data_builder.consumer, test_data_builder.provider, 'something_happened' }
309
+
310
+ context "when a webhook exists with a matching consumer and provider and event name" do
311
+
312
+ before do
313
+ test_data_builder
314
+ .create_consumer("Consumer")
315
+ .create_provider("Another Provider")
316
+ .create_webhook
317
+ .create_provider("Provider")
318
+ .create_webhook(uuid: '1', events: [{ name: 'something_happened' }])
319
+ .create_webhook(uuid: '2', events: [{ name: 'something_happened' }])
320
+ .create_webhook(uuid: '3', events: [{ name: 'something_else_happened' }])
321
+ end
322
+
323
+ it "returns an array of webhooks" do
324
+ expect(subject.collect(&:uuid).sort).to eq ['1', '2']
325
+ end
326
+ end
327
+ end
328
+
289
329
  describe "create_triggered_webhook" do
290
330
  before do
291
331
  td.create_consumer
@@ -295,14 +335,14 @@ module PactBroker
295
335
  .create_pact
296
336
  end
297
337
 
298
- subject { Repository.new.create_triggered_webhook '1234', td.webhook, td.pact, 'pact_publication' }
338
+ subject { Repository.new.create_triggered_webhook '1234', td.webhook, td.pact, 'publication' }
299
339
 
300
340
  it "creates a TriggeredWebhook" do
301
341
  expect(subject.webhook_uuid ).to eq td.webhook.uuid
302
342
  expect(subject.consumer).to eq td.consumer
303
343
  expect(subject.provider).to eq td.provider
304
344
  expect(subject.trigger_uuid).to eq '1234'
305
- expect(subject.trigger_type).to eq 'pact_publication'
345
+ expect(subject.trigger_type).to eq 'publication'
306
346
  end
307
347
 
308
348
  it "sets the webhook" do
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'pact_broker/webhooks/service'
3
3
  require 'pact_broker/webhooks/triggered_webhook'
4
+ require 'pact_broker/webhooks/webhook_event'
4
5
  require 'webmock/rspec'
5
6
  require 'sucker_punch/testing/inline'
6
7
 
@@ -37,21 +38,21 @@ module PactBroker
37
38
  let(:triggered_webhook) { instance_double(PactBroker::Webhooks::TriggeredWebhook) }
38
39
 
39
40
  before do
40
- allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider).and_return(webhooks)
41
+ allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider_and_event_name).and_return(webhooks)
41
42
  allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:create_triggered_webhook).and_return(triggered_webhook)
42
43
  allow(Job).to receive(:perform_async)
43
44
  end
44
45
 
45
- subject { Service.execute_webhooks pact }
46
+ subject { Service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
46
47
 
47
48
  it "finds the webhooks" do
48
- expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider).with(consumer, provider)
49
+ expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider_and_event_name).with(consumer, provider, PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME)
49
50
  subject
50
51
  end
51
52
 
52
53
  context "when webhooks are found" do
53
54
  it "executes the webhook" do
54
- expect(Service).to receive(:run_later).with(webhooks, pact)
55
+ expect(Service).to receive(:run_later).with(webhooks, pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED)
55
56
  subject
56
57
  end
57
58
  end
@@ -126,16 +127,18 @@ module PactBroker
126
127
  to_return(:status => 200)
127
128
  end
128
129
 
130
+ let(:events) { [{ name: PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME }] }
131
+
129
132
  let(:pact) do
130
133
  td.create_consumer
131
134
  .create_provider
132
135
  .create_consumer_version
133
136
  .create_pact
134
- .create_webhook(method: 'GET', url: 'http://example.org')
137
+ .create_webhook(method: 'GET', url: 'http://example.org', events: events)
135
138
  .and_return(:pact)
136
139
  end
137
140
 
138
- subject { PactBroker::Webhooks::Service.execute_webhooks pact }
141
+ subject { PactBroker::Webhooks::Service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
139
142
 
140
143
  it "executes the HTTP request of the webhook" do
141
144
  subject
@@ -18,11 +18,16 @@ describe "changing from integer to timestamp migrations", no_db_clean: true do
18
18
  FileUtils.rm_rf DATABASE_PATH
19
19
  end
20
20
 
21
+ def execute command
22
+ puts command
23
+ `#{command}`.tap { |it| puts it }
24
+ end
25
+
21
26
  it "uses pact_broker v 2.6.0" do
22
27
  Dir.chdir(TEST_DIR) do
23
28
  Bundler.with_clean_env do
24
- `bundle install --gemfile before/Gemfile`
25
- expect(`BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:version`.strip).to eq '2.6.0'
29
+ execute('bundle install --gemfile before/Gemfile --jobs=3 --retry=3')
30
+ expect(execute('BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:version').strip).to eq '2.6.0'
26
31
  end
27
32
  end
28
33
  end
@@ -30,10 +35,8 @@ describe "changing from integer to timestamp migrations", no_db_clean: true do
30
35
  it "migrates using integer migrations using pact_broker v2.6.0" do
31
36
  Dir.chdir(TEST_DIR) do
32
37
  Bundler.with_clean_env do
33
- output = `BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:db:migrate[35]`
34
- puts output
35
- output = `BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:db:version`
36
- puts output
38
+ execute('BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:db:migrate[35]')
39
+ output = execute('BUNDLE_GEMFILE=before/Gemfile bundle exec rake pact_broker:db:version')
37
40
  expect(output.strip).to eq "35"
38
41
  end
39
42
  end
@@ -54,10 +57,8 @@ describe "changing from integer to timestamp migrations", no_db_clean: true do
54
57
 
55
58
  it "migrates using timestamp migrations using pact_broker > 2.6.0" do
56
59
  Dir.chdir(TEST_DIR) do
57
- output = `bundle exec rake pact_broker:db:migrate`
58
- puts output
59
- output = `bundle exec rake pact_broker:db:version`
60
- puts output
60
+ execute('bundle exec rake pact_broker:db:migrate')
61
+ output = execute('bundle exec rake pact_broker:db:version')
61
62
  expect(output.strip.to_i).to be > 47
62
63
  end
63
64
  end
@@ -76,10 +77,8 @@ describe "changing from integer to timestamp migrations", no_db_clean: true do
76
77
 
77
78
  it "allows rollback" do
78
79
  Dir.chdir(TEST_DIR) do
79
- output = `bundle exec rake pact_broker:db:migrate[45]`
80
- puts output
81
- output = `bundle exec rake pact_broker:db:version`
82
- puts output
80
+ execute('bundle exec rake pact_broker:db:migrate[45]')
81
+ output = execute('bundle exec rake pact_broker:db:version')
83
82
  expect(output.strip).to eq "45"
84
83
  end
85
84
  end
@@ -15,6 +15,10 @@ PactBroker::DB.connection = PactBroker::Database.database = DB::PACT_BROKER_DB
15
15
  require 'rack/test'
16
16
  require 'pact_broker/api'
17
17
  require 'rspec/its'
18
+ require 'sucker_punch/testing/inline'
19
+ require 'webmock/rspec'
20
+
21
+ WebMock.disable_net_connect!(allow_localhost: true)
18
22
 
19
23
  Dir.glob("./spec/support/**/*.rb") { |file| require file }
20
24
 
@@ -0,0 +1,37 @@
1
+ if __FILE__ == $0
2
+
3
+ SSL_KEY = 'spec/fixtures/certificates/key.pem'
4
+ SSL_CERT = 'spec/fixtures/certificates/cert.pem'
5
+
6
+ trap(:INT) do
7
+ @server.shutdown
8
+ exit
9
+ end
10
+
11
+ def webrick_opts port
12
+ certificate = OpenSSL::X509::Certificate.new(File.read(SSL_CERT))
13
+ cert_name = certificate.subject.to_a.collect{|a| a[0..1] }
14
+ {
15
+ Port: port,
16
+ Host: "0.0.0.0",
17
+ AccessLog: [],
18
+ SSLCertificate: certificate,
19
+ SSLPrivateKey: OpenSSL::PKey::RSA.new(File.read(SSL_KEY)),
20
+ SSLEnable: true,
21
+ SSLCertName: cert_name
22
+ }
23
+ end
24
+
25
+ app = ->(env) { puts "hello"; [200, {}, ['Hello world' + "\n"]] }
26
+
27
+ require 'webrick'
28
+ require 'webrick/https'
29
+ require 'rack'
30
+ require 'rack/handler/webrick'
31
+
32
+ opts = webrick_opts(4444)
33
+
34
+ Rack::Handler::WEBrick.run(app, opts) do |server|
35
+ @server = server
36
+ end
37
+ end
@@ -21,6 +21,7 @@ require 'pact_broker/verifications/repository'
21
21
  require 'pact_broker/verifications/service'
22
22
  require 'pact_broker/tags/repository'
23
23
  require 'pact_broker/webhooks/repository'
24
+ require 'pact_broker/certificates/certificate'
24
25
  require 'ostruct'
25
26
 
26
27
  class TestDataBuilder
@@ -200,15 +201,17 @@ class TestDataBuilder
200
201
 
201
202
  def create_webhook params = {}
202
203
  uuid = params[:uuid] || PactBroker::Webhooks::Service.next_uuid
203
- default_params = {method: 'POST', url: 'http://example.org', headers: {'Content-Type' => 'application/json'}}
204
+ event_params = params[:events] || [{ name: PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME }]
205
+ events = event_params.collect{ |e| PactBroker::Webhooks::WebhookEvent.new(e) }
206
+ default_params = { method: 'POST', url: 'http://example.org', headers: {'Content-Type' => 'application/json'}}
204
207
  request = PactBroker::Domain::WebhookRequest.new(default_params.merge(params))
205
- @webhook = PactBroker::Webhooks::Repository.new.create uuid, PactBroker::Domain::Webhook.new(request: request), @consumer, @provider
208
+ @webhook = PactBroker::Webhooks::Repository.new.create uuid, PactBroker::Domain::Webhook.new(request: request, events: events), @consumer, @provider
206
209
  self
207
210
  end
208
211
 
209
212
  def create_triggered_webhook params = {}
210
213
  trigger_uuid = params[:trigger_uuid] || webhook_service.next_uuid
211
- @triggered_webhook = webhook_repository.create_triggered_webhook trigger_uuid, @webhook, @pact, PactBroker::Webhooks::Service::PUBLICATION
214
+ @triggered_webhook = webhook_repository.create_triggered_webhook trigger_uuid, @webhook, @pact, PactBroker::Webhooks::Service::RESOURCE_CREATION
212
215
  @triggered_webhook.update(status: params[:status]) if params[:status]
213
216
  set_created_at_if_set params[:created_at], :triggered_webhooks, {id: @triggered_webhook.id}
214
217
  self
@@ -238,7 +241,7 @@ class TestDataBuilder
238
241
 
239
242
  def create_verification parameters = {}
240
243
  provider_version_number = parameters[:provider_version] || '4.5.6'
241
- default_parameters = {success: true, number: 1}
244
+ default_parameters = {success: true, number: 1, test_results: {some: 'results'}}
242
245
  parameters = default_parameters.merge(parameters)
243
246
  parameters.delete(:provider_version)
244
247
  verification = PactBroker::Domain::Verification.new(parameters)
@@ -246,6 +249,11 @@ class TestDataBuilder
246
249
  self
247
250
  end
248
251
 
252
+ def create_certificate options = {path: 'spec/fixtures/single-certificate.pem'}
253
+ PactBroker::Certificates::Certificate.create(uuid: SecureRandom.urlsafe_base64, content: File.read(options[:path]))
254
+ self
255
+ end
256
+
249
257
  def model_counter
250
258
  @@model_counter ||= 0
251
259
  @@model_counter += 1
@@ -3,14 +3,13 @@ require 'pact_broker/db/migrate'
3
3
  require 'pact_broker/db/version'
4
4
  require 'sequel'
5
5
  require 'yaml'
6
+ require_relative 'database/table_dependency_calculator'
6
7
 
7
8
  Sequel.extension :migration
8
9
 
9
10
  module PactBroker
10
11
  module Database
11
12
 
12
- TABLES = [:labels, :webhook_executions, :triggered_webhooks, :config, :pacts, :pact_version_contents, :tags, :verifications, :pact_publications, :pact_versions, :webhook_headers, :webhooks, :versions, :pacticipants].freeze
13
-
14
13
  extend self
15
14
 
16
15
  def migrate target = nil
@@ -38,11 +37,10 @@ module PactBroker
38
37
  end
39
38
 
40
39
  def drop_tables
41
- (TABLES + [:schema_info, :schema_migrations]).each do | table_name |
42
- if database.table_exists?(table_name)
43
- database.drop_table(table_name, cascade: psql?)
44
- end
40
+ ordered_tables.each do | table_name |
41
+ database.drop_table(table_name, cascade: psql?)
45
42
  end
43
+ database.drop_table(:schema_migrations) if database.table_exists?(:schema_migrations)
46
44
  end
47
45
 
48
46
  def drop_views
@@ -75,7 +73,7 @@ module PactBroker
75
73
  end
76
74
 
77
75
  def truncate
78
- TABLES.each do | table_name |
76
+ ordered_tables.each do | table_name |
79
77
  if database.table_exists?(table_name)
80
78
  begin
81
79
  database[table_name].delete
@@ -100,6 +98,10 @@ module PactBroker
100
98
 
101
99
  private
102
100
 
101
+ def ordered_tables
102
+ TableDependencyCalculator.call(database)
103
+ end
104
+
103
105
  def ensure_not_production
104
106
  raise "Cannot delete production database using this task" if env == 'production'
105
107
  end
@@ -0,0 +1,44 @@
1
+ module PactBroker
2
+ module Database
3
+
4
+ # Returns a list of the tables in the database in the order in which
5
+ # they can be truncated or dropped
6
+ class TableDependencyCalculator
7
+
8
+ def self.call connection
9
+ new(connection).call
10
+ end
11
+
12
+ def initialize connection
13
+ @connection = connection
14
+ end
15
+
16
+ def call
17
+ ordered_table_names = []
18
+ dependencies = @connection
19
+ .tables
20
+ .collect{|it| @connection.foreign_key_list(it)
21
+ .collect{|fk| {from: it, to: fk[:table]} } }
22
+ .flatten
23
+ .uniq - [:schema_migrations]
24
+ check(@connection.tables, dependencies, ordered_table_names)
25
+ ordered_table_names
26
+ end
27
+
28
+ def deps_on table_name, deps
29
+ deps.select{ | d| d[:to] == table_name }.collect{ |d| d[:from] }
30
+ end
31
+
32
+ def check table_names, deps, ordered_table_names
33
+ return if table_names.size == 0
34
+ remaining_dependencies = deps_on(table_names.first, deps) - ordered_table_names
35
+ if remaining_dependencies.size == 0
36
+ ordered_table_names << table_names.first
37
+ check(table_names[1..-1], deps, ordered_table_names)
38
+ else
39
+ check((remaining_dependencies + table_names).uniq, deps, ordered_table_names)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ 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.12.0
4
+ version: 2.13.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: 2017-12-09 00:00:00.000000000 Z
13
+ date: 2018-01-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -262,6 +262,20 @@ dependencies:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
264
  version: '1.5'
265
+ - !ruby/object:Gem::Dependency
266
+ name: webrick
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: 1.3.0
272
+ type: :runtime
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: 1.3.0
265
279
  - !ruby/object:Gem::Dependency
266
280
  name: bundler-audit
267
281
  requirement: !ruby/object:Gem::Requirement
@@ -541,6 +555,11 @@ files:
541
555
  - db/migrations/000048_create_matrix.rb
542
556
  - db/migrations/000049_create_latest_verifications_for_cv_and_pv.rb
543
557
  - db/migrations/000050_create_latest_matrix.rb
558
+ - db/migrations/20171112_add_test_results.rb
559
+ - db/migrations/20171117_create_webhook_events.rb
560
+ - db/migrations/20171118_create_webhook_events.rb
561
+ - db/migrations/20180108_create_certificates_table.rb
562
+ - db/migrations/20180109_migrate_trigger_type.rb
544
563
  - db/migrations/migration_helper.rb
545
564
  - db/pact_broker_database.sqlite3
546
565
  - db/test/backwards_compatibility/.rspec
@@ -574,11 +593,13 @@ files:
574
593
  - db/test/change_migration_strategy/Rakefile
575
594
  - db/test/change_migration_strategy/before/Gemfile
576
595
  - example/Gemfile
596
+ - example/README.md
577
597
  - example/basic_auth/Gemfile
578
598
  - example/basic_auth/Procfile
579
599
  - example/basic_auth/README.md
580
600
  - example/basic_auth/config.ru
581
601
  - example/config.ru
602
+ - example/example_data.sql
582
603
  - example/pact_broker_database.sqlite3
583
604
  - lib/db.rb
584
605
  - lib/pact_broker.rb
@@ -636,6 +657,7 @@ files:
636
657
  - lib/pact_broker/api/resources/latest_provider_pacts.rb
637
658
  - lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb
638
659
  - lib/pact_broker/api/resources/matrix.rb
660
+ - lib/pact_broker/api/resources/matrix_badge.rb
639
661
  - lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb
640
662
  - lib/pact_broker/api/resources/pact.rb
641
663
  - lib/pact_broker/api/resources/pact_content_diff.rb
@@ -660,6 +682,8 @@ files:
660
682
  - lib/pact_broker/api/resources/webhooks.rb
661
683
  - lib/pact_broker/app.rb
662
684
  - lib/pact_broker/badges/service.rb
685
+ - lib/pact_broker/certificates/certificate.rb
686
+ - lib/pact_broker/certificates/service.rb
663
687
  - lib/pact_broker/config/load.rb
664
688
  - lib/pact_broker/config/save.rb
665
689
  - lib/pact_broker/config/setting.rb
@@ -682,7 +706,6 @@ files:
682
706
  - lib/pact_broker/doc/views/latest-verifications.markdown
683
707
  - lib/pact_broker/doc/views/layouts/main.haml
684
708
  - lib/pact_broker/doc/views/pact-versions.markdown
685
- - lib/pact_broker/doc/views/pact-webhooks.markdown
686
709
  - lib/pact_broker/doc/views/pacticipants.markdown
687
710
  - lib/pact_broker/doc/views/provider.markdown
688
711
  - lib/pact_broker/doc/views/publish-pact.markdown
@@ -690,8 +713,6 @@ files:
690
713
  - lib/pact_broker/doc/views/self.markdown
691
714
  - lib/pact_broker/doc/views/tag-prod-version.markdown
692
715
  - lib/pact_broker/doc/views/tag-version.markdown
693
- - lib/pact_broker/doc/views/webhooks-create.markdown
694
- - lib/pact_broker/doc/views/webhooks-webhooks.markdown
695
716
  - lib/pact_broker/doc/views/webhooks.markdown
696
717
  - lib/pact_broker/domain.rb
697
718
  - lib/pact_broker/domain/group.rb
@@ -707,6 +728,7 @@ files:
707
728
  - lib/pact_broker/domain/webhook_execution_result.rb
708
729
  - lib/pact_broker/domain/webhook_request.rb
709
730
  - lib/pact_broker/domain/webhook_request_header.rb
731
+ - lib/pact_broker/error.rb
710
732
  - lib/pact_broker/groups/service.rb
711
733
  - lib/pact_broker/index/service.rb
712
734
  - lib/pact_broker/json.rb
@@ -781,6 +803,7 @@ files:
781
803
  - lib/pact_broker/webhooks/status.rb
782
804
  - lib/pact_broker/webhooks/triggered_webhook.rb
783
805
  - lib/pact_broker/webhooks/webhook.rb
806
+ - lib/pact_broker/webhooks/webhook_event.rb
784
807
  - lib/rack/hal_browser.rb
785
808
  - lib/rack/hal_browser/redirect.rb
786
809
  - lib/rack/pact_broker/accepts_html_filter.rb
@@ -818,18 +841,23 @@ files:
818
841
  - public/javascripts/jquery-2.1.1.min.js
819
842
  - public/javascripts/jquery.tablesorter.js
820
843
  - public/javascripts/jquery.tablesorter.min.js
844
+ - public/javascripts/matrix.js
821
845
  - public/javascripts/pact.js
822
846
  - public/js/bootstrap.js
823
847
  - public/js/bootstrap.min.js
824
848
  - public/stylesheets/github-json.css
825
849
  - public/stylesheets/github.css
826
850
  - public/stylesheets/index.css
851
+ - public/stylesheets/matrix.css
827
852
  - public/stylesheets/pact.css
828
853
  - script/db-spec.sh
854
+ - script/foo-bar-verification.json
829
855
  - script/foo-bar.json
856
+ - script/insert-self-signed-certificate-from-url.rb
830
857
  - script/publish-2.sh
831
858
  - script/publish-new.sh
832
859
  - script/publish-not-a-pact.sh
860
+ - script/publish-verification.sh
833
861
  - script/publish.sh
834
862
  - script/recreate-pg-db.sh
835
863
  - script/release.sh
@@ -852,6 +880,7 @@ files:
852
880
  - spec/features/get_latest_tagged_pact_spec.rb
853
881
  - spec/features/get_latest_untagged_pact_badge_spec.rb
854
882
  - spec/features/get_latest_untagged_pact_spec.rb
883
+ - spec/features/get_matrix_badge_spec.rb
855
884
  - spec/features/get_matrix_for_consumer_and_provider_spec.rb
856
885
  - spec/features/get_matrix_spec.rb
857
886
  - spec/features/get_pact_spec.rb
@@ -874,6 +903,12 @@ files:
874
903
  - spec/fixtures/a_consumer-a_provider-conflict.json
875
904
  - spec/fixtures/a_consumer-a_provider-merged.json
876
905
  - spec/fixtures/a_consumer-a_provider.json
906
+ - spec/fixtures/certificate-invalid.pem
907
+ - spec/fixtures/certificate.pem
908
+ - spec/fixtures/certificates/cacert.pem
909
+ - spec/fixtures/certificates/cert.pem
910
+ - spec/fixtures/certificates/key.pem
911
+ - spec/fixtures/certificates/self-signed.badssl.com.pem
877
912
  - spec/fixtures/consumer-provider.json
878
913
  - spec/fixtures/renderer_pact.json
879
914
  - spec/fixtures/update_pacticipant.json
@@ -883,6 +918,7 @@ files:
883
918
  - spec/integration/app_spec.rb
884
919
  - spec/integration/endpoints/group_spec.rb
885
920
  - spec/integration/ui/index_spec.rb
921
+ - spec/integration/webhooks/certificate_spec.rb
886
922
  - spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb
887
923
  - spec/lib/pact_broker/api/contracts/verification_contract_spec.rb
888
924
  - spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb
@@ -915,6 +951,7 @@ files:
915
951
  - spec/lib/pact_broker/api/resources/group_spec.rb
916
952
  - spec/lib/pact_broker/api/resources/latest_pact_spec.rb
917
953
  - spec/lib/pact_broker/api/resources/latest_verifications_for_consumer_version_spec.rb
954
+ - spec/lib/pact_broker/api/resources/matrix_badge_spec.rb
918
955
  - spec/lib/pact_broker/api/resources/matrix_spec.rb
919
956
  - spec/lib/pact_broker/api/resources/pact_spec.rb
920
957
  - spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb
@@ -928,6 +965,7 @@ files:
928
965
  - spec/lib/pact_broker/api/resources/webhooks_spec.rb
929
966
  - spec/lib/pact_broker/app_spec.rb
930
967
  - spec/lib/pact_broker/badges/service_spec.rb
968
+ - spec/lib/pact_broker/certificates/service_spec.rb
931
969
  - spec/lib/pact_broker/config/load_spec.rb
932
970
  - spec/lib/pact_broker/config/save_and_load_spec.rb
933
971
  - spec/lib/pact_broker/config/save_spec.rb
@@ -1006,8 +1044,10 @@ files:
1006
1044
  - spec/support/rspec_match_hash.rb
1007
1045
  - spec/support/rspec_matchers.rb
1008
1046
  - spec/support/shared_examples_for_responses.rb
1047
+ - spec/support/ssl_webhook_server.rb
1009
1048
  - spec/support/test_data_builder.rb
1010
1049
  - tasks/database.rb
1050
+ - tasks/database/table_dependency_calculator.rb
1011
1051
  - tasks/db.rake
1012
1052
  - tasks/pact.rake
1013
1053
  - tasks/release.rake
@@ -1051,7 +1091,7 @@ files:
1051
1091
  - vendor/hal-browser/vendor/js/jquery-1.10.2.min.map
1052
1092
  - vendor/hal-browser/vendor/js/underscore.js
1053
1093
  - vendor/hal-browser/vendor/js/uritemplates.js
1054
- homepage: https://github.com/bethesque/pact_broker
1094
+ homepage: https://github.com/pact-foundation/pact_broker
1055
1095
  licenses:
1056
1096
  - MIT
1057
1097
  metadata: {}
@@ -1091,6 +1131,7 @@ test_files:
1091
1131
  - spec/features/get_latest_tagged_pact_spec.rb
1092
1132
  - spec/features/get_latest_untagged_pact_badge_spec.rb
1093
1133
  - spec/features/get_latest_untagged_pact_spec.rb
1134
+ - spec/features/get_matrix_badge_spec.rb
1094
1135
  - spec/features/get_matrix_for_consumer_and_provider_spec.rb
1095
1136
  - spec/features/get_matrix_spec.rb
1096
1137
  - spec/features/get_pact_spec.rb
@@ -1113,6 +1154,12 @@ test_files:
1113
1154
  - spec/fixtures/a_consumer-a_provider-conflict.json
1114
1155
  - spec/fixtures/a_consumer-a_provider-merged.json
1115
1156
  - spec/fixtures/a_consumer-a_provider.json
1157
+ - spec/fixtures/certificate-invalid.pem
1158
+ - spec/fixtures/certificate.pem
1159
+ - spec/fixtures/certificates/cacert.pem
1160
+ - spec/fixtures/certificates/cert.pem
1161
+ - spec/fixtures/certificates/key.pem
1162
+ - spec/fixtures/certificates/self-signed.badssl.com.pem
1116
1163
  - spec/fixtures/consumer-provider.json
1117
1164
  - spec/fixtures/renderer_pact.json
1118
1165
  - spec/fixtures/update_pacticipant.json
@@ -1122,6 +1169,7 @@ test_files:
1122
1169
  - spec/integration/app_spec.rb
1123
1170
  - spec/integration/endpoints/group_spec.rb
1124
1171
  - spec/integration/ui/index_spec.rb
1172
+ - spec/integration/webhooks/certificate_spec.rb
1125
1173
  - spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb
1126
1174
  - spec/lib/pact_broker/api/contracts/verification_contract_spec.rb
1127
1175
  - spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb
@@ -1154,6 +1202,7 @@ test_files:
1154
1202
  - spec/lib/pact_broker/api/resources/group_spec.rb
1155
1203
  - spec/lib/pact_broker/api/resources/latest_pact_spec.rb
1156
1204
  - spec/lib/pact_broker/api/resources/latest_verifications_for_consumer_version_spec.rb
1205
+ - spec/lib/pact_broker/api/resources/matrix_badge_spec.rb
1157
1206
  - spec/lib/pact_broker/api/resources/matrix_spec.rb
1158
1207
  - spec/lib/pact_broker/api/resources/pact_spec.rb
1159
1208
  - spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb
@@ -1167,6 +1216,7 @@ test_files:
1167
1216
  - spec/lib/pact_broker/api/resources/webhooks_spec.rb
1168
1217
  - spec/lib/pact_broker/app_spec.rb
1169
1218
  - spec/lib/pact_broker/badges/service_spec.rb
1219
+ - spec/lib/pact_broker/certificates/service_spec.rb
1170
1220
  - spec/lib/pact_broker/config/load_spec.rb
1171
1221
  - spec/lib/pact_broker/config/save_and_load_spec.rb
1172
1222
  - spec/lib/pact_broker/config/save_spec.rb
@@ -1245,4 +1295,5 @@ test_files:
1245
1295
  - spec/support/rspec_match_hash.rb
1246
1296
  - spec/support/rspec_matchers.rb
1247
1297
  - spec/support/shared_examples_for_responses.rb
1298
+ - spec/support/ssl_webhook_server.rb
1248
1299
  - spec/support/test_data_builder.rb