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

Sign up to get free protection for your applications and to get access to all the features.
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