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