Open tanyongkee opened 1 year ago
I think we have something here and it's a little bit subtle under the evaluation of rules. For example, if we make the address field missing a field, the error is also not accurate:
# frozen_string_literal: true
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'dry-validation'
gem 'rspec'
gem 'warning'
gem 'i18n'
end
require 'rspec/autorun'
AddressContract = Dry::Schema.JSON do
required(:street_address).filled(:string)
required(:country).filled(:string)
end
class UserContract < Dry::Validation::Contract
json do
required(:user_details).array(:hash) do
required(:address).hash(AddressContract)
required(:email).filled(:string)
end
end
rule(:user_details).each do |index:|
key(
[:user_details, index, :email]
).failure('has invalid format') unless value[:email].include?('@')
end
end
RSpec.describe UserContract do
let(:payload) do
{
user_details: [{email: 'jane', address: { country: 'UK' }]
}
end
subject(:contract) do
described_class.new.call(payload)
end
it do
expect(contract.errors.to_h).to match(
{
user_details: {
0 => {
email: ['has invalid format'],
address: { street_address: ['is missing'] }
}
}
}
)
end
end
Describe the bug
Rule validation does not show in errors when the key validated is in an array of hashes
To Reproduce
Provide detailed steps to reproduce, an executable script would be best.
define another contract that uses AddressContract
Create the contract
Validate the following payload
Expected behavior
expected output
but got
As you can see, it is missing the rule validation for the format of the email. Is this a bug? Or am I missing something here?
My environment