Add "acceptance" macro
This commit is contained in:
parent
6bec735917
commit
269204ea0a
|
@ -1,6 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'dry/validation/contract'
|
||||
require 'dry/validation/macros'
|
||||
|
||||
module Dry
|
||||
# Main library namespace
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue