client_side_validations-rails_2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/HISTORY +5 -0
- data/README.markdown +45 -0
- data/Rakefile +21 -0
- data/client_side_validations-rails_2.gemspec +35 -0
- data/generators/client_side_validations/client_side_validations_generator.rb +14 -0
- data/lib/client_side_validations/rails_2.rb +5 -0
- data/lib/client_side_validations/rails_2/action_view.rb +7 -0
- data/lib/client_side_validations/rails_2/action_view/form_helper.rb +11 -0
- data/lib/client_side_validations/rails_2/action_view/form_tag_helper.rb +6 -0
- data/lib/client_side_validations/rails_2/active_record.rb +14 -0
- data/lib/client_side_validations/rails_2/active_record/active_model.rb +12 -0
- data/lib/client_side_validations/rails_2/active_record/active_model/validations.rb +51 -0
- data/lib/client_side_validations/rails_2/active_record/active_model/validations/base.rb +25 -0
- data/lib/client_side_validations/rails_2/active_record/active_model/validations/numericality.rb +5 -0
- data/lib/client_side_validations/rails_2/active_record/middleware.rb +42 -0
- data/lib/client_side_validations/rails_2/active_record/validations.rb +23 -0
- data/lib/client_side_validations/rails_2/middleware.rb +22 -0
- data/lib/client_side_validations/rails_2/version.rb +5 -0
- data/test/action_view/cases/helper.rb +155 -0
- data/test/action_view/cases/test_helpers.rb +516 -0
- data/test/action_view/cases/test_legacy_helpers.rb +140 -0
- data/test/action_view/models.rb +2 -0
- data/test/action_view/models/comment.rb +26 -0
- data/test/action_view/models/post.rb +31 -0
- data/test/active_record/cases/helper.rb +13 -0
- data/test/active_record/cases/test_base.rb +10 -0
- data/test/active_record/cases/test_middleware.rb +157 -0
- data/test/active_record/cases/test_validation_reflection.rb +144 -0
- data/test/active_record/cases/test_validations.rb +27 -0
- data/test/active_record/models/guid.rb +7 -0
- data/test/active_record/models/user.rb +11 -0
- data/test/base_helper.rb +10 -0
- data/test/middleware/cases/helper.rb +6 -0
- metadata +237 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'action_view/cases/helper'
|
2
|
+
|
3
|
+
class ClientSideValidations::LegacyActionViewHelpersTest < ActionView::TestCase
|
4
|
+
include ActionViewTestSetup
|
5
|
+
|
6
|
+
def test_text_field
|
7
|
+
form_for(@post) do |f|
|
8
|
+
concat f.text_field(:cost)
|
9
|
+
end
|
10
|
+
|
11
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
12
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="text" />}
|
13
|
+
end
|
14
|
+
assert_equal expected, output_buffer
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_password_field
|
18
|
+
form_for(@post) do |f|
|
19
|
+
concat f.password_field(:cost)
|
20
|
+
end
|
21
|
+
|
22
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
23
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="password" />}
|
24
|
+
end
|
25
|
+
assert_equal expected, output_buffer
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_file_field
|
29
|
+
form_for(@post) do |f|
|
30
|
+
concat f.file_field(:cost)
|
31
|
+
end
|
32
|
+
|
33
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
34
|
+
%{<input id="post_cost" name="post[cost]" size=\"30\" type="file" />}
|
35
|
+
end
|
36
|
+
assert_equal expected, output_buffer
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_text_area
|
40
|
+
form_for(@post) do |f|
|
41
|
+
concat f.text_area(:cost)
|
42
|
+
end
|
43
|
+
|
44
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
45
|
+
%{<textarea cols="40" id="post_cost" name="post[cost]" rows="20"></textarea>}
|
46
|
+
end
|
47
|
+
assert_equal expected, output_buffer
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_check_box
|
51
|
+
form_for(@post) do |f|
|
52
|
+
concat f.check_box(:cost)
|
53
|
+
end
|
54
|
+
|
55
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
56
|
+
%{<input name="post[cost]" type="hidden" value="0" />} +
|
57
|
+
%{<input id="post_cost" name="post[cost]" type="checkbox" value="1" />}
|
58
|
+
end
|
59
|
+
assert_equal expected, output_buffer
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_radio_button
|
63
|
+
form_for(@post) do |f|
|
64
|
+
concat f.radio_button(:cost, "10")
|
65
|
+
end
|
66
|
+
|
67
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
68
|
+
%{<input id="post_cost_10" name="post[cost]" type="radio" value="10" />}
|
69
|
+
end
|
70
|
+
assert_equal expected, output_buffer
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_fields_for
|
74
|
+
result = fields_for(@comment) do |c|
|
75
|
+
c.text_field(:title)
|
76
|
+
end
|
77
|
+
|
78
|
+
expected = %{<input id="comment_title" name="comment[title]" size="30" type="text" />}
|
79
|
+
|
80
|
+
assert_equal expected, result
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_select
|
84
|
+
form_for(@post) do |f|
|
85
|
+
concat f.select(:cost, [])
|
86
|
+
end
|
87
|
+
|
88
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
89
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
90
|
+
end
|
91
|
+
assert_equal expected, output_buffer
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_select_multiple
|
95
|
+
form_for(@post) do |f|
|
96
|
+
concat f.select(:cost, [], {}, :multiple => true)
|
97
|
+
end
|
98
|
+
|
99
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
100
|
+
%{<select id="post_cost" multiple="multiple" name="post[cost][]"></select>}
|
101
|
+
end
|
102
|
+
assert_equal expected, output_buffer
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_collection_select
|
106
|
+
form_for(@post) do |f|
|
107
|
+
concat f.collection_select(:cost, [], :id, :name)
|
108
|
+
end
|
109
|
+
|
110
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
111
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
112
|
+
end
|
113
|
+
assert_equal expected, output_buffer
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_grouped_collection_select
|
117
|
+
form_for(@post) do |f|
|
118
|
+
concat f.grouped_collection_select(:cost, [], :group_method, :group_label_method, :id, :name)
|
119
|
+
end
|
120
|
+
|
121
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
122
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
123
|
+
end
|
124
|
+
assert_equal expected, output_buffer
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_time_zone_select
|
128
|
+
zones = mock('TimeZones')
|
129
|
+
zones.stubs(:all).returns([])
|
130
|
+
form_for(@post) do |f|
|
131
|
+
concat f.time_zone_select(:cost, nil, :model => zones)
|
132
|
+
end
|
133
|
+
|
134
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
135
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
136
|
+
end
|
137
|
+
assert_equal expected, output_buffer
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Comment
|
2
|
+
attr_reader :id
|
3
|
+
attr_reader :post_id
|
4
|
+
attr_reader :title
|
5
|
+
def initialize(id = nil, post_id = nil); @id, @post_id = id, post_id end
|
6
|
+
def save; @id = 1; @post_id = 1 end
|
7
|
+
def new_record?; @id.nil? end
|
8
|
+
def to_param; @id; end
|
9
|
+
def name
|
10
|
+
@id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_accessor :relevances
|
14
|
+
def relevances_attributes=(attributes); end
|
15
|
+
|
16
|
+
def client_side_validation_hash
|
17
|
+
{
|
18
|
+
:title => {
|
19
|
+
:presence => {
|
20
|
+
:message => "can't be blank"
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Post < Struct.new(:title, :author_name, :body, :secret, :written_on, :cost)
|
2
|
+
alias_method :secret?, :secret
|
3
|
+
|
4
|
+
def persisted=(boolean)
|
5
|
+
@persisted = boolean
|
6
|
+
end
|
7
|
+
|
8
|
+
def persisted?
|
9
|
+
@persisted
|
10
|
+
end
|
11
|
+
|
12
|
+
def client_side_validation_hash
|
13
|
+
{
|
14
|
+
:cost => {
|
15
|
+
:presence => {
|
16
|
+
:message => "can't be blank"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_accessor :author
|
23
|
+
def author_attributes=(attributes); end
|
24
|
+
|
25
|
+
attr_accessor :comments, :comment_ids
|
26
|
+
def comments_attributes=(attributes); end
|
27
|
+
|
28
|
+
attr_accessor :tags
|
29
|
+
def tags_attributes=(attributes); end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'base_helper'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
# Connection must be establised before anything else
|
5
|
+
ActiveRecord::Base.establish_connection(
|
6
|
+
:adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3',
|
7
|
+
:database => ':memory:'
|
8
|
+
)
|
9
|
+
|
10
|
+
require 'client_side_validations/rails_2/active_record'
|
11
|
+
require 'active_record/models/user'
|
12
|
+
require 'active_record/models/guid'
|
13
|
+
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'middleware/cases/helper'
|
4
|
+
require 'active_record/cases/helper'
|
5
|
+
|
6
|
+
class ClientSideValidationsActiveRecordMiddlewareTest < Test::Unit::TestCase
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
User.delete_all
|
11
|
+
end
|
12
|
+
|
13
|
+
def with_kcode(kcode)
|
14
|
+
if RUBY_VERSION < '1.9'
|
15
|
+
orig_kcode, $KCODE = $KCODE, kcode
|
16
|
+
begin
|
17
|
+
yield
|
18
|
+
ensure
|
19
|
+
$KCODE = orig_kcode
|
20
|
+
end
|
21
|
+
else
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def app
|
27
|
+
app = Proc.new { |env| [200, {}, ['success']] }
|
28
|
+
ClientSideValidations::Middleware::Validators.new(app)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_uniqueness_when_resource_exists
|
32
|
+
User.create(:email => 'user@test.com')
|
33
|
+
get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'case_sensitive' => true }
|
34
|
+
|
35
|
+
assert_equal 'false', last_response.body
|
36
|
+
assert last_response.ok?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_uniqueness_when_resource_exists_and_param_order_is_backwards
|
40
|
+
User.create(:email => 'user@test.com')
|
41
|
+
get '/validators/uniqueness.json', { 'case_sensitive' => true, 'user[email]' => 'user@test.com' }
|
42
|
+
|
43
|
+
assert_equal 'false', last_response.body
|
44
|
+
assert last_response.ok?
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_uniqueness_when_resource_does_not_exist
|
48
|
+
get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'case_sensitive' => true }
|
49
|
+
|
50
|
+
assert_equal 'true', last_response.body
|
51
|
+
assert last_response.not_found?
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_uniqueness_when_id_is_given
|
55
|
+
user = User.create(:email => 'user@test.com')
|
56
|
+
get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'id' => user.id, 'case_sensitive' => true }
|
57
|
+
|
58
|
+
assert_equal 'true', last_response.body
|
59
|
+
assert last_response.not_found?
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_uniqueness_when_scope_is_given
|
63
|
+
User.create(:email => 'user@test.com', :age => 25)
|
64
|
+
get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'scope' => { 'age' => 30 }, 'case_sensitive' => true }
|
65
|
+
|
66
|
+
assert_equal 'true', last_response.body
|
67
|
+
assert last_response.not_found?
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_uniqueness_when_multiple_scopes_are_given
|
71
|
+
User.create(:email => 'user@test.com', :age => 30, :name => 'Brian')
|
72
|
+
get '/validators/uniqueness.json', { 'user[email]' => 'user@test.com', 'scope' => { 'age' => 30, 'name' => 'Robert' }, 'case_sensitive' => true }
|
73
|
+
|
74
|
+
assert_equal 'true', last_response.body
|
75
|
+
assert last_response.not_found?
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_uniqueness_when_case_insensitive
|
79
|
+
User.create(:name => 'Brian')
|
80
|
+
get '/validators/uniqueness.json', { 'user[name]' => 'BRIAN', 'case_sensitive' => false }
|
81
|
+
|
82
|
+
assert_equal 'false', last_response.body
|
83
|
+
assert last_response.ok?
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_uniqueness_when_attribute_passes_as_an_integer
|
87
|
+
User.create(:name => 123)
|
88
|
+
get '/validators/uniqueness.json', { 'user[name]' => 123, 'case_sensitive' => true }
|
89
|
+
|
90
|
+
assert_equal 'false', last_response.body
|
91
|
+
assert last_response.ok?
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_uniqueness_when_attribute_passes_as_an_integer
|
95
|
+
User.create(:name => 123)
|
96
|
+
get '/validators/uniqueness.json', { 'user[name]' => 123, 'case_sensitive' => true }
|
97
|
+
|
98
|
+
assert_equal 'false', last_response.body
|
99
|
+
assert last_response.ok?
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_uniqueness_with_columns_which_are_sql_keywords
|
103
|
+
Guid.validates_uniqueness_of :key
|
104
|
+
assert_nothing_raised do
|
105
|
+
get '/validators/uniqueness.json', { 'guid[key]' => 'test', 'case_sensitive' => true }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_uniqueness_with_limit
|
110
|
+
# User.title is limited to 5 characters
|
111
|
+
User.create(:title => "abcde")
|
112
|
+
get '/validators/uniqueness.json', { 'user[title]' => 'abcdefgh', 'case_sensitive' => true }
|
113
|
+
|
114
|
+
assert_equal 'false', last_response.body
|
115
|
+
assert last_response.ok?
|
116
|
+
end
|
117
|
+
|
118
|
+
# def test_uniqueness_with_limit_and_utf8
|
119
|
+
# with_kcode('UTF8') do
|
120
|
+
# # User.title is limited to 5 characters
|
121
|
+
# User.create(:title => "一二三四五")
|
122
|
+
# get '/validators/uniqueness.json', { 'user[title]' => '一二三四五六七八', 'case_sensitive' => true }
|
123
|
+
|
124
|
+
# assert_equal 'false', last_response.body
|
125
|
+
# assert last_response.ok?
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
|
129
|
+
def test_validate_straight_inheritance_uniqueness
|
130
|
+
get '/validators/uniqueness.json', { 'inept_wizard[name]' => 'Rincewind', 'case_sensitive' => true }
|
131
|
+
assert_equal 'true', last_response.body
|
132
|
+
assert last_response.not_found?
|
133
|
+
|
134
|
+
IneptWizard.create(:name => 'Rincewind')
|
135
|
+
get '/validators/uniqueness.json', { 'inept_wizard[name]' => 'Rincewind', 'case_sensitive' => true }
|
136
|
+
assert_equal 'false', last_response.body
|
137
|
+
assert last_response.ok?
|
138
|
+
|
139
|
+
get '/validators/uniqueness.json', { 'conjurer[name]' => 'Rincewind', 'case_sensitive' => true }
|
140
|
+
assert_equal 'false', last_response.body
|
141
|
+
assert last_response.ok?
|
142
|
+
|
143
|
+
Conjurer.create(:name => 'The Amazing Bonko')
|
144
|
+
get '/validators/uniqueness.json', { 'thaumaturgist[name]' => 'The Amazing Bonko', 'case_sensitive' => true }
|
145
|
+
assert_equal 'false', last_response.body
|
146
|
+
assert last_response.ok?
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_uniqueness_when_resource_is_a_nested_module
|
150
|
+
ActiveRecordTestModule::User2.create(:email => 'user@test.com')
|
151
|
+
get '/validators/uniqueness.json', { 'active_record_test_module/user2[email]' => 'user@test.com', 'case_sensitive' => true }
|
152
|
+
|
153
|
+
assert_equal 'false', last_response.body
|
154
|
+
assert last_response.ok?
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'active_record/cases/test_base'
|
2
|
+
|
3
|
+
class ValidationReflectionTest < ClientSideValidations::ActiveRecordTestBase
|
4
|
+
|
5
|
+
def new_user
|
6
|
+
user = Class.new(User)
|
7
|
+
def user.name
|
8
|
+
'User'
|
9
|
+
end
|
10
|
+
yield(user)
|
11
|
+
user.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_acceptance_validator
|
15
|
+
user = new_user do |u|
|
16
|
+
u.validates_acceptance_of :flag
|
17
|
+
end
|
18
|
+
validator = ActiveModel::Validations::AcceptanceValidator.new(:flag)
|
19
|
+
expected = { :flag => [validator] }
|
20
|
+
assert_equal expected, user._validators
|
21
|
+
assert_equal :acceptance, validator.kind
|
22
|
+
user.flag = false
|
23
|
+
user.valid?
|
24
|
+
assert_equal 'must be accepted', user.errors[:flag]
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_confirmation_validator
|
28
|
+
user = new_user do |u|
|
29
|
+
u.validates_confirmation_of :name
|
30
|
+
end
|
31
|
+
validator = ActiveModel::Validations::ConfirmationValidator.new(:name)
|
32
|
+
expected = { :name => [validator] }
|
33
|
+
assert_equal expected, user._validators
|
34
|
+
assert_equal :confirmation, validator.kind
|
35
|
+
user.name_confirmation = 'Brian'
|
36
|
+
user.valid?
|
37
|
+
assert_equal "doesn't match confirmation", user.errors[:name]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_exclusion_validator
|
41
|
+
user = new_user do |u|
|
42
|
+
u.validates_exclusion_of :name, :in => ['Brian']
|
43
|
+
end
|
44
|
+
validator = ActiveModel::Validations::ExclusionValidator.new(:name, :in => ['Brian'])
|
45
|
+
expected = { :name => [validator] }
|
46
|
+
assert_equal expected, user._validators
|
47
|
+
assert_equal :exclusion, validator.kind
|
48
|
+
user.name = 'Brian'
|
49
|
+
user.valid?
|
50
|
+
assert_equal "is reserved", user.errors[:name]
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_format_validator
|
54
|
+
user = new_user do |u|
|
55
|
+
u.validates_format_of :name, :with => /\w+/
|
56
|
+
end
|
57
|
+
validator = ActiveModel::Validations::FormatValidator.new(:name, :with => /\w+/)
|
58
|
+
expected = { :name => [validator] }
|
59
|
+
assert_equal expected, user._validators
|
60
|
+
assert_equal :format, validator.kind
|
61
|
+
user.valid?
|
62
|
+
assert_equal "is invalid", user.errors[:name]
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_inclusion_validator
|
66
|
+
user = new_user do |u|
|
67
|
+
u.validates_inclusion_of :name, :in => ['Brian']
|
68
|
+
end
|
69
|
+
validator = ActiveModel::Validations::InclusionValidator.new(:name, :in => ['Brian'])
|
70
|
+
expected = { :name => [validator] }
|
71
|
+
assert_equal expected, user._validators
|
72
|
+
assert_equal :inclusion, validator.kind
|
73
|
+
user.name = 'Steph'
|
74
|
+
user.valid?
|
75
|
+
assert_equal "is not included in the list", user.errors[:name]
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_length_validator
|
79
|
+
user = new_user do |u|
|
80
|
+
u.validates_length_of :name, :is => 10
|
81
|
+
end
|
82
|
+
validator = ActiveModel::Validations::LengthValidator.new(:name, :is => 10)
|
83
|
+
expected = { :name => [validator] }
|
84
|
+
assert_equal expected, user._validators
|
85
|
+
assert_equal :length, validator.kind
|
86
|
+
user.name = 'Brian'
|
87
|
+
user.valid?
|
88
|
+
assert_equal "is the wrong length (should be 10 characters)", user.errors[:name]
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_numericality_validator
|
92
|
+
user = new_user do |u|
|
93
|
+
u.validates_numericality_of :age
|
94
|
+
end
|
95
|
+
validator = ActiveModel::Validations::NumericalityValidator.new(:age)
|
96
|
+
expected = { :age => [validator] }
|
97
|
+
assert_equal expected, user._validators
|
98
|
+
assert_equal :numericality, validator.kind
|
99
|
+
user.age = 'Brian'
|
100
|
+
user.valid?
|
101
|
+
assert_equal "is not a number", user.errors[:age]
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_presence_validator
|
105
|
+
user = new_user do |u|
|
106
|
+
u.validates_presence_of :name
|
107
|
+
end
|
108
|
+
validator = ActiveModel::Validations::PresenceValidator.new(:name)
|
109
|
+
expected = { :name => [validator] }
|
110
|
+
assert_equal expected, user._validators
|
111
|
+
assert_equal :presence, validator.kind
|
112
|
+
user.valid?
|
113
|
+
assert_equal "can't be blank", user.errors[:name]
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_size_validator
|
117
|
+
user = new_user do |u|
|
118
|
+
u.validates_size_of :name, :is => 10
|
119
|
+
end
|
120
|
+
validator = ActiveModel::Validations::LengthValidator.new(:name, :is => 10)
|
121
|
+
expected = { :name => [validator] }
|
122
|
+
assert_equal expected, user._validators
|
123
|
+
assert_equal :length, validator.kind
|
124
|
+
user.name = 'brian'
|
125
|
+
user.valid?
|
126
|
+
assert_equal "is the wrong length (should be 10 characters)", user.errors[:name]
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_uniqueness_validator
|
130
|
+
user = new_user do |u|
|
131
|
+
u.validates_uniqueness_of :name
|
132
|
+
end
|
133
|
+
validator = ActiveRecord::Validations::UniquenessValidator.new(:name)
|
134
|
+
expected = { :name => [validator] }
|
135
|
+
assert_equal expected, user._validators
|
136
|
+
assert_equal :uniqueness, validator.kind
|
137
|
+
User.create(:name => 'Brian')
|
138
|
+
user.name = 'Brian'
|
139
|
+
user.valid?
|
140
|
+
assert_equal "has already been taken", user.errors[:name]
|
141
|
+
User.destroy_all
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|