Class: PactBroker::Api::Contracts::PublishContractsSchema
- Inherits:
-
Object
- Object
- PactBroker::Api::Contracts::PublishContractsSchema
show all
- Extended by:
- DryValidationWorkarounds, Messages
- Defined in:
- lib/pact_broker/api/contracts/publish_contracts_schema.rb
Constant Summary
collapse
- SCHEMA =
Dry::Validation.Schema do
configure do
predicates(DryValidationPredicates)
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
end
required(:pacticipantName).filled(:str?, :not_blank?)
required(:pacticipantVersionNumber).filled(:not_blank?, :single_line?)
optional(:tags).each(:not_blank?, :single_line?)
optional(:branch).maybe(:not_blank?, :single_line?)
optional(:buildUrl).maybe(:single_line?)
required(:contracts).each do
required(:consumerName).filled(:str?, :not_blank?)
required(:providerName).filled(:str?, :not_blank?)
required(:content).filled(:str?)
required(:contentType).filled(included_in?: ["application/json"])
required(:specification).filled(included_in?: ["pact"])
optional(:onConflict).filled(included_in?:["overwrite", "merge"])
end
end
Class Method Summary
collapse
-
.add_contract_error(message, i, errors) ⇒ Object
-
.add_cross_field_validation_errors(params, errors) ⇒ Object
-
.call(params) ⇒ Object
-
.validate_consumer_name(params, contract, i, errors) ⇒ Object
-
.validate_consumer_name_in_content(params, contract, i, errors) ⇒ Object
-
.validate_content_matches_content_type(contract, i, errors) ⇒ Object
-
.validate_encoding(contract, i, errors) ⇒ Object
-
.validate_provider_name_in_content(contract, i, errors) ⇒ Object
flatten_array_of_hashes, flatten_indexed_messages, is_indexed_structure?, select_first_message
Methods included from Messages
message, pluralize, potential_duplicate_pacticipant_message, validation_message
Class Method Details
.add_contract_error(message, i, errors) ⇒ Object
95
96
97
98
99
100
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 95
def self.add_contract_error(message, i, errors)
errors[:contracts] ||= {}
errors[:contracts][i] ||= []
errors[:contracts][i] << message
errors
end
|
.add_cross_field_validation_errors(params, errors) ⇒ Object
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 47
def self.add_cross_field_validation_errors(params, errors)
if params[:contracts].is_a?(Array)
params[:contracts].each_with_index do | contract, i |
if contract.is_a?(Hash)
validate_consumer_name(params, contract, i, errors)
validate_consumer_name_in_content(params, contract, i, errors)
validate_provider_name_in_content(contract, i, errors)
validate_encoding(contract, i, errors)
validate_content_matches_content_type(contract, i, errors)
end
end
end
errors
end
|
.call(params) ⇒ Object
36
37
38
39
40
41
42
43
44
45
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 36
def self.call(params)
select_first_message(
flatten_indexed_messages(
add_cross_field_validation_errors(
params&.symbolize_keys,
SCHEMA.call(params&.symbolize_keys).messages(full: true)
)
)
)
end
|
.validate_consumer_name(params, contract, i, errors) ⇒ Object
62
63
64
65
66
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 62
def self.validate_consumer_name(params, contract, i, errors)
if params[:pacticipantName] && contract[:consumerName] && (contract[:consumerName] != params[:pacticipantName])
add_contract_error(validation_message("consumer_name_in_contract_mismatch_pacticipant_name", { consumer_name_in_contract: contract[:consumerName], pacticipant_name: params[:pacticipantName] } ), i, errors)
end
end
|
.validate_consumer_name_in_content(params, contract, i, errors) ⇒ Object
68
69
70
71
72
73
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 68
def self.validate_consumer_name_in_content(params, contract, i, errors)
consumer_name_in_content = contract.dig(:decodedParsedContent, :consumer, :name)
if consumer_name_in_content && consumer_name_in_content != params[:pacticipantName]
add_contract_error(validation_message("consumer_name_in_content_mismatch_pacticipant_name", { consumer_name_in_content: consumer_name_in_content, pacticipant_name: params[:pacticipantName] } ), i, errors)
end
end
|
.validate_content_matches_content_type(contract, i, errors) ⇒ Object
88
89
90
91
92
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 88
def self.validate_content_matches_content_type(contract, i, errors)
if contract[:decodedParsedContent].nil? && contract[:contentType]
add_contract_error(validation_message("invalid_content_for_content_type", { content_type: contract[:contentType]}), i, errors)
end
end
|
.validate_encoding(contract, i, errors) ⇒ Object
82
83
84
85
86
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 82
def self.validate_encoding(contract, i, errors)
if contract[:decodedContent].nil?
add_contract_error(message("errors.base64?", scope: nil), i, errors)
end
end
|
.validate_provider_name_in_content(contract, i, errors) ⇒ Object
75
76
77
78
79
80
|
# File 'lib/pact_broker/api/contracts/publish_contracts_schema.rb', line 75
def self.validate_provider_name_in_content(contract, i, errors)
provider_name_in_content = contract.dig(:decodedParsedContent, :provider, :name)
if provider_name_in_content && provider_name_in_content != contract[:providerName]
add_contract_error(validation_message("provider_name_in_content_mismatch", { provider_name_in_content: provider_name_in_content, provider_name: contract[:providerName] } ), i, errors)
end
end
|