pact_broker 2.81.0 → 2.82.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/CHANGELOG.md +30 -0
  4. data/DEVELOPER_SETUP.md +1 -1
  5. data/README.md +7 -5
  6. data/config.ru +3 -28
  7. data/db/migrations/20210722_add_index_to_triggered_webhooks_webhook_uuid.rb +7 -0
  8. data/db/migrations/20210810_set_allow_contract_modification.rb +17 -0
  9. data/docs/CONFIGURATION.md +398 -0
  10. data/docs/configuration.yml +320 -0
  11. data/example/Gemfile +4 -4
  12. data/example/README.md +15 -22
  13. data/example/config.ru +1 -24
  14. data/example/config/pact_broker.yml +9 -0
  15. data/example/config/puma.rb +3 -0
  16. data/lib/db.rb +1 -1
  17. data/lib/pact_broker/api/authorization/resource_access_policy.rb +68 -0
  18. data/lib/pact_broker/api/authorization/resource_access_rules.rb +40 -0
  19. data/lib/pact_broker/api/decorators/deployed_version_decorator.rb +2 -0
  20. data/lib/pact_broker/api/decorators/released_version_decorator.rb +2 -0
  21. data/lib/pact_broker/api/middleware/basic_auth.rb +63 -0
  22. data/lib/pact_broker/api/resources/pact.rb +15 -6
  23. data/lib/pact_broker/api/resources/tag.rb +1 -14
  24. data/lib/pact_broker/app.rb +52 -30
  25. data/lib/pact_broker/config/basic_auth_configuration.rb +38 -0
  26. data/lib/pact_broker/config/load.rb +21 -10
  27. data/lib/pact_broker/config/runtime_configuration.rb +188 -0
  28. data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +41 -0
  29. data/lib/pact_broker/config/runtime_configuration_database_methods.rb +119 -0
  30. data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +61 -0
  31. data/lib/pact_broker/configuration.rb +67 -131
  32. data/lib/pact_broker/contracts/notice.rb +4 -0
  33. data/lib/pact_broker/contracts/service.rb +4 -4
  34. data/lib/pact_broker/db/models.rb +3 -0
  35. data/lib/pact_broker/db/validate_encoding.rb +0 -4
  36. data/lib/pact_broker/deployments/deployed_version.rb +8 -2
  37. data/lib/pact_broker/deployments/deployed_version_service.rb +13 -6
  38. data/lib/pact_broker/deployments/environment.rb +1 -1
  39. data/lib/pact_broker/deployments/released_version.rb +8 -0
  40. data/lib/pact_broker/deployments/released_version_service.rb +12 -0
  41. data/lib/pact_broker/doc/views/provider-pacts-for-verification.markdown +4 -0
  42. data/lib/pact_broker/domain/pacticipant.rb +17 -13
  43. data/lib/pact_broker/domain/verification.rb +4 -22
  44. data/lib/pact_broker/domain/version.rb +9 -5
  45. data/lib/pact_broker/domain/webhook.rb +4 -0
  46. data/lib/pact_broker/error.rb +1 -0
  47. data/lib/pact_broker/errors.rb +1 -1
  48. data/lib/pact_broker/feature_toggle.rb +3 -5
  49. data/lib/pact_broker/hash_refinements.rb +0 -1
  50. data/lib/pact_broker/index/service.rb +4 -6
  51. data/lib/pact_broker/initializers/database_connection.rb +80 -0
  52. data/lib/pact_broker/integrations/integration.rb +5 -0
  53. data/lib/pact_broker/integrations/service.rb +4 -2
  54. data/lib/pact_broker/locale/en.yml +1 -0
  55. data/lib/pact_broker/logging.rb +2 -1
  56. data/lib/pact_broker/matrix/integration.rb +1 -1
  57. data/lib/pact_broker/matrix/parse_can_i_deploy_query.rb +2 -2
  58. data/lib/pact_broker/matrix/quick_row.rb +10 -0
  59. data/lib/pact_broker/matrix/repository.rb +64 -3
  60. data/lib/pact_broker/metrics/service.rb +16 -13
  61. data/lib/pact_broker/pacticipants/repository.rb +4 -0
  62. data/lib/pact_broker/pacticipants/service.rb +9 -1
  63. data/lib/pact_broker/pacts/pact_publication.rb +10 -13
  64. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +6 -1
  65. data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +1 -2
  66. data/lib/pact_broker/pacts/pact_version.rb +25 -11
  67. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +54 -77
  68. data/lib/pact_broker/pacts/selected_pact.rb +1 -1
  69. data/lib/pact_broker/pacts/selector.rb +15 -2
  70. data/lib/pact_broker/pacts/selectors.rb +4 -0
  71. data/lib/pact_broker/pacts/service.rb +4 -0
  72. data/lib/pact_broker/repositories/scopes.rb +12 -1
  73. data/lib/pact_broker/string_refinements.rb +6 -0
  74. data/lib/pact_broker/tags/service.rb +8 -1
  75. data/lib/pact_broker/test/http_test_data_builder.rb +11 -5
  76. data/lib/pact_broker/ui/views/index/_css_and_js.haml +11 -9
  77. data/lib/pact_broker/ui/views/index/_pagination.haml +3 -1
  78. data/lib/pact_broker/ui/views/layouts/main.haml +5 -3
  79. data/lib/pact_broker/ui/views/matrix/show.haml +10 -8
  80. data/lib/pact_broker/verifications/required_verification.rb +28 -0
  81. data/lib/pact_broker/verifications/service.rb +49 -1
  82. data/lib/pact_broker/version.rb +1 -1
  83. data/lib/pact_broker/versions/repository.rb +15 -0
  84. data/lib/pact_broker/versions/service.rb +32 -2
  85. data/lib/pact_broker/webhooks/event_listener.rb +3 -0
  86. data/lib/pact_broker/webhooks/trigger_service.rb +30 -14
  87. data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -0
  88. data/lib/pact_broker/webhooks/webhook.rb +2 -2
  89. data/lib/pact_broker/webhooks/webhook_event.rb +6 -1
  90. data/lib/semantic_logger/formatters/short.rb +29 -0
  91. data/pact_broker.gemspec +1 -0
  92. data/script/data/auto-create-things-for-tags.rb +19 -0
  93. data/script/data/contract-published-requiring-verification.rb +27 -0
  94. data/script/{reproduce-issue-expand-currently-deployed.rb → data/expand-currently-deployed.rb} +0 -0
  95. data/script/docs/generate-configuration-docs.rb +86 -0
  96. data/spec/features/get_latest_pact_badge_spec.rb +1 -0
  97. data/spec/features/get_matrix_badge_spec.rb +1 -0
  98. data/spec/features/publish_pact_spec.rb +21 -7
  99. data/spec/features/wip_pacts_spec.rb +1 -1
  100. data/spec/fixtures/approvals/matrix_integration_environment_spec.approved.json +62 -0
  101. data/spec/fixtures/approvals/matrix_integration_ignore_spec.approved.json +124 -0
  102. data/spec/fixtures/approvals/matrix_integration_spec.approved.json +173 -0
  103. data/spec/fixtures/approvals/publish_contract_no_branch.approved.json +9 -9
  104. data/spec/fixtures/approvals/publish_contract_nothing_exists.approved.json +7 -7
  105. data/spec/fixtures/approvals/publish_contract_nothing_exists_with_webhook.approved.json +5 -5
  106. data/spec/fixtures/approvals/publish_contract_verification_already_exists.approved.json +5 -5
  107. data/spec/lib/pact_broker/api/middleware/basic_auth_spec.rb +312 -0
  108. data/spec/lib/pact_broker/api/resources/tag_spec.rb +14 -39
  109. data/spec/lib/pact_broker/app_basic_auth_spec.rb +122 -0
  110. data/spec/lib/pact_broker/config/load_spec.rb +33 -6
  111. data/spec/lib/pact_broker/config/runtime_configuration_logging_methods_spec.rb +22 -0
  112. data/spec/lib/pact_broker/config/runtime_configuration_spec.rb +71 -0
  113. data/spec/lib/pact_broker/configuration_spec.rb +51 -25
  114. data/spec/lib/pact_broker/errors/error_logger_spec.rb +3 -0
  115. data/spec/lib/pact_broker/feature_toggle_spec.rb +18 -19
  116. data/spec/lib/pact_broker/matrix/integration_environment_spec.rb +12 -0
  117. data/spec/lib/pact_broker/matrix/integration_ignore_spec.rb +15 -3
  118. data/spec/lib/pact_broker/matrix/integration_spec.rb +47 -6
  119. data/spec/lib/pact_broker/matrix/parse_can_i_deploy_query_spec.rb +16 -1
  120. data/spec/lib/pact_broker/matrix/repository_dependency_spec.rb +0 -2
  121. data/spec/lib/pact_broker/matrix/repository_spec.rb +0 -2
  122. data/spec/lib/pact_broker/metrics/service_spec.rb +44 -0
  123. data/spec/lib/pact_broker/pacticipants/service_spec.rb +28 -5
  124. data/spec/lib/pact_broker/pacts/pact_publication_selector_dataset_module_spec.rb +25 -0
  125. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +30 -1
  126. data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +107 -20
  127. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +1 -1
  128. data/spec/lib/pact_broker/tags/service_spec.rb +24 -8
  129. data/spec/lib/pact_broker/verifications/service_spec.rb +146 -0
  130. data/spec/lib/pact_broker/versions/repository_spec.rb +38 -2
  131. data/spec/lib/pact_broker/versions/service_spec.rb +93 -2
  132. data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +54 -2
  133. data/spec/lib/rack/pact_broker/invalid_uri_protection_spec.rb +3 -3
  134. data/spec/spec_helper.rb +2 -1
  135. data/spec/support/approvals.rb +29 -0
  136. metadata +52 -13
  137. data/example/basic_auth/Gemfile +0 -5
  138. data/example/basic_auth/Procfile +0 -1
  139. data/example/basic_auth/README.md +0 -43
  140. data/example/basic_auth/config.ru +0 -19
  141. data/example/example_data.sql +0 -19
  142. data/spec/lib/pact_broker/config/save_and_load_spec.rb +0 -25
  143. data/spec/lib/pact_broker/pacts/service_find_for_verification_spec.rb +0 -50
@@ -19,6 +19,9 @@ module PactBroker
19
19
 
20
20
  def contract_published(params)
21
21
  handle_event_for_webhook(PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED, params)
22
+ if verification_service.calculate_required_verifications_for_pact(params.fetch(:pact)).any?
23
+ handle_event_for_webhook(PactBroker::Webhooks::WebhookEvent::CONTRACT_REQUIRING_VERIFICATION_PUBLISHED, params)
24
+ end
22
25
  end
23
26
 
24
27
  def contract_content_changed(params)
@@ -47,19 +47,6 @@ module PactBroker
47
47
  end
48
48
  end
49
49
 
50
- # private
51
- def create_triggered_webhooks_for_webhooks webhooks, pact, verification, event_name, event_context
52
- webhooks.flat_map do | webhook |
53
- expanded_event_contexts = expand_events_for_currently_deployed_environments(webhook, pact, event_context)
54
- expanded_event_contexts = expanded_event_contexts.flat_map { | ec | expand_events_for_verification_of_multiple_selected_pacts(ec) }
55
-
56
- expanded_event_contexts.collect do | expanded_event_context |
57
- pact_for_triggered_webhook = verification ? find_pact_for_verification_triggered_webhook(pact, expanded_event_context) : pact
58
- webhook_repository.create_triggered_webhook(next_uuid, webhook, pact_for_triggered_webhook, verification, RESOURCE_CREATION, event_name, expanded_event_context)
59
- end
60
- end
61
- end
62
-
63
50
  def schedule_webhooks(triggered_webhooks, options)
64
51
  triggered_webhooks.each_with_index do | triggered_webhook, i |
65
52
  logger.info "Scheduling job for webhook with uuid #{triggered_webhook.webhook.uuid}, context: #{triggered_webhook.event_context}"
@@ -76,7 +63,19 @@ module PactBroker
76
63
  end
77
64
  end
78
65
 
79
- private
66
+ def create_triggered_webhooks_for_webhooks webhooks, pact, verification, event_name, event_context
67
+ webhooks.flat_map do | webhook |
68
+ expanded_event_contexts = expand_events_for_currently_deployed_environments(webhook, pact, event_context)
69
+ expanded_event_contexts = expand_events_for_required_verifications(event_name, pact, expanded_event_contexts)
70
+ expanded_event_contexts = expanded_event_contexts.flat_map { | ec | expand_events_for_verification_of_multiple_selected_pacts(ec) }
71
+
72
+ expanded_event_contexts.collect do | expanded_event_context |
73
+ pact_for_triggered_webhook = verification ? find_pact_for_verification_triggered_webhook(pact, expanded_event_context) : pact
74
+ webhook_repository.create_triggered_webhook(next_uuid, webhook, pact_for_triggered_webhook, verification, RESOURCE_CREATION, event_name, expanded_event_context)
75
+ end
76
+ end
77
+ end
78
+ private :create_triggered_webhooks_for_webhooks
80
79
 
81
80
  def merge_consumer_version_selectors(consumer_version_number, selectors, event_context)
82
81
  event_context.merge(
@@ -84,6 +83,7 @@ module PactBroker
84
83
  consumer_version_tags: selectors.collect{ | selector | selector[:tag] }.compact.uniq
85
84
  )
86
85
  end
86
+ private :merge_consumer_version_selectors
87
87
 
88
88
  # Now that we de-duplicate the pact contents when verifying though the 'pacts for verification' API,
89
89
  # we no longer get a webhook triggered for the verification results publication of each indiviual
@@ -103,6 +103,7 @@ module PactBroker
103
103
  [event_context]
104
104
  end
105
105
  end
106
+ private :expand_events_for_verification_of_multiple_selected_pacts
106
107
 
107
108
  def expand_events_for_currently_deployed_environments(webhook, pact, event_context)
108
109
  if PactBroker.feature_enabled?(:expand_currently_deployed_provider_versions) && webhook.expand_currently_deployed_provider_versions?
@@ -113,6 +114,7 @@ module PactBroker
113
114
  [event_context]
114
115
  end
115
116
  end
117
+ private :expand_events_for_currently_deployed_environments
116
118
 
117
119
  def find_pact_for_verification_triggered_webhook(pact, reconstituted_event_context)
118
120
  if reconstituted_event_context[:consumer_version_number]
@@ -126,6 +128,20 @@ module PactBroker
126
128
  pact
127
129
  end
128
130
  end
131
+ private :find_pact_for_verification_triggered_webhook
132
+
133
+ def expand_events_for_required_verifications(event_name, pact, event_contexts)
134
+ if event_name == PactBroker::Webhooks::WebhookEvent::CONTRACT_REQUIRING_VERIFICATION_PUBLISHED
135
+ required_verifications = verification_service.calculate_required_verifications_for_pact(pact)
136
+ event_contexts.flat_map do | event_context |
137
+ required_verifications.collect do | required_verification |
138
+ event_context.merge(provider_version_number: required_verification.provider_version.number, provider_version_descriptions: required_verification.provider_version_descriptions)
139
+ end
140
+ end
141
+ else
142
+ event_contexts
143
+ end
144
+ end
129
145
  end
130
146
  end
131
147
  end
@@ -136,6 +136,7 @@ end
136
136
  # triggered_webhooks_provider_id_index | btree (provider_id)
137
137
  # triggered_webhooks_verification_id_index | btree (verification_id)
138
138
  # triggered_webhooks_webhook_id_index | btree (webhook_id)
139
+ # triggered_webhooks_webhook_uuid_index | btree (webhook_uuid)
139
140
  # Foreign key constraints:
140
141
  # triggered_webhooks_consumer_id_fkey | (consumer_id) REFERENCES pacticipants(id)
141
142
  # triggered_webhooks_pact_publication_id_fkey | (pact_publication_id) REFERENCES pact_publications(id)
@@ -153,7 +153,7 @@ end
153
153
  # fk_webhooks_consumer | (consumer_id) REFERENCES pacticipants(id)
154
154
  # fk_webhooks_provider | (provider_id) REFERENCES pacticipants(id)
155
155
  # Referenced By:
156
- # webhook_headers | fk_webhookheaders_webhooks | (webhook_id) REFERENCES webhooks(id)
157
- # webhook_executions | webhook_executions_webhook_id_fkey | (webhook_id) REFERENCES webhooks(id)
158
156
  # triggered_webhooks | triggered_webhooks_webhook_id_fkey | (webhook_id) REFERENCES webhooks(id)
159
157
  # webhook_events | webhook_events_webhook_id_fkey | (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE
158
+ # webhook_executions | webhook_executions_webhook_id_fkey | (webhook_id) REFERENCES webhooks(id)
159
+ # webhook_headers | fk_webhookheaders_webhooks | (webhook_id) REFERENCES webhooks(id)
@@ -12,8 +12,9 @@ module PactBroker
12
12
  VERIFICATION_SUCCEEDED = "provider_verification_succeeded"
13
13
  VERIFICATION_FAILED = "provider_verification_failed"
14
14
  DEFAULT_EVENT_NAME = CONTRACT_CONTENT_CHANGED
15
+ CONTRACT_REQUIRING_VERIFICATION_PUBLISHED = "contract_requiring_verification_published"
15
16
 
16
- EVENT_NAMES = [CONTRACT_PUBLISHED, CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED, VERIFICATION_SUCCEEDED, VERIFICATION_FAILED]
17
+ EVENT_NAMES = [CONTRACT_PUBLISHED, CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED, VERIFICATION_SUCCEEDED, VERIFICATION_FAILED, CONTRACT_REQUIRING_VERIFICATION_PUBLISHED]
17
18
 
18
19
  dataset_module do
19
20
  include PactBroker::Repositories::Helpers
@@ -38,6 +39,10 @@ module PactBroker
38
39
  def provider_verification_failed?
39
40
  name == VERIFICATION_FAILED
40
41
  end
42
+
43
+ def contract_requiring_verification_published?
44
+ name == CONTRACT_REQUIRING_VERIFICATION_PUBLISHED
45
+ end
41
46
  end
42
47
  end
43
48
  end
@@ -0,0 +1,29 @@
1
+ require "semantic_logger/formatters/default"
2
+
3
+ module SemanticLogger
4
+ module Formatters
5
+ class Short < SemanticLogger::Formatters::Default
6
+ TAGS_TO_REMOVE = [:pact_broker_git_sha, :tenant_id, :request_id, :pactflow_git_sha]
7
+
8
+ def call(log, logger)
9
+ self.log = log
10
+ self.logger = logger
11
+
12
+ [time, level, tags, named_tags, duration, message, payload, exception].compact.join(" ")
13
+ end
14
+
15
+ def time
16
+ log.time.strftime("%H:%M:%S")
17
+ end
18
+
19
+ def named_tags
20
+ named_tags = log.named_tags.reject{ | k, _ | TAGS_TO_REMOVE.include?(k) }
21
+ return if named_tags.nil? || named_tags.empty?
22
+
23
+ list = []
24
+ named_tags.each_pair { |name, value| list << "#{name}: #{value}" }
25
+ "{#{list.join(', ')}}"
26
+ end
27
+ end
28
+ end
29
+ end
data/pact_broker.gemspec CHANGED
@@ -65,4 +65,5 @@ Gem::Specification.new do |gem|
65
65
  gem.add_runtime_dependency "semantic_logger", "~> 4.3"
66
66
  gem.add_runtime_dependency "sanitize", ">= 5.2.1", "~> 5.2"
67
67
  gem.add_runtime_dependency "wisper", "~> 2.0"
68
+ gem.add_runtime_dependency "anyway_config", "~> 2.1"
68
69
  end
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+
4
+ $LOAD_PATH << "#{Dir.pwd}/lib"
5
+ require "pact_broker/test/http_test_data_builder"
6
+ base_url = ENV["PACT_BROKER_BASE_URL"] || "http://localhost:9292"
7
+
8
+ td = PactBroker::Test::HttpTestDataBuilder.new(base_url)
9
+ td.delete_pacticipant("AutoDetectTestProvider")
10
+ .create_environment(name: "prod", production: true)
11
+ .create_pacticipant("AutoDetectTestProvider")
12
+ .create_tagged_pacticipant_version(pacticipant: "AutoDetectTestProvider", version: "1", tag: "main")
13
+ .deploy_to_prod(pacticipant: "AutoDetectTestProvider", version: "1")
14
+
15
+ rescue StandardError => e
16
+ puts "#{e.class} #{e.message}"
17
+ puts e.backtrace
18
+ exit 1
19
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+
4
+ $LOAD_PATH << "#{Dir.pwd}/lib"
5
+ require "pact_broker/test/http_test_data_builder"
6
+ base_url = ENV["PACT_BROKER_BASE_URL"] || "http://localhost:9292"
7
+
8
+ td = PactBroker::Test::HttpTestDataBuilder.new(base_url)
9
+ td.create_global_webhook_for_event(uuid: "7a5da39c-8e50-4cc9-ae16-dfa5be043e8c", event_name: "contract_requiring_verification_published")
10
+ .delete_pacticipant("NewWebhookTestConsumer")
11
+ .delete_pacticipant("NewWebhookTestProvider")
12
+ .create_environment(name: "test")
13
+ .create_environment(name: "prod", production: true)
14
+ .create_pacticipant("NewWebhookTestConsumer")
15
+ .create_pacticipant("NewWebhookTestProvider")
16
+ .create_tagged_pacticipant_version(pacticipant: "NewWebhookTestProvider", version: "1", tag: "main")
17
+ .deploy_to_prod(pacticipant: "NewWebhookTestProvider")
18
+ .record_deployment(pacticipant: "NewWebhookTestProvider", version: "1", environment_name: "test")
19
+ .record_deployment(pacticipant: "NewWebhookTestProvider", version: "1", environment_name: "prod")
20
+ .create_version(pacticipant: "NewWebhookTestProvider", version: "2", branch: "main")
21
+ .publish_pact(consumer: "NewWebhookTestConsumer", consumer_version: "1", provider: "NewWebhookTestProvider", content_id: "111")
22
+
23
+ rescue StandardError => e
24
+ puts "#{e.class} #{e.message}"
25
+ puts e.backtrace
26
+ exit 1
27
+ end
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "yaml"
4
+
5
+ $stream = StringIO.new
6
+
7
+ def write string
8
+ $stream.puts string
9
+ end
10
+
11
+ def escape_backticks value
12
+ if value.is_a?(String)
13
+ value.gsub("`", "``")
14
+ else
15
+ value
16
+ end
17
+ end
18
+
19
+ def in_backticks value
20
+ if value =~ /\s\(.+\)/
21
+ "`#{escape_backticks(value)}".gsub(" (", "` (")
22
+ else
23
+ "`#{escape_backticks(value)}`"
24
+ end
25
+ end
26
+
27
+ docs_dir = File.expand_path("../../../docs", __FILE__)
28
+ environment_variable_file = File.join(docs_dir, "configuration.yml")
29
+ doc = YAML.load(File.read(environment_variable_file))
30
+
31
+ write "# Pact Broker Configuration\n\n"
32
+ # write "## Index"
33
+
34
+ # doc["groups"].each do | group |
35
+ # write "* #{group['title']}\n"
36
+
37
+ # group['vars'].each do | name, metadata |
38
+ # next if metadata['hidden']
39
+ # write " * [#{name}](##{name})\n"
40
+ # end
41
+ # end
42
+
43
+ write "\n"
44
+
45
+ doc["groups"].each do | group |
46
+ write "<br/>\n\n"
47
+ write "## #{group["title"]}\n\n<hr/>\n"
48
+ if group["comments"]
49
+ write group["comments"]
50
+ end
51
+ write "\n\n"
52
+
53
+ group["vars"].each do | name, metadata |
54
+ next if metadata["hidden"]
55
+ write "### #{name}\n\n"
56
+ write "#{metadata["description"]}\n\n"
57
+
58
+ write "**Required:** #{metadata["required"] || "false"}<br/>" if metadata["required"]
59
+ write "**Format:** #{metadata["format"]}<br/>" if metadata["format"]
60
+ write "**Default:** #{in_backticks(metadata["default"])}<br/>" if !metadata["default"].nil?
61
+ if metadata["allowed_values"]
62
+ allowed_values = metadata["allowed_values"].collect{ |val| in_backticks(val) }.join(", ")
63
+ write "**Allowed values:** #{allowed_values}<br/>"
64
+ end
65
+ write "**Example:** #{in_backticks(metadata["example"]) }<br/>" if metadata["example"]
66
+ if metadata["examples"]
67
+ allowed_values = metadata["examples"].collect{ |val| in_backticks(val) }.join(", ")
68
+ write "**Examples:** #{allowed_values}<br/>"
69
+ end
70
+ write "**More information:** #{metadata["more_info"]}<br/>" if metadata["more_info"]
71
+ write "\n"
72
+ end
73
+ end
74
+
75
+ File.open(File.join(docs_dir, "CONFIGURATION.md"), "w") { |file| file << $stream.string }
76
+
77
+ required_env_vars = []
78
+
79
+ doc["groups"].each do | group |
80
+ group["vars"].each do | name, metadata |
81
+ required_env_vars << name if metadata["required"] && !metadata["default"]
82
+ end
83
+ end
84
+
85
+ puts "Required:"
86
+ puts required_env_vars
@@ -4,6 +4,7 @@ describe "get latest pact badge" do
4
4
 
5
5
  before do
6
6
  PactBroker.configuration.enable_public_badge_access = true
7
+ PactBroker.configuration.badge_provider_mode = :proxy
7
8
  TestDataBuilder.new
8
9
  .create_consumer("consumer")
9
10
  .create_provider("provider")
@@ -4,6 +4,7 @@ describe "get latest matrix badge with tags" do
4
4
 
5
5
  before do
6
6
  PactBroker.configuration.enable_public_badge_access = true
7
+ PactBroker.configuration.badge_provider_mode = :proxy
7
8
  TestDataBuilder.new
8
9
  .create_consumer("consumer")
9
10
  .create_provider("provider")
@@ -30,18 +30,32 @@ describe "Publishing a pact" do
30
30
 
31
31
  before do
32
32
  td.create_pact_with_hierarchy("A Consumer", "1.2.3", "A Provider").and_return(:pact)
33
+ allow(PactBroker.configuration).to receive(:allow_dangerous_contract_modification).and_return(allow_dangerous_contract_modification)
33
34
  end
34
35
 
35
- it "returns a 200 Success" do
36
- expect(subject.status).to be 200
37
- end
36
+ context "when the content is different" do
37
+ context "when pact modification is allowed" do
38
+ let(:allow_dangerous_contract_modification) { true }
38
39
 
39
- it "returns an application/json Content-Type" do
40
- expect(subject.headers["Content-Type"]).to eq "application/hal+json;charset=utf-8"
40
+ it "returns a 200 Success" do
41
+ expect(subject.status).to be 200
42
+ end
43
+
44
+ it "returns an application/json Content-Type" do
45
+ expect(subject.headers["Content-Type"]).to eq "application/hal+json;charset=utf-8"
46
+ end
47
+
48
+ it "returns the pact in the response body" do
49
+ expect(response_body_json).to match_pact JSON.parse(pact_content)
50
+ end
51
+ end
41
52
  end
42
53
 
43
- it "returns the pact in the response body" do
44
- expect(response_body_json).to match_pact JSON.parse(pact_content)
54
+ context "when pact modification is not allowed" do
55
+ let(:allow_dangerous_contract_modification) { false }
56
+
57
+ its(:status) { is_expected.to eq 409 }
58
+ its(:body) { is_expected.to include "Cannot change the content of the pact for A Consumer version 1.2.3" }
45
59
  end
46
60
  end
47
61
 
@@ -43,7 +43,7 @@ RSpec.describe "the lifecycle of a WIP pact" do
43
43
 
44
44
  def publish_new_pact_with_master_tag_after_merging_in_feature_branch
45
45
  put("/pacts/provider/Bar/consumer/Foo/version/3", pact_content_2, request_headers)
46
- put("/pacticipants/Foo/versions/2/tags/master", nil, request_headers)
46
+ put("/pacticipants/Foo/versions/3/tags/master", nil, request_headers)
47
47
  end
48
48
 
49
49
  def get_pacts_for_verification(request_body = nil)
@@ -0,0 +1,62 @@
1
+ {
2
+ "PactBroker::Matrix::Service find with environments when there is a successful verification between the provider in test environment and the consumer to be deployed allows the consumer to be deployed": {
3
+ "deployable": true,
4
+ "reasons": [
5
+ "PactBroker::Matrix::Successful"
6
+ ]
7
+ },
8
+ "PactBroker::Matrix::Service find with environments when there is an unsuccessful verification between the provider in test environment and the consumer to be deployed does not allow the consumer to be deployed": {
9
+ "deployable": false,
10
+ "reasons": [
11
+ "PactBroker::Matrix::VerificationFailed"
12
+ ]
13
+ },
14
+ "PactBroker::Matrix::Service find with environments when the provider has not been deployed to the given environment does not allow the consumer to be deployed": {
15
+ "deployable": null,
16
+ "reasons": [
17
+ "PactBroker::Matrix::PactNotEverVerifiedByProvider"
18
+ ]
19
+ },
20
+ "PactBroker::Matrix::Service find with environments when the consumer has not been deployed to the given environment allows the provider to be deployed": {
21
+ "deployable": true,
22
+ "reasons": [
23
+ "PactBroker::Matrix::NoDependenciesMissing"
24
+ ]
25
+ },
26
+ "PactBroker::Matrix::Service find with environments when deploying a version of a provider with multiple versions of a consumer in production knows that there are multiple versions of the consumer in production": {
27
+ "deployable": null,
28
+ "reasons": [
29
+ "PactBroker::Matrix::PactNotEverVerifiedByProvider"
30
+ ]
31
+ },
32
+ "PactBroker::Matrix::Service find with environments when deploying a version of a provider with multiple versions of a consumer in production when a verification for the latest prod version is missing does not allow the provider to be deployed": {
33
+ "deployable": null,
34
+ "reasons": [
35
+ "PactBroker::Matrix::PactNotEverVerifiedByProvider"
36
+ ]
37
+ },
38
+ "PactBroker::Matrix::Service find with environments when deploying a version of a provider with multiple versions of a consumer in production when there is a successful verification for every prod version of the consumer does allow the provider to be deployed": {
39
+ "deployable": true,
40
+ "reasons": [
41
+ "PactBroker::Matrix::Successful"
42
+ ]
43
+ },
44
+ "PactBroker::Matrix::Service find with environments when deploying a version of a consumer with multiple versions of a provider in production knows that there are multiple versions of the provider in production": {
45
+ "deployable": null,
46
+ "reasons": [
47
+ "PactBroker::Matrix::PactNotEverVerifiedByProvider"
48
+ ]
49
+ },
50
+ "PactBroker::Matrix::Service find with environments when deploying a version of a consumer with multiple versions of a provider in production when a verification for the latest prod version is missing does not allow the consumer to be deployed": {
51
+ "deployable": null,
52
+ "reasons": [
53
+ "PactBroker::Matrix::PactNotEverVerifiedByProvider"
54
+ ]
55
+ },
56
+ "PactBroker::Matrix::Service find with environments when deploying a version of a consumer with multiple versions of a provider in production when there is a successful verification for every prod version of the consumer does allow the consumer to be deployed": {
57
+ "deployable": true,
58
+ "reasons": [
59
+ "PactBroker::Matrix::Successful"
60
+ ]
61
+ }
62
+ }