validators 2.7.0 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -9
- data/bin/sync-disposable-hostnames +6 -6
- data/bin/sync-tld +4 -4
- data/data/disposable.json +8272 -2
- data/data/tld.json +0 -1
- data/lib/validators/constants.rb +1 -0
- data/lib/validators/hostname.rb +1 -1
- data/lib/validators/validates_cnpj_format_of.rb +2 -1
- data/lib/validators/validates_cpf_format_of.rb +2 -1
- data/lib/validators/validates_datetime.rb +29 -18
- data/lib/validators/validates_email_format_of.rb +19 -13
- data/lib/validators/validates_ip_address.rb +13 -9
- data/lib/validators/validates_ownership_of.rb +11 -9
- data/lib/validators/validates_ssh_private_key.rb +15 -7
- data/lib/validators/validates_ssh_public_key.rb +5 -2
- data/lib/validators/validates_url_format_of.rb +5 -3
- data/lib/validators/version.rb +2 -2
- data/test/schema.rb +1 -1
- data/test/support/emails.rb +37 -27
- data/test/support/models.rb +1 -1
- data/test/support/urls.rb +28 -28
- data/test/validators/validates_datetime/after_option_test.rb +5 -5
- data/test/validators/validates_datetime/before_option_test.rb +2 -2
- data/test/validators/validates_datetime/defaults_test.rb +1 -1
- data/test/validators/validates_email_format_of_test.rb +11 -11
- data/test/validators/validates_ip_address/ipv4_test.rb +2 -2
- data/test/validators/validates_ip_address/ipv6_test.rb +2 -2
- data/test/validators/validates_ip_address_test.rb +2 -2
- data/test/validators/validates_ownership_of_test.rb +5 -5
- data/test/validators/validates_ssh_private_key/dsa_test.rb +2 -2
- data/test/validators/validates_ssh_private_key/rsa_test.rb +1 -1
- data/test/validators/validates_url_format_of/with_tld_validation_test.rb +1 -1
- data/test/validators/validates_url_format_of/without_tld_validation_test.rb +7 -7
- data/validators.gemspec +2 -2
- metadata +4 -4
data/data/tld.json
CHANGED
data/lib/validators/constants.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Validators
|
2
2
|
EMAIL_FORMAT = /\A[a-z0-9]+([-._][a-z0-9]+)*(\+[^@]+)?@[a-z0-9]+([.-][a-z0-9]+)*\.[a-z]{2,}\z/i
|
3
|
+
MICROSOFT_EMAIL_FORMAT = /\A[\w][\w\d._-]*[\w\d_-]+(\+[\w\d]+)?@(hotmail|outlook).com\z/i
|
3
4
|
|
4
5
|
# Source: https://github.com/henrik/validates_url_format_of
|
5
6
|
IPv4_PART = /\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]/ # 0-255
|
data/lib/validators/hostname.rb
CHANGED
@@ -4,11 +4,12 @@ module ActiveModel
|
|
4
4
|
def validate_each(record, attribute, value)
|
5
5
|
return if value.blank? && options[:allow_blank]
|
6
6
|
return if value.nil? && options[:allow_nil]
|
7
|
+
return if CNPJ.valid?(value)
|
7
8
|
|
8
9
|
record.errors.add(attribute, :invalid_cnpj,
|
9
10
|
message: options[:message],
|
10
11
|
value: value
|
11
|
-
)
|
12
|
+
)
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
@@ -4,11 +4,12 @@ module ActiveModel
|
|
4
4
|
def validate_each(record, attribute, value)
|
5
5
|
return if value.blank? && options[:allow_blank]
|
6
6
|
return if value.nil? && options[:allow_nil]
|
7
|
+
return if CPF.valid?(value)
|
7
8
|
|
8
9
|
record.errors.add(attribute, :invalid_cpf,
|
9
10
|
message: options[:message],
|
10
11
|
value: value
|
11
|
-
)
|
12
|
+
)
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
@@ -10,8 +10,11 @@ module ActiveModel
|
|
10
10
|
return if value.nil? && options[:allow_nil]
|
11
11
|
|
12
12
|
unless date?(value)
|
13
|
-
record.errors.add(
|
14
|
-
|
13
|
+
record.errors.add(
|
14
|
+
attribute,
|
15
|
+
:invalid_date,
|
16
|
+
message: options[:message],
|
17
|
+
value: value
|
15
18
|
)
|
16
19
|
end
|
17
20
|
|
@@ -50,11 +53,15 @@ module ActiveModel
|
|
50
53
|
|
51
54
|
date, value = date_for(record, value, options[:after])
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
return if value.present? && date.present? && (value && date && value > date)
|
57
|
+
|
58
|
+
record.errors.add(
|
59
|
+
attribute,
|
60
|
+
:invalid_date_after,
|
61
|
+
message: options[:after_message],
|
62
|
+
value: value,
|
63
|
+
date: (date?(date) ? I18n.l(date) : date.inspect)
|
64
|
+
)
|
58
65
|
end
|
59
66
|
|
60
67
|
def validate_before_option(record, attribute, value)
|
@@ -62,11 +69,15 @@ module ActiveModel
|
|
62
69
|
|
63
70
|
date, value = date_for(record, value, options[:before])
|
64
71
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
72
|
+
return if value.present? && date.present? && (value && date && value < date)
|
73
|
+
|
74
|
+
record.errors.add(
|
75
|
+
attribute,
|
76
|
+
:invalid_date_before,
|
77
|
+
message: options[:before_message],
|
78
|
+
value: value,
|
79
|
+
date: I18n.l(date)
|
80
|
+
)
|
70
81
|
end
|
71
82
|
end
|
72
83
|
|
@@ -79,12 +90,12 @@ module ActiveModel
|
|
79
90
|
#
|
80
91
|
# Other usages:
|
81
92
|
#
|
82
|
-
# validates_datetime :starts_at, :
|
83
|
-
# validates_datetime :starts_at, :
|
84
|
-
# validates_datetime :starts_at, :
|
85
|
-
# validates_datetime :starts_at, :
|
86
|
-
# validates_datetime :starts_at, :
|
87
|
-
# validates_datetime :ends_at, :
|
93
|
+
# validates_datetime :starts_at, after: 2.years.ago
|
94
|
+
# validates_datetime :starts_at, before: 2.years.ago
|
95
|
+
# validates_datetime :starts_at, before: :today
|
96
|
+
# validates_datetime :starts_at, before: :now
|
97
|
+
# validates_datetime :starts_at, before: :ends_at
|
98
|
+
# validates_datetime :ends_at, after: :starts_at
|
88
99
|
#
|
89
100
|
def validates_datetime(*attr_names)
|
90
101
|
validates_with DatetimeValidator, _merge_attributes(attr_names)
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module ActiveModel
|
2
2
|
module Validations
|
3
3
|
class EmailValidator < EachValidator
|
4
|
+
AT_SIGN = "@".freeze
|
5
|
+
|
4
6
|
def validate_each(record, attribute, value)
|
5
7
|
allow_disposable = options.fetch(:disposable, false)
|
6
8
|
check_tld = options.fetch(:tld, false)
|
@@ -14,18 +16,19 @@ module ActiveModel
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def validate_email_format(record, attribute, value, options)
|
17
|
-
if value.to_s
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
return if value.to_s =~ Validators::EMAIL_FORMAT
|
20
|
+
return if value.to_s =~ Validators::MICROSOFT_EMAIL_FORMAT
|
21
|
+
|
22
|
+
record.errors.add(
|
23
|
+
attribute,
|
24
|
+
:invalid_email,
|
25
|
+
message: options[:message],
|
26
|
+
value: value
|
27
|
+
)
|
25
28
|
end
|
26
29
|
|
27
30
|
def validate_tld(record, attribute, value, options)
|
28
|
-
host = value.to_s.split(
|
31
|
+
host = value.to_s.split(AT_SIGN).last
|
29
32
|
return if Validators::TLD.host_with_valid_tld?(host)
|
30
33
|
|
31
34
|
record.errors.add(
|
@@ -37,12 +40,15 @@ module ActiveModel
|
|
37
40
|
end
|
38
41
|
|
39
42
|
def validate_disposable_email(record, attribute, value, options)
|
40
|
-
hostname = value.to_s.split(
|
43
|
+
hostname = value.to_s.split(AT_SIGN).last.to_s.downcase
|
44
|
+
|
45
|
+
return unless Validators::DisposableHostnames.all.include?(hostname)
|
41
46
|
|
42
47
|
record.errors.add(
|
43
|
-
attribute,
|
44
|
-
:
|
45
|
-
|
48
|
+
attribute,
|
49
|
+
:disposable_email,
|
50
|
+
value: value
|
51
|
+
)
|
46
52
|
end
|
47
53
|
end
|
48
54
|
|
@@ -19,16 +19,20 @@ module ActiveModel
|
|
19
19
|
scope = :invalid_ip_address
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
return if valid
|
23
|
+
|
24
|
+
record.errors.add(
|
25
|
+
attribute, scope,
|
26
|
+
message: options[:message],
|
27
|
+
value: value
|
28
|
+
)
|
28
29
|
end
|
29
30
|
|
30
31
|
def check_validity!
|
31
|
-
|
32
|
+
return unless options.key?(:only)
|
33
|
+
return if [:v4, :v6].include?(options[:only])
|
34
|
+
|
35
|
+
raise ArgumentError, ":only accepts a symbol that can be either :v6 or :v4"
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
@@ -36,8 +40,8 @@ module ActiveModel
|
|
36
40
|
# Validates whether or not the specified URL is valid.
|
37
41
|
#
|
38
42
|
# validates_ip_address :ip #=> accepts both v4 and v6
|
39
|
-
# validates_ip_address :ip, :
|
40
|
-
# validates_ip_address :ip, :
|
43
|
+
# validates_ip_address :ip, only: :v4
|
44
|
+
# validates_ip_address :ip, only: :v6
|
41
45
|
#
|
42
46
|
def validates_ip_address(*attr_names)
|
43
47
|
validates_with IpAddressValidator, _merge_attributes(attr_names)
|
@@ -5,12 +5,14 @@ module ActiveModel
|
|
5
5
|
owner = record.send(options[:with])
|
6
6
|
actual_owner = value ? value.send(options[:with]) : nil
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
return unless value
|
9
|
+
return if owner == actual_owner
|
10
|
+
|
11
|
+
record.errors.add(
|
12
|
+
attribute,
|
13
|
+
:invalid_owner,
|
14
|
+
message: options[:message]
|
15
|
+
)
|
14
16
|
end
|
15
17
|
|
16
18
|
def check_validity!
|
@@ -26,7 +28,7 @@ module ActiveModel
|
|
26
28
|
# belongs_to :user
|
27
29
|
# belongs_to :category
|
28
30
|
#
|
29
|
-
# validates_ownership_of :category, :
|
31
|
+
# validates_ownership_of :category, with: :user
|
30
32
|
# end
|
31
33
|
#
|
32
34
|
# user = User.find(1)
|
@@ -35,11 +37,11 @@ module ActiveModel
|
|
35
37
|
# user_category = user.categories.first
|
36
38
|
# another_user_category = another_user.categories.first
|
37
39
|
#
|
38
|
-
# task = user.tasks.create(:
|
40
|
+
# task = user.tasks.create(category: user_category)
|
39
41
|
# task.valid?
|
40
42
|
# #=> true
|
41
43
|
#
|
42
|
-
# task = user.tasks.create(:
|
44
|
+
# task = user.tasks.create(category: another_user_category)
|
43
45
|
# task.valid?
|
44
46
|
# #=> false
|
45
47
|
#
|
@@ -9,7 +9,9 @@ module ActiveModel
|
|
9
9
|
validate_type(record, attribute, sshkey)
|
10
10
|
validate_bits(record, attribute, sshkey)
|
11
11
|
rescue OpenSSL::PKey::DSAError, OpenSSL::PKey::RSAError
|
12
|
-
record.errors.add(
|
12
|
+
record.errors.add(
|
13
|
+
attribute,
|
14
|
+
:invalid_ssh_private_key,
|
13
15
|
message: options[:message],
|
14
16
|
value: value
|
15
17
|
)
|
@@ -20,23 +22,29 @@ module ActiveModel
|
|
20
22
|
def validate_type(record, attribute, sshkey)
|
21
23
|
return unless options[:type]
|
22
24
|
|
23
|
-
valid = [options[:type]]
|
24
|
-
.flatten.compact.map(&:to_s).include?(sshkey.type)
|
25
|
+
valid = [options[:type]].flatten.compact.map(&:to_s).include?(sshkey.type)
|
25
26
|
|
26
|
-
|
27
|
+
return if valid
|
28
|
+
|
29
|
+
record.errors.add(
|
30
|
+
attribute,
|
31
|
+
:invalid_ssh_private_key_type,
|
27
32
|
message: options[:message],
|
28
33
|
value: (%w[rsa dsa] - [sshkey.type])[0].upcase
|
29
|
-
)
|
34
|
+
)
|
30
35
|
end
|
31
36
|
|
32
37
|
def validate_bits(record, attribute, sshkey)
|
33
38
|
return unless options[:bits]
|
39
|
+
return if sshkey.bits >= options[:bits].to_i
|
34
40
|
|
35
|
-
record.errors.add(
|
41
|
+
record.errors.add(
|
42
|
+
attribute,
|
43
|
+
:invalid_ssh_private_key_bits,
|
36
44
|
message: options[:message],
|
37
45
|
value: sshkey.bits,
|
38
46
|
required: options[:bits]
|
39
|
-
)
|
47
|
+
)
|
40
48
|
end
|
41
49
|
end
|
42
50
|
|
@@ -4,11 +4,14 @@ module ActiveModel
|
|
4
4
|
def validate_each(record, attribute, value)
|
5
5
|
return if value.blank? && options[:allow_blank]
|
6
6
|
return if value.nil? && options[:allow_nil]
|
7
|
+
return if SSHKey.valid_ssh_public_key?(value)
|
7
8
|
|
8
|
-
record.errors.add(
|
9
|
+
record.errors.add(
|
10
|
+
attribute,
|
11
|
+
:invalid_ssh_public_key,
|
9
12
|
message: options[:message],
|
10
13
|
value: value
|
11
|
-
)
|
14
|
+
)
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
@@ -6,9 +6,11 @@ module ActiveModel
|
|
6
6
|
return if value.nil? && options[:allow_nil]
|
7
7
|
return if url?(value.to_s)
|
8
8
|
|
9
|
-
record.errors.add(
|
10
|
-
|
11
|
-
:
|
9
|
+
record.errors.add(
|
10
|
+
attribute,
|
11
|
+
:invalid_url,
|
12
|
+
message: options[:message],
|
13
|
+
value: value
|
12
14
|
)
|
13
15
|
end
|
14
16
|
|
data/lib/validators/version.rb
CHANGED
data/test/schema.rb
CHANGED
data/test/support/emails.rb
CHANGED
@@ -1,40 +1,50 @@
|
|
1
1
|
INVALID_EMAILS = [
|
2
|
-
|
2
|
+
"invalid@example-com",
|
3
3
|
# period can not start local part
|
4
|
-
|
4
|
+
".invalid@example.com",
|
5
5
|
# period can not end local part
|
6
|
-
|
6
|
+
"invalid.@example.com",
|
7
7
|
# period can not appear twice consecutively in local part
|
8
|
-
|
8
|
+
"invali..d@example.com",
|
9
9
|
# should not allow underscores in domain names
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
"invalid@ex_mple.com",
|
11
|
+
"invalid@example.com.",
|
12
|
+
"invalid@example.com_",
|
13
|
+
"invalid@example.com-",
|
14
|
+
"invalid-example.com",
|
15
|
+
"invalid@example.b#r.com",
|
16
|
+
"invalid@example.c",
|
17
|
+
"invali d@example.com",
|
18
|
+
"invalidexample.com",
|
19
|
+
"invalid@example.",
|
20
20
|
# from http://tools.ietf.org/html/rfc3696, page 5
|
21
21
|
# corrected in http://www.rfc-editor.org/errata_search.php?rfc=3696
|
22
22
|
'Fred\ Bloggs_@example.com',
|
23
23
|
'Abc\@def+@example.com',
|
24
|
-
'Joe.\\Blow@example.com'
|
24
|
+
'Joe.\\Blow@example.com',
|
25
|
+
'invalid.@hotmail.com',
|
26
|
+
'invalid.@outlook.com',
|
25
27
|
]
|
26
28
|
|
27
29
|
VALID_EMAILS = [
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
30
|
+
"valid@somedomain.com",
|
31
|
+
"Valid@test.somedomain.com",
|
32
|
+
"valid+valid123@test.somedomain.com",
|
33
|
+
"valid_valid123@test.somedomain.com",
|
34
|
+
"valid-valid+123@test.somedomain.co.uk",
|
35
|
+
"valid-valid+1.23@test.somedomain.com.au",
|
36
|
+
"valid@somedomain.co.uk",
|
37
|
+
"v@somedomain.com",
|
38
|
+
"valid@somedomain.ca",
|
39
|
+
"valid123.456@somedomain.org",
|
40
|
+
"valid@somedomain.mobi",
|
41
|
+
"valid@somedomain.info",
|
42
|
+
"valid-@hotmail.com",
|
43
|
+
"valid-@outlook.com",
|
44
|
+
"valid_@hotmail.com",
|
45
|
+
"valid_@outlook.com",
|
46
|
+
"valid_-_-_-_-_-_@hotmail.com",
|
47
|
+
"valid_-_-_-_-_-_@outlook.com",
|
48
|
+
"sub_total-5+8@hotmail.com",
|
49
|
+
"sub_total-5+8@outlook.com",
|
40
50
|
]
|
data/test/support/models.rb
CHANGED
data/test/support/urls.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
VALID_URLS = [
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
3
|
+
"http://example.com",
|
4
|
+
"http://example.com/",
|
5
|
+
"http://www.example.com/",
|
6
|
+
"http://sub.domain.example.com/",
|
7
|
+
"http://bbc.co.uk",
|
8
|
+
"http://example.com?foo",
|
9
|
+
"http://example.com?url=http://example.com",
|
10
|
+
"http://example.com:8000",
|
11
|
+
"http://www.sub.example.com/page.html?foo=bar&baz=%23#anchor",
|
12
|
+
"http://user:pass@example.com",
|
13
|
+
"http://user:@example.com",
|
14
|
+
"http://example.com/~user",
|
15
|
+
"http://example.museum",
|
16
|
+
"http://1.0.255.249",
|
17
|
+
"http://1.2.3.4:80",
|
18
|
+
"HttP://example.com",
|
19
|
+
"https://example.com",
|
20
|
+
# "http://räksmörgås.nu", # IDN
|
21
|
+
"http://xn--rksmrgs-5wao1o.nu", # Punycode
|
22
|
+
"http://www.xn--rksmrgs-5wao1o.nu",
|
23
|
+
"http://foo.bar.xn--rksmrgs-5wao1o.nu",
|
24
|
+
"http://example.xy", # Only valid TLD
|
25
|
+
"http://example.com.", # Explicit TLD root period
|
26
|
+
"http://example.com./foo"
|
27
27
|
]
|
28
28
|
|
29
29
|
INVALID_URLS = [
|
@@ -31,13 +31,13 @@ INVALID_URLS = [
|
|
31
31
|
"www.example.com",
|
32
32
|
"http://ex ample.com",
|
33
33
|
"http://example.com/foo bar",
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
"http://256.0.0.1",
|
35
|
+
"http://u:u:u@example.com",
|
36
|
+
"http://r?ksmorgas.com",
|
37
37
|
|
38
38
|
# These can all be valid local URLs, but should not be considered valid
|
39
39
|
# for public consumption.
|
40
40
|
"http://example",
|
41
41
|
"http://example.c",
|
42
|
-
|
42
|
+
"http://example.toolongtld"
|
43
43
|
]
|
@@ -5,7 +5,7 @@ class ValidatesDatetimeAfterOptionTest < Minitest::Test
|
|
5
5
|
|
6
6
|
test "rejects when date is set to before :after option" do
|
7
7
|
future_date = 1.week.from_now
|
8
|
-
User.validates_datetime :registered_at, :
|
8
|
+
User.validates_datetime :registered_at, after: future_date
|
9
9
|
user.registered_at = Time.now
|
10
10
|
|
11
11
|
refute user.valid?
|
@@ -13,14 +13,14 @@ class ValidatesDatetimeAfterOptionTest < Minitest::Test
|
|
13
13
|
end
|
14
14
|
|
15
15
|
test "accepts when date is set accordingly to the :after option" do
|
16
|
-
User.validates_datetime :registered_at, :
|
16
|
+
User.validates_datetime :registered_at, after: 1.week.from_now
|
17
17
|
user.registered_at = 2.weeks.from_now
|
18
18
|
|
19
19
|
assert user.valid?
|
20
20
|
end
|
21
21
|
|
22
22
|
test "validates using today as date" do
|
23
|
-
User.validates_datetime :registered_at, :
|
23
|
+
User.validates_datetime :registered_at, after: :today
|
24
24
|
|
25
25
|
user.registered_at = Time.now
|
26
26
|
refute user.valid?
|
@@ -36,7 +36,7 @@ class ValidatesDatetimeAfterOptionTest < Minitest::Test
|
|
36
36
|
end
|
37
37
|
|
38
38
|
test "validates using now as date" do
|
39
|
-
User.validates_datetime :registered_at, :
|
39
|
+
User.validates_datetime :registered_at, after: :now
|
40
40
|
|
41
41
|
user.registered_at = Time.now
|
42
42
|
refute user.valid?
|
@@ -53,7 +53,7 @@ class ValidatesDatetimeAfterOptionTest < Minitest::Test
|
|
53
53
|
|
54
54
|
test "validates using method as date" do
|
55
55
|
User.validates_datetime :starts_at
|
56
|
-
User.validates_datetime :ends_at, :
|
56
|
+
User.validates_datetime :ends_at, after: :starts_at, if: :starts_at?
|
57
57
|
|
58
58
|
user.starts_at = nil
|
59
59
|
user.ends_at = Time.now
|
@@ -7,7 +7,7 @@ class ValidatesDatetimeBeforeOptionTest < Minitest::Test
|
|
7
7
|
week_ago = 1.week.ago
|
8
8
|
now = Time.now
|
9
9
|
|
10
|
-
User.validates_datetime :registered_at, :
|
10
|
+
User.validates_datetime :registered_at, before: week_ago
|
11
11
|
user.registered_at = now
|
12
12
|
|
13
13
|
refute user.valid?
|
@@ -15,7 +15,7 @@ class ValidatesDatetimeBeforeOptionTest < Minitest::Test
|
|
15
15
|
end
|
16
16
|
|
17
17
|
test "accepts when date is set accordingly to the :before option" do
|
18
|
-
User.validates_datetime :registered_at, :
|
18
|
+
User.validates_datetime :registered_at, before: 1.week.ago
|
19
19
|
user.registered_at = 2.weeks.ago
|
20
20
|
|
21
21
|
assert user.valid?
|