-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
validatable_test.rb
124 lines (98 loc) · 4.06 KB
/
validatable_test.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
116
117
118
119
120
121
122
123
124
# encoding: UTF-8
# frozen_string_literal: true
require 'test_helper'
class ValidatableTest < ActiveSupport::TestCase
test 'should require email to be set' do
user = new_user(email: nil)
assert user.invalid?
assert user.errors[:email]
assert user.errors.added?(:email, :blank)
end
test 'should require uniqueness of email if email has changed, allowing blank' do
existing_user = create_user
user = new_user(email: '')
assert user.invalid?
assert_no_match(/taken/, user.errors[:email].join)
user.email = existing_user.email
assert user.invalid?
assert_match(/taken/, user.errors[:email].join)
user.save(validate: false)
assert user.valid?
end
test 'should require correct email format if email has changed, allowing blank' do
user = new_user(email: '')
assert user.invalid?
assert_not_equal 'is invalid', user.errors[:email].join
%w{invalid_email_format 123 $$$ () ☃}.each do |email|
user.email = email
assert user.invalid?, "should be invalid with email #{email}"
assert_equal 'is invalid', user.errors[:email].join
end
user.save(validate: false)
assert user.valid?
end
test 'should accept valid emails' do
%w([email protected] [email protected] [email protected] [email protected] [email protected] 1☃[email protected]).each do |email|
user = new_user(email: email)
assert user.valid?, "should be valid with email #{email}"
assert_blank user.errors[:email]
end
end
test 'should require password to be set when creating a new record' do
user = new_user(password: '', password_confirmation: '')
assert user.invalid?
assert user.errors.added?(:password, :blank)
end
test 'should require confirmation to be set when creating a new record' do
user = new_user(password: 'new_password', password_confirmation: 'blabla')
assert user.invalid?
assert user.errors.added?(:password_confirmation, :confirmation, attribute: "Password")
end
test 'should require password when updating/resetting password' do
user = create_user
user.password = ''
user.password_confirmation = ''
assert user.invalid?
assert user.errors.added?(:password, :blank)
end
test 'should require confirmation when updating/resetting password' do
user = create_user
user.password_confirmation = 'another_password'
assert user.invalid?
assert user.errors.added?(:password_confirmation, :confirmation, attribute: "Password")
end
test 'should require a password with minimum of 7 characters' do
user = new_user(password: '12345', password_confirmation: '12345')
assert user.invalid?
assert_equal 'is too short (minimum is 7 characters)', user.errors[:password].join
end
test 'should require a password with maximum of 72 characters long' do
user = new_user(password: 'x'*73, password_confirmation: 'x'*73)
assert user.invalid?
assert_equal 'is too long (maximum is 72 characters)', user.errors[:password].join
end
test 'should not require password length when it\'s not changed' do
user = create_user.reload
user.password = user.password_confirmation = nil
assert user.valid?
user.password_confirmation = 'confirmation'
assert user.invalid?
assert_not (user.errors[:password].join =~ /is too long/)
end
test 'should complain about length even if password is not required' do
user = new_user(password: 'x'*73, password_confirmation: 'x'*73)
user.stubs(:password_required?).returns(false)
assert user.invalid?
assert_equal 'is too long (maximum is 72 characters)', user.errors[:password].join
end
test 'should not be included in objects with invalid API' do
exception = assert_raise RuntimeError do
Class.new.send :include, Devise::Models::Validatable
end
expected_message = /Could not use :validatable module since .* does not respond to the following methods: validates_presence_of.*/
assert_match expected_message, exception.message
end
test 'required_fields should be an empty array' do
assert_equal [], Devise::Models::Validatable.required_fields(User)
end
end