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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -1
- data/CHANGELOG.md +30 -0
- data/DEVELOPER_SETUP.md +1 -1
- data/README.md +7 -5
- data/config.ru +3 -28
- data/db/migrations/20210722_add_index_to_triggered_webhooks_webhook_uuid.rb +7 -0
- data/db/migrations/20210810_set_allow_contract_modification.rb +17 -0
- data/docs/CONFIGURATION.md +398 -0
- data/docs/configuration.yml +320 -0
- data/example/Gemfile +4 -4
- data/example/README.md +15 -22
- data/example/config.ru +1 -24
- data/example/config/pact_broker.yml +9 -0
- data/example/config/puma.rb +3 -0
- data/lib/db.rb +1 -1
- data/lib/pact_broker/api/authorization/resource_access_policy.rb +68 -0
- data/lib/pact_broker/api/authorization/resource_access_rules.rb +40 -0
- data/lib/pact_broker/api/decorators/deployed_version_decorator.rb +2 -0
- data/lib/pact_broker/api/decorators/released_version_decorator.rb +2 -0
- data/lib/pact_broker/api/middleware/basic_auth.rb +63 -0
- data/lib/pact_broker/api/resources/pact.rb +15 -6
- data/lib/pact_broker/api/resources/tag.rb +1 -14
- data/lib/pact_broker/app.rb +52 -30
- data/lib/pact_broker/config/basic_auth_configuration.rb +38 -0
- data/lib/pact_broker/config/load.rb +21 -10
- data/lib/pact_broker/config/runtime_configuration.rb +188 -0
- data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +41 -0
- data/lib/pact_broker/config/runtime_configuration_database_methods.rb +119 -0
- data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +61 -0
- data/lib/pact_broker/configuration.rb +67 -131
- data/lib/pact_broker/contracts/notice.rb +4 -0
- data/lib/pact_broker/contracts/service.rb +4 -4
- data/lib/pact_broker/db/models.rb +3 -0
- data/lib/pact_broker/db/validate_encoding.rb +0 -4
- data/lib/pact_broker/deployments/deployed_version.rb +8 -2
- data/lib/pact_broker/deployments/deployed_version_service.rb +13 -6
- data/lib/pact_broker/deployments/environment.rb +1 -1
- data/lib/pact_broker/deployments/released_version.rb +8 -0
- data/lib/pact_broker/deployments/released_version_service.rb +12 -0
- data/lib/pact_broker/doc/views/provider-pacts-for-verification.markdown +4 -0
- data/lib/pact_broker/domain/pacticipant.rb +17 -13
- data/lib/pact_broker/domain/verification.rb +4 -22
- data/lib/pact_broker/domain/version.rb +9 -5
- data/lib/pact_broker/domain/webhook.rb +4 -0
- data/lib/pact_broker/error.rb +1 -0
- data/lib/pact_broker/errors.rb +1 -1
- data/lib/pact_broker/feature_toggle.rb +3 -5
- data/lib/pact_broker/hash_refinements.rb +0 -1
- data/lib/pact_broker/index/service.rb +4 -6
- data/lib/pact_broker/initializers/database_connection.rb +80 -0
- data/lib/pact_broker/integrations/integration.rb +5 -0
- data/lib/pact_broker/integrations/service.rb +4 -2
- data/lib/pact_broker/locale/en.yml +1 -0
- data/lib/pact_broker/logging.rb +2 -1
- data/lib/pact_broker/matrix/integration.rb +1 -1
- data/lib/pact_broker/matrix/parse_can_i_deploy_query.rb +2 -2
- data/lib/pact_broker/matrix/quick_row.rb +10 -0
- data/lib/pact_broker/matrix/repository.rb +64 -3
- data/lib/pact_broker/metrics/service.rb +16 -13
- data/lib/pact_broker/pacticipants/repository.rb +4 -0
- data/lib/pact_broker/pacticipants/service.rb +9 -1
- data/lib/pact_broker/pacts/pact_publication.rb +10 -13
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +6 -1
- data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +1 -2
- data/lib/pact_broker/pacts/pact_version.rb +25 -11
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +54 -77
- data/lib/pact_broker/pacts/selected_pact.rb +1 -1
- data/lib/pact_broker/pacts/selector.rb +15 -2
- data/lib/pact_broker/pacts/selectors.rb +4 -0
- data/lib/pact_broker/pacts/service.rb +4 -0
- data/lib/pact_broker/repositories/scopes.rb +12 -1
- data/lib/pact_broker/string_refinements.rb +6 -0
- data/lib/pact_broker/tags/service.rb +8 -1
- data/lib/pact_broker/test/http_test_data_builder.rb +11 -5
- data/lib/pact_broker/ui/views/index/_css_and_js.haml +11 -9
- data/lib/pact_broker/ui/views/index/_pagination.haml +3 -1
- data/lib/pact_broker/ui/views/layouts/main.haml +5 -3
- data/lib/pact_broker/ui/views/matrix/show.haml +10 -8
- data/lib/pact_broker/verifications/required_verification.rb +28 -0
- data/lib/pact_broker/verifications/service.rb +49 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/repository.rb +15 -0
- data/lib/pact_broker/versions/service.rb +32 -2
- data/lib/pact_broker/webhooks/event_listener.rb +3 -0
- data/lib/pact_broker/webhooks/trigger_service.rb +30 -14
- data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -0
- data/lib/pact_broker/webhooks/webhook.rb +2 -2
- data/lib/pact_broker/webhooks/webhook_event.rb +6 -1
- data/lib/semantic_logger/formatters/short.rb +29 -0
- data/pact_broker.gemspec +1 -0
- data/script/data/auto-create-things-for-tags.rb +19 -0
- data/script/data/contract-published-requiring-verification.rb +27 -0
- data/script/{reproduce-issue-expand-currently-deployed.rb → data/expand-currently-deployed.rb} +0 -0
- data/script/docs/generate-configuration-docs.rb +86 -0
- data/spec/features/get_latest_pact_badge_spec.rb +1 -0
- data/spec/features/get_matrix_badge_spec.rb +1 -0
- data/spec/features/publish_pact_spec.rb +21 -7
- data/spec/features/wip_pacts_spec.rb +1 -1
- data/spec/fixtures/approvals/matrix_integration_environment_spec.approved.json +62 -0
- data/spec/fixtures/approvals/matrix_integration_ignore_spec.approved.json +124 -0
- data/spec/fixtures/approvals/matrix_integration_spec.approved.json +173 -0
- data/spec/fixtures/approvals/publish_contract_no_branch.approved.json +9 -9
- data/spec/fixtures/approvals/publish_contract_nothing_exists.approved.json +7 -7
- data/spec/fixtures/approvals/publish_contract_nothing_exists_with_webhook.approved.json +5 -5
- data/spec/fixtures/approvals/publish_contract_verification_already_exists.approved.json +5 -5
- data/spec/lib/pact_broker/api/middleware/basic_auth_spec.rb +312 -0
- data/spec/lib/pact_broker/api/resources/tag_spec.rb +14 -39
- data/spec/lib/pact_broker/app_basic_auth_spec.rb +122 -0
- data/spec/lib/pact_broker/config/load_spec.rb +33 -6
- data/spec/lib/pact_broker/config/runtime_configuration_logging_methods_spec.rb +22 -0
- data/spec/lib/pact_broker/config/runtime_configuration_spec.rb +71 -0
- data/spec/lib/pact_broker/configuration_spec.rb +51 -25
- data/spec/lib/pact_broker/errors/error_logger_spec.rb +3 -0
- data/spec/lib/pact_broker/feature_toggle_spec.rb +18 -19
- data/spec/lib/pact_broker/matrix/integration_environment_spec.rb +12 -0
- data/spec/lib/pact_broker/matrix/integration_ignore_spec.rb +15 -3
- data/spec/lib/pact_broker/matrix/integration_spec.rb +47 -6
- data/spec/lib/pact_broker/matrix/parse_can_i_deploy_query_spec.rb +16 -1
- data/spec/lib/pact_broker/matrix/repository_dependency_spec.rb +0 -2
- data/spec/lib/pact_broker/matrix/repository_spec.rb +0 -2
- data/spec/lib/pact_broker/metrics/service_spec.rb +44 -0
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +28 -5
- data/spec/lib/pact_broker/pacts/pact_publication_selector_dataset_module_spec.rb +25 -0
- data/spec/lib/pact_broker/pacts/pact_version_spec.rb +30 -1
- data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +107 -20
- data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +1 -1
- data/spec/lib/pact_broker/tags/service_spec.rb +24 -8
- data/spec/lib/pact_broker/verifications/service_spec.rb +146 -0
- data/spec/lib/pact_broker/versions/repository_spec.rb +38 -2
- data/spec/lib/pact_broker/versions/service_spec.rb +93 -2
- data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +54 -2
- data/spec/lib/rack/pact_broker/invalid_uri_protection_spec.rb +3 -3
- data/spec/spec_helper.rb +2 -1
- data/spec/support/approvals.rb +29 -0
- metadata +52 -13
- data/example/basic_auth/Gemfile +0 -5
- data/example/basic_auth/Procfile +0 -1
- data/example/basic_auth/README.md +0 -43
- data/example/basic_auth/config.ru +0 -19
- data/example/example_data.sql +0 -19
- data/spec/lib/pact_broker/config/save_and_load_spec.rb +0 -25
- 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
|
-
|
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
@@ -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
|
data/script/{reproduce-issue-expand-currently-deployed.rb → data/expand-currently-deployed.rb}
RENAMED
File without changes
|
@@ -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
|
@@ -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
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
40
|
-
|
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
|
-
|
44
|
-
|
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/
|
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
|
+
}
|