spec/integration/schema/check_rules_spec.rb in dry-validation-0.6.0 vs spec/integration/schema/check_rules_spec.rb in dry-validation-0.7.0

- old
+ new

@@ -1,74 +1,82 @@ RSpec.describe Schema, 'using high-level rules' do - subject(:validate) { schema.new } - context 'composing rules' do - let(:schema) do - Class.new(Schema) do - def self.messages - Messages.default.merge( - en: { errors: { destiny: 'you must select either red or blue' } } - ) + subject(:schema) do + Dry::Validation.Schema do + configure do + def self.messages + Messages.default.merge( + en: { errors: { destiny: 'you must select either red or blue' } } + ) + end end - optional(:red, &:filled?) - optional(:blue, &:filled?) + optional(:red).maybe + optional(:blue).maybe - rule(:destiny) { rule(:red) | rule(:blue) } + rule(destiny: [:red, :blue]) do |red, blue| + red.filled? | blue.filled? + end end end it 'passes when only red is filled' do - expect(validate.(red: '1')).to be_empty + expect(schema.(red: '1')).to be_success end + it 'fails when keys are missing' do + expect(schema.({})).to be_failure + end + it 'fails when red and blue are not filled ' do - expect(validate.(red: '', blue: '').messages[:destiny]).to eql( - [['you must select either red or blue'], ''] + expect(schema.(red: nil, blue: nil).messages[:destiny]).to eql( + ['you must select either red or blue'] ) end end context 'composing specific predicates' do let(:schema) do - Class.new(Schema) do - def self.messages - Messages.default.merge( - en: { - errors: { - email_presence: 'email must be present when login is set to true', - email_absence: 'email must not be present when login is set to false' + Dry::Validation.Schema do + configure do + def self.messages + Messages.default.merge( + en: { + errors: { + email_presence: 'must be present when login is set to true', + email_absence: 'must not be present when login is set to false' + } } - } - ) + ) + end end - key(:login) { |login| login.bool? } - key(:email) { |email| email.none? | email.filled? } + key(:login).required(:bool?) + key(:email).maybe rule(:email_presence) { value(:login).true?.then(value(:email).filled?) } rule(:email_absence) { value(:login).false?.then(value(:email).none?) } end end it 'passes when login is false and email is nil' do - expect(validate.(login: false, email: nil)).to be_empty + expect(schema.(login: false, email: nil)).to be_success end it 'fails when login is false and email is present' do - expect(validate.(login: false, email: 'jane@doe').messages[:email_absence]).to eql( - [['email must not be present when login is set to false'], nil] + expect(schema.(login: false, email: 'jane@doe').messages).to eql( + email_absence: ['must not be present when login is set to false'] ) end it 'passes when login is true and email is present' do - expect(validate.(login: true, email: 'jane@doe')).to be_empty + expect(schema.(login: true, email: 'jane@doe')).to be_success end it 'fails when login is true and email is not present' do - expect(validate.(login: true, email: nil).messages[:email_presence]).to eql( - [['email must be present when login is set to true'], nil] + expect(schema.(login: true, email: nil).messages).to eql( + email_presence: ['must be present when login is set to true'] ) end end end