forked from thoughtbot/shoulda-matchers
/
validation_matcher.rb
115 lines (93 loc) · 2.69 KB
/
validation_matcher.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
module Shoulda
module Matchers
module ActiveModel
# @private
class ValidationMatcher
attr_reader :failure_message
alias failure_message_for_should failure_message
def initialize(attribute)
@attribute = attribute
@strict = false
@failure_message = nil
@failure_message_when_negated = nil
end
def on(context)
@context = context
self
end
def allow_blank
@options[:allow_blank] = true
self
end
def strict
@strict = true
self
end
def failure_message_when_negated
@failure_message_when_negated || @failure_message
end
alias failure_message_for_should_not failure_message_when_negated
def matches?(subject)
@subject = subject
false
end
private
def allows_value_of(value, message = nil, &block)
allow = allow_value_matcher(value, message)
yield allow if block_given?
if allow.matches?(@subject)
@failure_message_when_negated = allow.failure_message_when_negated
true
else
@failure_message = allow.failure_message
false
end
end
def disallows_value_of(value, message = nil, &block)
disallow = disallow_value_matcher(value, message)
yield disallow if block_given?
if disallow.matches?(@subject)
@failure_message_when_negated = disallow.failure_message_when_negated
true
else
@failure_message = disallow.failure_message
false
end
end
def allow_value_matcher(value, message)
matcher = AllowValueMatcher.new(value).for(@attribute).
with_message(message)
if defined?(@context)
matcher.on(@context)
end
if strict?
matcher.strict
end
matcher
end
def disallow_value_matcher(value, message)
matcher = DisallowValueMatcher.new(value).for(@attribute).
with_message(message)
if defined?(@context)
matcher.on(@context)
end
if strict?
matcher.strict
end
matcher
end
def strict?
@strict
end
def allow_blank_matches?
if @options.key?(:allow_blank)
blank_values = ['', ' ', "\n", "\r", "\t", "\f"]
@options[:allow_blank] == blank_values.all? { |value| allows_value_of(value) }
else
true
end
end
end
end
end
end