pact_broker 2.6.0 → 2.7.0.beta.1

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/db/migrations/42_delete_orphan_webhook_data.rb +0 -2
  4. data/db/migrations/43_add_provider_version_to_verification.rb +12 -0
  5. data/db/migrations/44_populate_verifications_provider_version_id.rb +25 -0
  6. data/db/migrations/45_set_verification_provider_number_nullable.rb +7 -0
  7. data/db/migrations/46_recreate_latest_verifications.rb +18 -0
  8. data/db/migrations/47_create_all_verifications.rb +19 -0
  9. data/lib/pact_broker/api.rb +4 -0
  10. data/lib/pact_broker/api/decorators/matrix_decorator.rb +114 -0
  11. data/lib/pact_broker/api/decorators/verification_decorator.rb +1 -1
  12. data/lib/pact_broker/api/pact_broker_urls.rb +2 -2
  13. data/lib/pact_broker/api/resources/index.rb +3 -5
  14. data/lib/pact_broker/api/resources/matrix.rb +48 -0
  15. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +42 -0
  16. data/lib/pact_broker/domain/relationship.rb +26 -6
  17. data/lib/pact_broker/domain/verification.rb +5 -1
  18. data/lib/pact_broker/matrix/repository.rb +51 -0
  19. data/lib/pact_broker/matrix/service.rb +50 -0
  20. data/lib/pact_broker/pacticipants/service.rb +21 -5
  21. data/lib/pact_broker/pacts/all_pact_publications.rb +11 -0
  22. data/lib/pact_broker/pacts/pact_publication.rb +4 -0
  23. data/lib/pact_broker/pacts/repository.rb +1 -1
  24. data/lib/pact_broker/repositories.rb +5 -0
  25. data/lib/pact_broker/services.rb +5 -0
  26. data/lib/pact_broker/tags/service.rb +0 -1
  27. data/lib/pact_broker/ui/app.rb +5 -0
  28. data/lib/pact_broker/ui/controllers/matrix.rb +27 -0
  29. data/lib/pact_broker/ui/controllers/relationships.rb +2 -2
  30. data/lib/pact_broker/ui/view_models/matrix_line.rb +79 -0
  31. data/lib/pact_broker/ui/view_models/relationship.rb +22 -4
  32. data/lib/pact_broker/ui/views/matrix/show.haml +42 -0
  33. data/lib/pact_broker/ui/views/relationships/show-prod-tags.haml +83 -0
  34. data/lib/pact_broker/ui/views/relationships/show.haml +1 -1
  35. data/lib/pact_broker/verifications/repository.rb +8 -1
  36. data/lib/pact_broker/verifications/service.rb +2 -1
  37. data/lib/pact_broker/version.rb +1 -1
  38. data/lib/pact_broker/versions/service.rb +7 -0
  39. data/lib/pact_broker/webhooks/status.rb +1 -1
  40. data/lib/rack/pact_broker/convert_file_extension_to_accept_header.rb +1 -1
  41. data/script/seed.rb +5 -0
  42. data/spec/features/get_matrix_for_consumer_and_provider_spec.rb +25 -0
  43. data/spec/features/get_matrix_spec.rb +31 -0
  44. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +133 -0
  45. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +2 -8
  46. data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +3 -2
  47. data/spec/lib/pact_broker/api/resources/matrix_spec.rb +38 -0
  48. data/spec/lib/pact_broker/domain/relationship_spec.rb +1 -1
  49. data/spec/lib/pact_broker/matrix/repository_spec.rb +153 -0
  50. data/spec/lib/pact_broker/matrix/service_spec.rb +46 -0
  51. data/spec/lib/pact_broker/pacticipants/service_spec.rb +78 -4
  52. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +35 -0
  53. data/spec/lib/pact_broker/pacts/repository_spec.rb +16 -14
  54. data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +5 -6
  55. data/spec/lib/pact_broker/verifications/repository_spec.rb +7 -7
  56. data/spec/lib/pact_broker/verifications/service_spec.rb +6 -0
  57. data/spec/lib/pact_broker/versions/service_spec.rb +37 -0
  58. data/spec/lib/pact_broker/webhooks/status_spec.rb +6 -0
  59. data/spec/migrations/44_add_provider_version_to_verification_spec.rb +60 -0
  60. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +12 -0
  61. data/spec/support/shared_examples_for_responses.rb +4 -0
  62. data/spec/support/test_data_builder.rb +26 -3
  63. metadata +34 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9029e88952b1175c690a65568eb507d2acf08c81
4
- data.tar.gz: adf028a7f196fb7e78ae80cec9733fa8eecfc3fe
3
+ metadata.gz: 90467fc2becb470c346b1ebd5be1491fdbdcab06
4
+ data.tar.gz: 055474c47b67937de5c7dae44262cd0b9352b11c
5
5
  SHA512:
6
- metadata.gz: c9454daa54e8d1abe94458d753376f76a3381d7d02041671649426dcd2de243a0f0e6557d18ebec40b4db803b23ae0b70811f9fb19aea1bec7799f30e025f1b2
7
- data.tar.gz: 0efc0461b3d6a84ea6a78ead513ad850427acb31a8c21c6a3f18ac3c741119554037b041f2d9751fec51e88118c137db7f1cff4e6347da5bf769d6437d3cd1e4
6
+ metadata.gz: 509f76090bfc2164c0c2d7e45c7bd0a191c1843f8fbc4966dcc097c4a154625e756cb52f659751969938b55018684b10c4313e7a3c202495fbaad1120127b215
7
+ data.tar.gz: 6f8c7ffffc1343040ce1f2ae9e96114bc13ba4bb01cd1ef02ff6104a4282015ef04a1d23110e63123b70b09864e34897c6bc525ee7018ff6cd4e5df913616603
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ <a name="v2.7.0.beta.1"></a>
2
+ ### v2.7.0.beta.1 (2017-10-16)
3
+
4
+ #### Features
5
+
6
+ * **prod pacts in index**
7
+ * show pacts tagged as the 'prod' or 'production' versions on the index page ([b58b7a3](/../../commit/b58b7a3))
8
+
1
9
  <a name="v2.6.0"></a>
2
10
  ### v2.6.0 (2017-10-06)
3
11
 
@@ -1,5 +1,3 @@
1
- require 'securerandom'
2
-
3
1
  Sequel.migration do
4
2
  up do
5
3
  from(:triggered_webhooks).where(webhook_id: nil).each do | triggered_webhook |
@@ -0,0 +1,12 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:verifications) do
4
+ add_foreign_key(:provider_version_id, :versions, foreign_key_constraint_name: 'fk_verifications_versions')
5
+ end
6
+ end
7
+
8
+ # TODO
9
+ # alter_table(:verifications) do
10
+ # set_column_not_null(:provider_version_id)
11
+ # end
12
+ end
@@ -0,0 +1,25 @@
1
+ Sequel.migration do
2
+ up do
3
+ from(:verifications)
4
+ .select(Sequel[:verifications][:id], :provider_version, :provider_id, Sequel[:verifications][:created_at])
5
+ .join(:pact_versions, {id: :pact_version_id})
6
+ .each do | line |
7
+ version = from(:versions)
8
+ .where(number: line[:provider_version], pacticipant_id: line[:provider_id]).single_record
9
+ version_id = if version
10
+ version[:id]
11
+ else
12
+ from(:versions).insert(
13
+ number: line[:provider_version],
14
+ pacticipant_id: line[:provider_id],
15
+ created_at: line[:created_at],
16
+ updated_at: line[:created_at]
17
+ )
18
+ end
19
+ from(:verifications).where(id: line[:id]).update(provider_version_id: version_id)
20
+ end
21
+ end
22
+
23
+ down do
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:verifications) do
4
+ set_column_allow_null(:provider_version)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_or_replace_view(:latest_verification_numbers,
4
+ "SELECT pact_version_id, MAX(number) latest_number
5
+ FROM verifications
6
+ GROUP BY pact_version_id")
7
+
8
+ # The most recent verification for each pact version
9
+ # provider_version is DEPRECATED, use provider_version_number
10
+ create_or_replace_view(:latest_verifications,
11
+ "SELECT v.id, v.number, v.success, s.number as provider_version, v.build_url, v.pact_version_id, v.execution_date, v.created_at, v.provider_version_id, s.number as provider_version_number
12
+ FROM verifications v
13
+ INNER JOIN latest_verification_numbers lv
14
+ ON v.pact_version_id = lv.pact_version_id AND v.number = lv.latest_number
15
+ INNER JOIN versions s on v.provider_version_id = s.id"
16
+ )
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ Sequel.migration do
2
+ up do
3
+ # provider_version is DEPRECATED, use provider_version_number
4
+ create_or_replace_view(:all_verifications,
5
+ from(:verifications).select(
6
+ Sequel[:verifications][:id],
7
+ Sequel[:verifications][:number],
8
+ :success,
9
+ :provider_version_id,
10
+ Sequel[:v][:number].as(:provider_version_number),
11
+ Sequel[:v][:order].as(:provider_version_order),
12
+ :build_url,
13
+ :pact_version_id,
14
+ :execution_date,
15
+ Sequel[:verifications][:created_at]
16
+ ).join(:versions, {id: :provider_version_id}, {:table_alias => :v})
17
+ )
18
+ end
19
+ end
@@ -59,6 +59,10 @@ module PactBroker
59
59
  add ['relationships'], Api::Resources::Relationships, {resource_name: "relationships"}
60
60
  add ['groups', :pacticipant_name], Api::Resources::Group, {resource_name: "group"}
61
61
 
62
+ # matrix
63
+ add ['matrix', 'provider', :provider_name, 'consumer', :consumer_name], Api::Resources::MatrixForConsumerAndProvider, {resource_name: "matrix_consumer_provider"}
64
+ add ['matrix'], Api::Resources::Matrix, {resource_name: "matrix"}
65
+
62
66
  add [], Api::Resources::Index, {resource_name: "index"}
63
67
  end
64
68
  end
@@ -0,0 +1,114 @@
1
+ require 'ostruct'
2
+ require 'pact_broker/api/pact_broker_urls'
3
+
4
+ module PactBroker
5
+ module Api
6
+ module Decorators
7
+ class MatrixPactDecorator
8
+ include PactBroker::Api::PactBrokerUrls
9
+
10
+ def initialize(lines)
11
+ @lines = lines
12
+ end
13
+
14
+ def to_json(options)
15
+ to_hash(options).to_json
16
+ end
17
+
18
+ def to_hash(options)
19
+ {
20
+ matrix: matrix(lines, options[:user_options][:base_url])
21
+ }
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :lines
27
+
28
+ def matrix(lines, base_url)
29
+ provider = nil
30
+ consumer = nil
31
+ lines.collect do | line |
32
+ provider ||= OpenStruct.new(name: line[:provider_name])
33
+ consumer ||= OpenStruct.new(name: line[:consumer_name])
34
+ consumer_version = OpenStruct.new(number: line[:consumer_version_number], pacticipant: consumer)
35
+ line_hash(consumer, provider, consumer_version, line, base_url)
36
+ end
37
+ end
38
+
39
+ def line_hash(consumer, provider, consumer_version, line, base_url)
40
+ {
41
+ consumer: consumer_hash(line, consumer, consumer_version, base_url),
42
+ provider: provider_hash(line, provider, base_url),
43
+ pact: pact_hash(line, base_url),
44
+ verificationResult: verification_hash(line, base_url)
45
+ }
46
+ end
47
+
48
+ def consumer_hash(line, consumer, consumer_version, base_url)
49
+ {
50
+ name: line[:consumer_name],
51
+ version: {
52
+ number: line[:consumer_version_number],
53
+ _links: {
54
+ self: {
55
+ href: version_url(base_url, consumer_version)
56
+ }
57
+ }
58
+ },
59
+ _links: {
60
+ self: {
61
+ href: pacticipant_url(base_url, consumer)
62
+ }
63
+ }
64
+ }
65
+ end
66
+
67
+ def provider_hash(line, provider, base_url)
68
+ hash = {
69
+ name: line[:provider_name],
70
+ version: nil,
71
+ _links: {
72
+ self: {
73
+ href: pacticipant_url(base_url, provider)
74
+ }
75
+ }
76
+ }
77
+
78
+ if !line[:provider_version_number].nil?
79
+ hash[:version] = { number: line[:provider_version_number] }
80
+ end
81
+
82
+ hash
83
+ end
84
+
85
+ def pact_hash(line, base_url)
86
+ {
87
+ createdAt: line[:pact_created_at].to_datetime.xmlschema,
88
+ _links: {
89
+ self: {
90
+ href: pact_url_from_params(base_url, line)
91
+ }
92
+ }
93
+ }
94
+ end
95
+
96
+ def verification_hash(line, base_url)
97
+ if !line[:success].nil?
98
+ {
99
+ success: line[:success],
100
+ verifiedAt: line[:verification_executed_at].to_datetime.xmlschema,
101
+ _links: {
102
+ self: {
103
+ href: verification_url(OpenStruct.new(line), base_url)
104
+ }
105
+ }
106
+ }
107
+ else
108
+ nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -6,7 +6,7 @@ module PactBroker
6
6
  class VerificationDecorator < BaseDecorator
7
7
 
8
8
  property :provider_name, as: :providerName, writeable: :false
9
- property :provider_version, as: :providerApplicationVersion
9
+ property :provider_version_number, as: :providerApplicationVersion, writeable: false
10
10
  property :success
11
11
  property :execution_date, as: :verificationDate
12
12
  property :build_url, as: :buildUrl
@@ -76,11 +76,11 @@ module PactBroker
76
76
  ].join('/')
77
77
  end
78
78
 
79
- def verification_url verification, base_url
79
+ def verification_url verification, base_url = ''
80
80
  [ base_url, 'pacts',
81
81
  'provider', url_encode(verification.provider_name),
82
82
  'consumer', url_encode(verification.consumer_name),
83
- 'pact-version', verification.pact_version.sha,
83
+ 'pact-version', verification.pact_version_sha,
84
84
  'verification-results', verification.number
85
85
  ].join('/')
86
86
  end
@@ -58,7 +58,8 @@ module PactBroker
58
58
  href: base_url + '/webhooks',
59
59
  title: 'Webhooks',
60
60
  templated: false
61
- },'curies' =>
61
+ },
62
+ 'curies' =>
62
63
  [{
63
64
  name: 'pb',
64
65
  href: base_url + '/doc/{rel}',
@@ -67,10 +68,7 @@ module PactBroker
67
68
  }
68
69
  }.to_json
69
70
  end
70
-
71
-
72
71
  end
73
72
  end
74
-
75
73
  end
76
- end
74
+ end
@@ -0,0 +1,48 @@
1
+ require 'pact_broker/api/resources/base_resource'
2
+ require 'pact_broker/api/decorators/matrix_decorator'
3
+ require 'cgi'
4
+
5
+ module PactBroker
6
+ module Api
7
+ module Resources
8
+ class Matrix < BaseResource
9
+
10
+ def content_types_provided
11
+ [["application/hal+json", :to_json]]
12
+ end
13
+
14
+ def allowed_methods
15
+ ["GET"]
16
+ end
17
+
18
+ def malformed_request?
19
+ error_messages = matrix_service.validate_selectors(selectors)
20
+ if error_messages.any?
21
+ set_json_validation_error_messages error_messages
22
+ true
23
+ else
24
+ false
25
+ end
26
+ end
27
+
28
+ def to_json
29
+ criteria = selected_versions.each_with_object({}) { | version, hash | hash[version.pacticipant.name] = version.number }
30
+ lines = matrix_service.find_compatible_pacticipant_versions(criteria)
31
+ PactBroker::Api::Decorators::MatrixPactDecorator.new(lines).to_json(user_options: { base_url: base_url })
32
+ end
33
+
34
+ def selectors
35
+ @selectors ||= CGI.parse(CGI.unescape(request.uri.query))['selectors[]']
36
+ end
37
+
38
+ def version_selectors
39
+ @version_selectors ||= selectors.select{ | selector| selector.include?("/version/") }
40
+ end
41
+
42
+ def selected_versions
43
+ @selected_versions ||= version_service.find_versions_by_selector(version_selectors)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ require 'pact_broker/api/resources/base_resource'
2
+ require 'pact_broker/api/decorators/matrix_decorator'
3
+
4
+ module PactBroker
5
+ module Api
6
+ module Resources
7
+ class MatrixForConsumerAndProvider < BaseResource
8
+
9
+ def content_types_provided
10
+ [["application/hal+json", :to_json]]
11
+ end
12
+
13
+ def allowed_methods
14
+ ["GET"]
15
+ end
16
+
17
+ def resource_exists?
18
+ consumer && provider
19
+ end
20
+
21
+ def to_json
22
+ lines = matrix_service.find(identifier_from_path)
23
+ PactBroker::Api::Decorators::MatrixPactDecorator.new(lines).to_json(user_options: { base_url: base_url })
24
+ end
25
+
26
+ def consumer
27
+ @consumer ||= find_pacticipant(identifier_from_path[:consumer_name], "consumer")
28
+ end
29
+
30
+ def provider
31
+ @provider ||= find_pacticipant(identifier_from_path[:provider_name], "provider")
32
+ end
33
+
34
+ def find_pacticipant name, role
35
+ pacticipant_service.find_pacticipant_by_name(name).tap do | pacticipant |
36
+ set_json_error_message("No #{role} with name '#{name}' found") if pacticipant.nil?
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -7,22 +7,26 @@ module PactBroker
7
7
 
8
8
  attr_reader :consumer, :provider, :latest_pact, :latest_verification, :webhooks
9
9
 
10
- def initialize consumer, provider, latest_pact = nil, latest_verification = nil, webhooks = [], triggered_webhooks = []
10
+ def initialize consumer, provider, latest_pact = nil, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = []
11
11
  @consumer = consumer
12
12
  @provider = provider
13
13
  @latest_pact = latest_pact
14
+ @latest = latest
14
15
  @latest_verification = latest_verification
15
16
  @webhooks = webhooks
16
17
  @triggered_webhooks = triggered_webhooks
18
+ @tags = tags
17
19
  end
18
20
 
19
- def self.create consumer, provider, latest_pact, latest_verification, webhooks = [], triggered_webhooks = []
20
- new consumer, provider, latest_pact, latest_verification, webhooks, triggered_webhooks
21
+ def self.create consumer, provider, latest_pact, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = []
22
+ new consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags
21
23
  end
22
24
 
23
25
  def eq? other
24
26
  Relationship === other && other.consumer == consumer && other.provider == provider &&
25
- other.latest_pact == latest_pact && other.latest_verification == latest_verification &&
27
+ other.latest_pact == latest_pact &&
28
+ other.latest? == latest? &&
29
+ other.latest_verification == latest_verification &&
26
30
  other.webhooks == webhooks
27
31
  end
28
32
 
@@ -42,6 +46,22 @@ module PactBroker
42
46
  @latest_pact
43
47
  end
44
48
 
49
+ def latest?
50
+ @latest
51
+ end
52
+
53
+ def consumer_version_number
54
+ @latest_pact.consumer_version_number
55
+ end
56
+
57
+ def provider_version_number
58
+ @latest_verification ? @latest_verification.provider_version_number : nil
59
+ end
60
+
61
+ def tag_names
62
+ @tags
63
+ end
64
+
45
65
  def any_webhooks?
46
66
  @webhooks.any?
47
67
  end
@@ -74,8 +94,8 @@ module PactBroker
74
94
  latest_verification.pact_version_sha != latest_pact.pact_version_sha
75
95
  end
76
96
 
77
- def latest_verification_provider_version
78
- latest_verification.provider_version
97
+ def latest_verification_provider_version_number
98
+ latest_verification.provider_version.number
79
99
  end
80
100
 
81
101
  def pacticipants