pact_broker 2.0.0.beta.6 → 2.0.0.beta.7

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +12 -12
  4. data/db/migrations/08_create_latest_pact_view.rb +4 -4
  5. data/db/migrations/14_add_timestamps_to_pact_views.rb +5 -4
  6. data/db/migrations/20_add_pact_version_content_sha_to_all_pacts_view.rb +12 -10
  7. data/db/migrations/28_create_all_pact_publications.rb +6 -5
  8. data/lib/pact_broker/api/decorators/verification_decorator.rb +0 -3
  9. data/lib/pact_broker/api/decorators/verification_summary_decorator.rb +36 -0
  10. data/lib/pact_broker/api/decorators/versions_decorator.rb +1 -1
  11. data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +5 -5
  12. data/lib/pact_broker/api/resources/versions.rb +1 -1
  13. data/lib/pact_broker/app.rb +2 -0
  14. data/lib/pact_broker/configuration.rb +6 -1
  15. data/lib/pact_broker/domain/order_versions.rb +15 -5
  16. data/lib/pact_broker/domain/verification.rb +1 -1
  17. data/lib/pact_broker/domain/webhook.rb +0 -1
  18. data/lib/pact_broker/domain/webhook_request.rb +6 -4
  19. data/lib/pact_broker/logging.rb +4 -0
  20. data/lib/pact_broker/pacticipants/repository.rb +3 -2
  21. data/lib/pact_broker/pacticipants/service.rb +12 -9
  22. data/lib/pact_broker/pacts/all_pact_publications.rb +2 -2
  23. data/lib/pact_broker/pacts/repository.rb +11 -2
  24. data/lib/pact_broker/pacts/service.rb +4 -0
  25. data/lib/pact_broker/tags/repository.rb +5 -5
  26. data/lib/pact_broker/verifications/repository.rb +4 -3
  27. data/lib/pact_broker/verifications/service.rb +8 -0
  28. data/lib/pact_broker/verifications/summary_for_consumer_version.rb +41 -0
  29. data/lib/pact_broker/version.rb +1 -1
  30. data/lib/pact_broker/versions/parse_semantic_version.rb +14 -4
  31. data/lib/pact_broker/versions/repository.rb +1 -1
  32. data/lib/pact_broker/webhooks/job.rb +46 -0
  33. data/lib/pact_broker/webhooks/service.rb +9 -8
  34. data/lib/pact_broker/webhooks/webhook.rb +1 -1
  35. data/pact_broker.gemspec +4 -3
  36. data/pact_broker_client-pact_broker.json +4 -4
  37. data/script/foo-bar.json +22 -0
  38. data/script/publish-new.sh +7 -0
  39. data/script/publish.sh +2 -2
  40. data/script/recreate-pg-db.sh +10 -0
  41. data/spec/features/get_verifications_for_consumer_version_spec.rb +1 -1
  42. data/spec/fixtures/a_consumer-a_provider-2.json +1 -1
  43. data/spec/fixtures/a_consumer-a_provider-3.json +1 -1
  44. data/spec/fixtures/a_consumer-a_provider-conflict.json +1 -1
  45. data/spec/fixtures/a_consumer-a_provider-merged.json +2 -2
  46. data/spec/fixtures/a_consumer-a_provider.json +1 -1
  47. data/spec/fixtures/consumer-provider.json +1 -1
  48. data/spec/fixtures/renderer_pact.json +1 -1
  49. data/spec/lib/pact_broker/api/decorators/{verifications_decorator_spec.rb → verification_summary_decorator_spec.rb} +16 -13
  50. data/spec/lib/pact_broker/api/resources/latest_verifications_for_consumer_version_spec.rb +5 -5
  51. data/spec/lib/pact_broker/domain/order_versions_spec.rb +30 -10
  52. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +3 -1
  53. data/spec/lib/pact_broker/pacticipants/repository_spec.rb +16 -0
  54. data/spec/lib/pact_broker/pacticipants/service_spec.rb +74 -24
  55. data/spec/lib/pact_broker/verifications/summary_for_consumer_version_spec.rb +72 -0
  56. data/spec/lib/pact_broker/versions/parse_semantic_version_spec.rb +5 -2
  57. data/spec/lib/pact_broker/webhooks/job_spec.rb +67 -0
  58. data/spec/lib/pact_broker/webhooks/service_spec.rb +40 -3
  59. data/spec/support/provider_state_builder.rb +3 -2
  60. data/tasks/db.rake +3 -2
  61. metadata +35 -14
  62. data/lib/pact_broker/api/decorators/verifications_decorator.rb +0 -30
  63. data/lib/pact_broker/pacts/all_pacts.rb +0 -12
  64. data/lib/pact_broker/pacts/latest_pacts.rb +0 -12
@@ -22,10 +22,13 @@ module PactBroker
22
22
  expect(subject).to be < ParseSemanticVersion.call("1.3.1")
23
23
  end
24
24
 
25
+ it "allows versions with one or two parts for backwards compatibility" do
26
+ expect(ParseSemanticVersion.call("1")).to eq ::SemVer.new(1,0,0)
27
+ expect(ParseSemanticVersion.call("1.2")).to eq ::SemVer.new(1,2,0)
28
+ end
29
+
25
30
  it "returns nil when version is invalid" do
26
31
  expect(ParseSemanticVersion.call("abc")).to be_nil
27
- expect(ParseSemanticVersion.call("1")).to be_nil
28
- expect(ParseSemanticVersion.call("1.2")).to be_nil
29
32
  end
30
33
 
31
34
  it "accepts semver metadata" do
@@ -0,0 +1,67 @@
1
+ require 'pact_broker/webhooks/job'
2
+
3
+ module PactBroker
4
+ module Webhooks
5
+ describe Job do
6
+
7
+ before do
8
+ allow(PactBroker::Webhooks::Service).to receive(:execute_webhook_now)
9
+ end
10
+
11
+ let(:webhook) { double("webhook", uuid: '1234') }
12
+
13
+ context "when an error occurs for the first time" do
14
+ before do
15
+ allow(PactBroker::Webhooks::Service).to receive(:execute_webhook_now).and_raise("an error")
16
+ end
17
+
18
+ it "reschedules the job in 10 seconds" do
19
+ expect(Job).to receive(:perform_in).with(10, {webhook: webhook, error_count: 1})
20
+ Job.new.perform(webhook: webhook)
21
+ end
22
+ end
23
+
24
+ context "when the webhook execution result is not successful for the first time" do
25
+ before do
26
+ allow(PactBroker::Webhooks::Service).to receive(:execute_webhook_now).and_return(instance_double("PactBroker::Domain::WebhookExecutionResult", success?: false))
27
+ end
28
+
29
+ it "reschedules the job in 10 seconds" do
30
+ expect(Job).to receive(:perform_in).with(10, {webhook: webhook, error_count: 1})
31
+ Job.new.perform(webhook: webhook)
32
+ end
33
+ end
34
+
35
+ context "when an error occurs for the second time" do
36
+ before do
37
+ allow(PactBroker::Webhooks::Service).to receive(:execute_webhook_now).and_raise("an error")
38
+ end
39
+
40
+ it "reschedules the job in 60 seconds" do
41
+ expect(Job).to receive(:perform_in).with(60, {webhook: webhook, error_count: 2 })
42
+ Job.new.perform(webhook: webhook, error_count: 1)
43
+ end
44
+ end
45
+
46
+ context "when an error occurs for the last time" do
47
+ before do
48
+ allow(PactBroker::Webhooks::Service).to receive(:execute_webhook_now).and_raise("an error")
49
+ end
50
+
51
+ subject { Job.new.perform(webhook: webhook, error_count: 6) }
52
+
53
+ it "does not reschedule the job" do
54
+ expect(Job).to_not receive(:perform_in)
55
+ subject
56
+ end
57
+
58
+ it "logs that it has failed" do
59
+ allow(Job.logger).to receive(:error)
60
+ expect(Job.logger).to receive(:error).with(/Failed to execute/)
61
+ subject
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -1,5 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'pact_broker/webhooks/service'
3
+ require 'webmock/rspec'
4
+ require 'sucker_punch/testing/inline'
3
5
 
4
6
  module PactBroker
5
7
 
@@ -12,11 +14,11 @@ module PactBroker
12
14
  let(:consumer_version) { PactBroker::Domain::Version.new(number: '1.2.3') }
13
15
  let(:consumer) { PactBroker::Domain::Pacticipant.new(name: 'Consumer') }
14
16
  let(:provider) { PactBroker::Domain::Pacticipant.new(name: 'Provider') }
15
- let(:webhooks) { [instance_double(PactBroker::Domain::Webhook)]}
17
+ let(:webhooks) { [instance_double(PactBroker::Domain::Webhook, description: 'description', uuid: '1244')]}
16
18
 
17
19
  before do
18
20
  allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider).and_return(webhooks)
19
- allow(Service).to receive(:run_later)
21
+ allow(Job).to receive(:perform_async)
20
22
  end
21
23
 
22
24
  subject { Service.execute_webhooks pact }
@@ -45,7 +47,42 @@ module PactBroker
45
47
  subject
46
48
  end
47
49
  end
50
+
51
+ context "when there is a scheduling error" do
52
+ before do
53
+ allow(Job).to receive(:perform_async).and_raise("an error")
54
+ end
55
+
56
+ it "logs the error" do
57
+ allow(Service.logger).to receive(:error)
58
+ expect(Service.logger).to receive(:error).with(/an error/)
59
+ subject
60
+ end
61
+ end
62
+ end
63
+
64
+ describe ".execute_webhooks integration test" do
65
+ let!(:http_request) do
66
+ stub_request(:get, "http://example.org").
67
+ to_return(:status => 200)
68
+ end
69
+
70
+ let(:pact) do
71
+ ProviderStateBuilder.new
72
+ .create_consumer
73
+ .create_provider
74
+ .create_consumer_version
75
+ .create_pact
76
+ .create_webhook(method: 'GET', url: 'http://example.org')
77
+ .and_return(:pact)
78
+ end
79
+
80
+
81
+ it "executes the HTTP request of the webhook" do
82
+ PactBroker::Webhooks::Service.execute_webhooks pact
83
+ expect(http_request).to have_been_made
84
+ end
48
85
  end
49
86
  end
50
87
  end
51
- end
88
+ end
@@ -144,8 +144,9 @@ class ProviderStateBuilder
144
144
  self
145
145
  end
146
146
 
147
- def create_webhook
148
- request = PactBroker::Domain::WebhookRequest.new(method: 'POST', url: 'http://example.org', headers: {'Content-Type' => 'application/json'})
147
+ def create_webhook params = {}
148
+ default_params = {method: 'POST', url: 'http://example.org', headers: {'Content-Type' => 'application/json'}}
149
+ request = PactBroker::Domain::WebhookRequest.new(default_params.merge(params))
149
150
  @webhook = PactBroker::Webhooks::Repository.new.create PactBroker::Webhooks::Service.next_uuid, PactBroker::Domain::Webhook.new(request: request), @consumer, @provider
150
151
  self
151
152
  end
@@ -26,8 +26,9 @@ namespace :db do
26
26
  end
27
27
 
28
28
  desc 'Migrate the Database'
29
- task :migrate => 'db:env' do
30
- PactBroker::Database.migrate
29
+ task :migrate, [:target] => 'db:env' do |t, args|
30
+ target = args[:target] ? args[:target].to_i : nil
31
+ PactBroker::Database.migrate(target)
31
32
  end
32
33
 
33
34
  desc 'Rollback database to specified version'
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.0.0.beta.6
4
+ version: 2.0.0.beta.7
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-05-09 00:00:00.000000000 Z
13
+ date: 2017-05-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -66,14 +66,14 @@ dependencies:
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: 2.2.0
69
+ version: '2.2'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: 2.2.0
76
+ version: '2.2'
77
77
  - !ruby/object:Gem::Dependency
78
78
  name: dry-validation
79
79
  requirement: !ruby/object:Gem::Requirement
@@ -221,21 +221,35 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: '4.0'
223
223
  - !ruby/object:Gem::Dependency
224
- name: sqlite3
224
+ name: sucker_punch
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: '1.3'
230
- type: :development
229
+ version: '2.0'
230
+ type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: '1.3'
236
+ version: '2.0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: sqlite3
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
237
251
  - !ruby/object:Gem::Dependency
238
- name: pry
252
+ name: pry-byebug
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
255
  - - ">="
@@ -457,7 +471,7 @@ files:
457
471
  - lib/pact_broker/api/decorators/tag_decorator.rb
458
472
  - lib/pact_broker/api/decorators/timestamps.rb
459
473
  - lib/pact_broker/api/decorators/verification_decorator.rb
460
- - lib/pact_broker/api/decorators/verifications_decorator.rb
474
+ - lib/pact_broker/api/decorators/verification_summary_decorator.rb
461
475
  - lib/pact_broker/api/decorators/version_decorator.rb
462
476
  - lib/pact_broker/api/decorators/versions_decorator.rb
463
477
  - lib/pact_broker/api/decorators/webhook_decorator.rb
@@ -539,12 +553,10 @@ files:
539
553
  - lib/pact_broker/pacticipants/repository.rb
540
554
  - lib/pact_broker/pacticipants/service.rb
541
555
  - lib/pact_broker/pacts/all_pact_publications.rb
542
- - lib/pact_broker/pacts/all_pacts.rb
543
556
  - lib/pact_broker/pacts/create_formatted_diff.rb
544
557
  - lib/pact_broker/pacts/diff.rb
545
558
  - lib/pact_broker/pacts/latest_pact_publications.rb
546
559
  - lib/pact_broker/pacts/latest_pact_publications_by_consumer_version.rb
547
- - lib/pact_broker/pacts/latest_pacts.rb
548
560
  - lib/pact_broker/pacts/latest_tagged_pact_publications.rb
549
561
  - lib/pact_broker/pacts/merger.rb
550
562
  - lib/pact_broker/pacts/pact_params.rb
@@ -578,10 +590,12 @@ files:
578
590
  - lib/pact_broker/verifications/latest_verifications_by_consumer_version.rb
579
591
  - lib/pact_broker/verifications/repository.rb
580
592
  - lib/pact_broker/verifications/service.rb
593
+ - lib/pact_broker/verifications/summary_for_consumer_version.rb
581
594
  - lib/pact_broker/version.rb
582
595
  - lib/pact_broker/versions/parse_semantic_version.rb
583
596
  - lib/pact_broker/versions/repository.rb
584
597
  - lib/pact_broker/versions/service.rb
598
+ - lib/pact_broker/webhooks/job.rb
585
599
  - lib/pact_broker/webhooks/repository.rb
586
600
  - lib/pact_broker/webhooks/service.rb
587
601
  - lib/pact_broker/webhooks/webhook.rb
@@ -614,10 +628,13 @@ files:
614
628
  - public/stylesheets/github.css
615
629
  - public/stylesheets/pact.css
616
630
  - public/stylesheets/relationships.css
631
+ - script/foo-bar.json
617
632
  - script/publish-2.sh
633
+ - script/publish-new.sh
618
634
  - script/publish-not-a-pact.sh
619
635
  - script/publish.sh
620
636
  - script/record_verification.sh
637
+ - script/recreate-pg-db.sh
621
638
  - script/update-hal-browser
622
639
  - spec/features/create_webhook_spec.rb
623
640
  - spec/features/delete_pact_spec.rb
@@ -662,7 +679,7 @@ files:
662
679
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
663
680
  - spec/lib/pact_broker/api/decorators/tag_decorator_spec.rb
664
681
  - spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb
665
- - spec/lib/pact_broker/api/decorators/verifications_decorator_spec.rb
682
+ - spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb
666
683
  - spec/lib/pact_broker/api/decorators/version_decorator_spec.rb
667
684
  - spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb
668
685
  - spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb
@@ -715,8 +732,10 @@ files:
715
732
  - spec/lib/pact_broker/ui/view_models/relationships_spec.rb
716
733
  - spec/lib/pact_broker/verifications/repository_spec.rb
717
734
  - spec/lib/pact_broker/verifications/service_spec.rb
735
+ - spec/lib/pact_broker/verifications/summary_for_consumer_version_spec.rb
718
736
  - spec/lib/pact_broker/versions/parse_semantic_version_spec.rb
719
737
  - spec/lib/pact_broker/versions/repository_spec.rb
738
+ - spec/lib/pact_broker/webhooks/job_spec.rb
720
739
  - spec/lib/pact_broker/webhooks/repository_spec.rb
721
740
  - spec/lib/pact_broker/webhooks/service_spec.rb
722
741
  - spec/lib/rack/hal_browser/redirect_spec.rb
@@ -842,7 +861,7 @@ test_files:
842
861
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
843
862
  - spec/lib/pact_broker/api/decorators/tag_decorator_spec.rb
844
863
  - spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb
845
- - spec/lib/pact_broker/api/decorators/verifications_decorator_spec.rb
864
+ - spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb
846
865
  - spec/lib/pact_broker/api/decorators/version_decorator_spec.rb
847
866
  - spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb
848
867
  - spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb
@@ -895,8 +914,10 @@ test_files:
895
914
  - spec/lib/pact_broker/ui/view_models/relationships_spec.rb
896
915
  - spec/lib/pact_broker/verifications/repository_spec.rb
897
916
  - spec/lib/pact_broker/verifications/service_spec.rb
917
+ - spec/lib/pact_broker/verifications/summary_for_consumer_version_spec.rb
898
918
  - spec/lib/pact_broker/versions/parse_semantic_version_spec.rb
899
919
  - spec/lib/pact_broker/versions/repository_spec.rb
920
+ - spec/lib/pact_broker/webhooks/job_spec.rb
900
921
  - spec/lib/pact_broker/webhooks/repository_spec.rb
901
922
  - spec/lib/pact_broker/webhooks/service_spec.rb
902
923
  - spec/lib/rack/hal_browser/redirect_spec.rb
@@ -1,30 +0,0 @@
1
- require_relative 'base_decorator'
2
- require_relative 'version_decorator'
3
-
4
- module PactBroker
5
- module Api
6
- module Decorators
7
-
8
- class VerificationsDecorator < BaseDecorator
9
-
10
- property :success, exec_context: :decorator, if: :any_verifications?
11
- collection :entries, as: :'verification-results', embedded: true, :extend => PactBroker::Api::Decorators::VerificationDecorator
12
-
13
- link :self do | context |
14
- {
15
- href: context.fetch(:resource_url),
16
- title: "Latest verification results for consumer #{context.fetch(:consumer_name)} version #{context.fetch(:consumer_version_number)}"
17
- }
18
- end
19
-
20
- def success
21
- represented.collect(&:success).all?
22
- end
23
-
24
- def any_verifications? context
25
- represented.any?
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,12 +0,0 @@
1
- require 'pact_broker/pacts/all_pact_publications'
2
-
3
- module PactBroker
4
- module Pacts
5
-
6
- # See /DEVELOPER_DOCUMENTATION.md for all_pacts view
7
- class AllPacts < AllPactPublications
8
- set_dataset(:all_pacts)
9
- end
10
-
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- require 'pact_broker/pacts/all_pacts'
2
-
3
- module PactBroker
4
- module Pacts
5
-
6
- # See /DEVELOPER_DOCUMENTATION.md for latest_pacts view
7
- class LatestPacts < AllPacts
8
- set_dataset(:latest_pacts)
9
- end
10
-
11
- end
12
- end