Add "acceptance" macro

This commit is contained in:
Piotr Solnica 2019-05-04 19:07:20 +02:00
parent 6bec735917
commit 269204ea0a
No known key found for this signature in database
GPG Key ID: 66BF2FDA7BA0F29C
4 changed files with 46 additions and 3 deletions

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require 'dry/validation/contract'
require 'dry/validation/macros'
module Dry
# Main library namespace

View File

@ -72,12 +72,13 @@ module Dry
# failure('please provide a valid street address') if valid_street?(values[:street])
# end
#
# @return [Array<Rule>]
# @return [Rule]
#
# @api public
def rule(*keys, &block)
rules << Rule.new(keys: keys, block: block)
rules
Rule.new(keys: keys, block: block).tap do |rule|
rules << rule
end
end
# A shortcut that can be used to define contracts that won't be reused or inherited

View File

@ -0,0 +1,22 @@
# frozen_string_literal: true
module Dry
module Validation
module Macros
# @api public
module Acceptance
# @api public
module RuleMethods
# @api public
def acceptance
@block = proc do
key.failure('must accept terms') unless values[keys[0]].equal?(true)
end
end
end
end
Rule.include(Acceptance::RuleMethods)
end
end
end

View File

@ -0,0 +1,19 @@
RSpec.describe Dry::Validation::Macros::Acceptance do
subject(:contract) do
Dry::Validation::Contract.build do
schema do
required(:terms).value(:bool)
end
rule(:terms).acceptance
end
end
it 'succeeds when value is true' do
expect(contract.(terms: true)).to be_success
end
it 'fails when value is not true' do
expect(contract.(terms: false).errors.to_h).to eql(terms: ['must accept terms'])
end
end