spec/integration/custom_predicates_spec.rb in dry-validation-0.6.0 vs spec/integration/custom_predicates_spec.rb in dry-validation-0.7.0
- old
+ new
@@ -1,30 +1,38 @@
RSpec.describe Dry::Validation do
- subject(:validation) { schema.new }
-
shared_context 'uses custom predicates' do
it 'uses provided custom predicates' do
- expect(validation.(email: 'jane@doe')).to be_empty
+ expect(schema.(email: 'jane@doe')).to be_success
- expect(validation.(email: nil)).to match_array([
- [:error, [:input, [:email, nil, [[:val, [:email, [:predicate, [:filled?, []]]]]]]]]
- ])
+ expect(schema.(email: nil).messages).to eql(
+ email: ['must be filled', 'must be a valid email']
+ )
- expect(validation.(email: 'jane')).to match_array([
- [:error, [:input, [:email, 'jane', [[:val, [:email, [:predicate, [:email?, []]]]]]]]]
- ])
+ expect(schema.(email: 'jane').messages).to eql(
+ email: ['must be a valid email']
+ )
end
end
+ let(:base_class) do
+ Class.new(Dry::Validation::Schema) do
+ def self.messages
+ Dry::Validation::Messages.default.merge(
+ en: { errors: { email?: 'must be a valid email' } }
+ )
+ end
+ end
+ end
+
describe 'defining schema with custom predicates container' do
- let(:schema) do
- Class.new(Dry::Validation::Schema) do
- configure do |config|
+ subject(:schema) do
+ Dry::Validation.Schema(base_class) do
+ configure do
config.predicates = Test::Predicates
end
- key(:email) { |value| value.filled? & value.email? }
+ key(:email) { filled? & email? }
end
end
before do
module Test
@@ -40,18 +48,60 @@
include_context 'uses custom predicates'
end
describe 'defining schema with custom predicate methods' do
- let(:schema) do
- Class.new(Dry::Validation::Schema) do
- key(:email) { |value| value.filled? & value.email? }
+ subject(:schema) do
+ Dry::Validation.Schema(base_class) do
+ configure do
+ def email?(value)
+ value.include?('@')
+ end
+ end
+ key(:email) { filled? & email? }
+ end
+ end
+
+ include_context 'uses custom predicates'
+ end
+
+ describe 'custom predicate which requires an arbitrary dependency' do
+ subject(:schema) do
+ Dry::Validation.Schema(base_class) do
+ key(:email).required(:email?)
+
+ configure do
+ option :email_check
+
+ def email?(value)
+ email_check.(value)
+ end
+ end
+ end
+ end
+
+ it 'uses injected dependency for the custom predicate' do
+ email_check = -> input { input.include?('@') }
+
+ expect(schema.with(email_check: email_check).(email: 'foo').messages).to eql(
+ email: ['must be a valid email']
+ )
+ end
+ end
+
+ it 'raises an error when message is missing' do
+ schema = Dry::Validation.Schema do
+ configure do
def email?(value)
- value.include?('@')
+ false
end
end
+
+ key(:email).required(:email?)
end
- include_context 'uses custom predicates'
+ expect { schema.(email: 'foo').messages }.to raise_error(
+ Dry::Validation::MissingMessageError, /email/
+ )
end
end