pact_broker 2.6.0 → 2.7.0.beta.1

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