client_side_validations 2.9.9 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. data/client_side_validations.gemspec +45 -0
  2. data/javascript/rails.validations.js +380 -0
  3. data/lib/client_side_validations.rb +5 -57
  4. data/lib/client_side_validations/action_view.rb +13 -0
  5. data/lib/client_side_validations/action_view/form_builder.rb +57 -0
  6. data/lib/client_side_validations/action_view/form_helper.rb +58 -0
  7. data/lib/client_side_validations/action_view/form_tag_helper.rb +12 -0
  8. data/lib/client_side_validations/active_model.rb +46 -0
  9. data/lib/client_side_validations/active_model/acceptance.rb +10 -0
  10. data/lib/client_side_validations/active_model/exclusion.rb +15 -0
  11. data/lib/client_side_validations/active_model/format.rb +10 -0
  12. data/lib/client_side_validations/active_model/inclusion.rb +15 -0
  13. data/lib/client_side_validations/active_model/length.rb +22 -0
  14. data/lib/client_side_validations/active_model/numericality.rb +26 -0
  15. data/lib/client_side_validations/active_model/presence.rb +10 -0
  16. data/lib/client_side_validations/active_record.rb +11 -0
  17. data/lib/client_side_validations/active_record/middleware.rb +25 -0
  18. data/lib/client_side_validations/active_record/uniqueness.rb +24 -0
  19. data/lib/client_side_validations/core_ext.rb +3 -0
  20. data/lib/client_side_validations/core_ext/range.rb +10 -0
  21. data/lib/client_side_validations/core_ext/regexp.rb +14 -0
  22. data/lib/client_side_validations/formtastic.rb +21 -0
  23. data/lib/client_side_validations/middleware.rb +83 -0
  24. data/lib/client_side_validations/mongoid.rb +9 -0
  25. data/lib/client_side_validations/mongoid/middleware.rb +20 -0
  26. data/lib/client_side_validations/mongoid/uniqueness.rb +24 -0
  27. data/lib/client_side_validations/simple_form.rb +24 -0
  28. data/lib/client_side_validations/version.rb +3 -0
  29. data/lib/generators/client_side_validations/install_generator.rb +22 -0
  30. data/lib/generators/templates/README +7 -0
  31. data/lib/generators/templates/client_side_validations.rb +14 -0
  32. data/test/action_view/cases/helper.rb +152 -0
  33. data/test/action_view/cases/test_helpers.rb +222 -0
  34. data/test/action_view/cases/test_legacy_helpers.rb +150 -0
  35. data/test/action_view/models.rb +3 -0
  36. data/test/action_view/models/comment.rb +35 -0
  37. data/test/action_view/models/post.rb +35 -0
  38. data/test/active_model/cases/helper.rb +4 -0
  39. data/test/active_model/cases/test_acceptance_validator.rb +16 -0
  40. data/test/active_model/cases/test_base.rb +11 -0
  41. data/test/active_model/cases/test_confirmation_validator.rb +16 -0
  42. data/test/active_model/cases/test_exclusion_validator.rb +20 -0
  43. data/test/active_model/cases/test_format_validator.rb +21 -0
  44. data/test/active_model/cases/test_inclusion_validator.rb +21 -0
  45. data/test/active_model/cases/test_length_validator.rb +61 -0
  46. data/test/active_model/cases/test_numericality_validator.rb +46 -0
  47. data/test/active_model/cases/test_presence_validator.rb +16 -0
  48. data/test/active_model/cases/test_validations.rb +132 -0
  49. data/test/active_model/models/person.rb +12 -0
  50. data/test/active_record/cases/helper.rb +12 -0
  51. data/test/active_record/cases/test_base.rb +11 -0
  52. data/test/active_record/cases/test_middleware.rb +150 -0
  53. data/test/active_record/cases/test_uniqueness_validator.rb +31 -0
  54. data/test/active_record/models/guid.rb +7 -0
  55. data/test/active_record/models/user.rb +10 -0
  56. data/test/base_helper.rb +6 -0
  57. data/test/core_ext/cases/test_core_ext.rb +45 -0
  58. data/test/formtastic/cases/helper.rb +2 -0
  59. data/test/formtastic/cases/test_form_builder.rb +11 -0
  60. data/test/formtastic/cases/test_form_helper.rb +22 -0
  61. data/test/generators/cases/test_install_generator.rb +15 -0
  62. data/test/javascript/config.ru +3 -0
  63. data/test/javascript/public/test/callbacks/elementAfter.js +53 -0
  64. data/test/javascript/public/test/callbacks/elementBefore.js +53 -0
  65. data/test/javascript/public/test/callbacks/elementFail.js +69 -0
  66. data/test/javascript/public/test/callbacks/elementPass.js +69 -0
  67. data/test/javascript/public/test/callbacks/formAfter.js +44 -0
  68. data/test/javascript/public/test/callbacks/formBefore.js +44 -0
  69. data/test/javascript/public/test/callbacks/formFail.js +50 -0
  70. data/test/javascript/public/test/callbacks/formPass.js +49 -0
  71. data/test/javascript/public/test/form_builders/validateForm.js +65 -0
  72. data/test/javascript/public/test/form_builders/validateFormtastic.js +51 -0
  73. data/test/javascript/public/test/form_builders/validateSimpleForm.js +54 -0
  74. data/test/javascript/public/test/settings.js +15 -0
  75. data/test/javascript/public/test/validateElement.js +138 -0
  76. data/test/javascript/public/test/validators/acceptance.js +42 -0
  77. data/test/javascript/public/test/validators/confirmation.js +25 -0
  78. data/test/javascript/public/test/validators/exclusion.js +41 -0
  79. data/test/javascript/public/test/validators/format.js +27 -0
  80. data/test/javascript/public/test/validators/inclusion.js +42 -0
  81. data/test/javascript/public/test/validators/length.js +70 -0
  82. data/test/javascript/public/test/validators/numericality.js +135 -0
  83. data/test/javascript/public/test/validators/presence.js +15 -0
  84. data/test/javascript/public/test/validators/uniqueness.js +88 -0
  85. data/test/javascript/public/vendor/jquery.metadata.js +122 -0
  86. data/test/javascript/public/vendor/qunit.css +196 -0
  87. data/test/javascript/public/vendor/qunit.js +1374 -0
  88. data/test/javascript/server.rb +78 -0
  89. data/test/javascript/views/index.erb +20 -0
  90. data/test/javascript/views/layout.erb +21 -0
  91. data/test/middleware/cases/helper.rb +15 -0
  92. data/test/middleware/cases/test_middleware.rb +8 -0
  93. data/test/mongoid/cases/helper.rb +16 -0
  94. data/test/mongoid/cases/test_base.rb +15 -0
  95. data/test/mongoid/cases/test_middleware.rb +68 -0
  96. data/test/mongoid/cases/test_uniqueness_validator.rb +31 -0
  97. data/test/mongoid/models/book.rb +8 -0
  98. data/test/simple_form/cases/helper.rb +2 -0
  99. data/test/simple_form/cases/test_form_builder.rb +14 -0
  100. data/test/simple_form/cases/test_form_helper.rb +22 -0
  101. metadata +230 -111
  102. data/LICENSE +0 -24
  103. data/README.markdown +0 -132
  104. data/generators/client_side_validations/client_side_validations_generator.rb +0 -17
  105. data/javascript/lib/client_side_validations.js +0 -93
  106. data/javascript/lib/jquery-validation.js +0 -1146
  107. data/lib/client_side_validations/adapters/action_view.rb +0 -153
  108. data/lib/client_side_validations/adapters/active_model.rb +0 -137
  109. data/lib/client_side_validations/adapters/orm_base.rb +0 -89
  110. data/lib/client_side_validations/orm.rb +0 -226
  111. data/lib/client_side_validations/rails.rb +0 -11
  112. data/lib/client_side_validations/template.rb +0 -3
  113. data/lib/generators/client_side_validations_generator.rb +0 -15
@@ -0,0 +1,16 @@
1
+ require 'active_model/cases/test_base'
2
+
3
+ class ActiveModel::InclusionValidatorTest < ClientSideValidations::ActiveModelTestBase
4
+
5
+ def test_presence_client_side_hash
6
+ expected_hash = { :message => "can't be blank" }
7
+ assert_equal expected_hash, PresenceValidator.new(:attributes => [:name]).client_side_hash(@person, :age)
8
+ end
9
+
10
+ def test_presence_client_side_hash_with_custom_message
11
+ expected_hash = { :message => "is required" }
12
+ assert_equal expected_hash, PresenceValidator.new(:attributes => [:name], :message => "is required").client_side_hash(@person, :age)
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,132 @@
1
+ require 'active_model/cases/test_base'
2
+
3
+ class ActiveModel::ValidationsTest < ClientSideValidations::ActiveModelTestBase
4
+
5
+ class Person
6
+ include ::ActiveModel::Validations
7
+ attr_accessor :first_name, :last_name, :age, :weight
8
+
9
+ def self.name
10
+ "Person"
11
+ end
12
+
13
+ def new_record?
14
+ true
15
+ end
16
+ end
17
+
18
+ def new_person
19
+ person = Class.new(Person)
20
+ yield(person)
21
+ person.new
22
+ end
23
+
24
+ def test_validations_to_client_side_hash
25
+ person = new_person do |p|
26
+ p.validates_presence_of :first_name
27
+ end
28
+ expected_hash = {
29
+ :first_name => {
30
+ :presence => {
31
+ :message => "can't be blank"
32
+ }
33
+ }
34
+ }
35
+ assert_equal expected_hash, person.client_side_validation_hash
36
+ end
37
+
38
+ def test_validations_to_client_side_hash_with_validations_allow_blank
39
+ person = new_person do |p|
40
+ p.validates_length_of :first_name, :is => 10, :allow_blank => true
41
+ p.validates_format_of :first_name, :with => //, :allow_blank => true
42
+ end
43
+ expected_hash = {
44
+ :first_name => {
45
+ :length => {
46
+ :messages => { :is => 'is the wrong length (should be 10 characters)'},
47
+ :is => 10,
48
+ :allow_blank => true
49
+ },
50
+ :format => {
51
+ :message => 'is invalid',
52
+ :with => //,
53
+ :allow_blank => true
54
+ }
55
+ }
56
+ }
57
+ assert_equal expected_hash, person.client_side_validation_hash
58
+ end
59
+
60
+ def test_validations_to_client_side_hash_with_validations_on_create
61
+ person = new_person do |p|
62
+ p.validates_length_of :first_name, :is => 10, :on => :create
63
+ p.validates_length_of :last_name, :is => 10, :on => :update
64
+ p.validates_format_of :first_name, :with => //, :on => :update
65
+ p.validates_format_of :last_name, :with => //, :on => :create
66
+ p.validates_numericality_of :age, :on => :create
67
+ p.validates_numericality_of :weight, :on => :update
68
+ p.class_eval do
69
+ def new_record?
70
+ true
71
+ end
72
+ end
73
+ end
74
+ expected_hash = {
75
+ :first_name => {
76
+ :length => {
77
+ :messages => { :is => 'is the wrong length (should be 10 characters)'},
78
+ :is => 10,
79
+ },
80
+ },
81
+ :last_name => {
82
+ :format => {
83
+ :message => 'is invalid',
84
+ :with => //,
85
+ }
86
+ },
87
+ :age => {
88
+ :numericality => {
89
+ :messages => { :numericality => 'is not a number' },
90
+ }
91
+ }
92
+ }
93
+ assert_equal expected_hash, person.client_side_validation_hash
94
+ end
95
+
96
+ def test_validations_to_client_side_hash_with_validations_on_update
97
+ person = new_person do |p|
98
+ p.validates_length_of :first_name, :is => 10, :on => :update
99
+ p.validates_length_of :last_name, :is => 10, :on => :create
100
+ p.validates_format_of :first_name, :with => //, :on => :create
101
+ p.validates_format_of :last_name, :with => //, :on => :update
102
+ p.validates_numericality_of :age, :on => :update
103
+ p.validates_numericality_of :weight, :on => :create
104
+ p.class_eval do
105
+ def new_record?
106
+ false
107
+ end
108
+ end
109
+ end
110
+ expected_hash = {
111
+ :first_name => {
112
+ :length => {
113
+ :messages => { :is => 'is the wrong length (should be 10 characters)'},
114
+ :is => 10,
115
+ },
116
+ },
117
+ :last_name => {
118
+ :format => {
119
+ :message => 'is invalid',
120
+ :with => //,
121
+ }
122
+ },
123
+ :age => {
124
+ :numericality => {
125
+ :messages => { :numericality => 'is not a number' },
126
+ }
127
+ }
128
+ }
129
+ assert_equal expected_hash, person.client_side_validation_hash
130
+ end
131
+ end
132
+
@@ -0,0 +1,12 @@
1
+ class Person
2
+ include ActiveModel::Validations
3
+
4
+ attr_accessor :first_name, :last_name, :email, :age
5
+
6
+ validates_presence_of :first_name
7
+ validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
8
+
9
+ def new_record?
10
+ true
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'base_helper'
2
+ require 'active_record'
3
+ require 'client_side_validations/active_record'
4
+
5
+ # Connection must be establised before anything else
6
+ ActiveRecord::Base.establish_connection(
7
+ :adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3',
8
+ :database => ':memory:'
9
+ )
10
+
11
+ require 'active_record/models/user'
12
+ require 'active_record/models/guid'
@@ -0,0 +1,11 @@
1
+ require 'active_record/cases/helper'
2
+
3
+ class ClientSideValidations::ActiveRecordTestBase < ActiveRecord::TestCase
4
+ include ActiveRecord::Validations
5
+
6
+ def setup
7
+ @user = User.new
8
+ end
9
+
10
+ end
11
+
@@ -0,0 +1,150 @@
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
+ end
150
+
@@ -0,0 +1,31 @@
1
+ require 'active_record/cases/test_base'
2
+
3
+ class ActiveRecord::UniquenessValidatorTest < ClientSideValidations::ActiveRecordTestBase
4
+
5
+ def test_uniqueness_client_side_hash
6
+ expected_hash = { :message => "has already been taken", :case_sensitive => true }
7
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@user, :name)
8
+ end
9
+
10
+ def test_uniqueness_client_side_hash_with_custom_message
11
+ expected_hash = { :message => "is not available", :case_sensitive => true }
12
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name], :message => "is not available").client_side_hash(@user, :name)
13
+ end
14
+
15
+ def test_uniqueness_client_side_hash
16
+ @user.stubs(:new_record?).returns(false)
17
+ @user.stubs(:id).returns(1)
18
+ expected_hash = { :message => "has already been taken", :case_sensitive => true, :id => 1 }
19
+ assert_equal expected_hash, UniquenessValidator.new(:attributes => [:name]).client_side_hash(@user, :name)
20
+ end
21
+
22
+ def test_uniqueness_client_side_hash_with_scope
23
+ @user.stubs(:age).returns(30)
24
+ @user.stubs(:title).returns("test title")
25
+ expected_hash = { :message => "has already been taken", :case_sensitive => true, :scope => {:age => 30, :title => "test title"} }
26
+ result_hash = UniquenessValidator.new(:attributes => [:name], :scope => [:age, :title]).client_side_hash(@user, :name)
27
+ assert_equal expected_hash, result_hash
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,7 @@
1
+ guids_table = %{CREATE TABLE guids (id INTEGER PRIMARY KEY, key text);}
2
+ ActiveRecord::Base.connection.execute(guids_table)
3
+
4
+ class Guid < ActiveRecord::Base
5
+
6
+ end
7
+
@@ -0,0 +1,10 @@
1
+ users_table = %{CREATE TABLE users (id INTEGER PRIMARY KEY, age INTEGER, name TEXT, email TEXT, title VARCHAR(5));}
2
+ ActiveRecord::Base.connection.execute(users_table)
3
+
4
+ class User < ActiveRecord::Base
5
+
6
+ end
7
+
8
+ class IneptWizard < User; end
9
+ class Conjurer < IneptWizard; end
10
+ class Thaumaturgist < Conjurer; end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'ruby-debug'
3
+ require 'test/unit'
4
+ require 'mocha'
5
+
6
+ module ClientSideValidations; end
@@ -0,0 +1,45 @@
1
+ require 'client_side_validations/core_ext'
2
+
3
+ class CoreExtTest < Test::Unit::TestCase
4
+ def test_regexp_as_json
5
+ regexp = //
6
+ assert_equal regexp, regexp.as_json
7
+ end
8
+
9
+ def test_regexp_replace_A_and_Z
10
+ test_regexp = /\A\Z/
11
+ expected_regexp = /^$/
12
+ assert_equal expected_regexp, test_regexp.as_json
13
+ end
14
+
15
+ def test_regexp_replace_a_and_z
16
+ test_regexp = /\A\z/
17
+ expected_regexp = /^$/
18
+ assert_equal expected_regexp, test_regexp.as_json
19
+ end
20
+
21
+ def test_regexp_to_json
22
+ assert_equal "/^$/", /\A\Z/.to_json(nil)
23
+ end
24
+
25
+ def test_regexp_encode_json
26
+ assert_equal "//", //.encode_json(nil)
27
+ end
28
+
29
+ def test_regexp_as_jason_with_options
30
+ assert_equal //i, //i.as_json
31
+ end
32
+
33
+ def test_range_as_json
34
+ assert_equal [1,3], (1..3).as_json
35
+ end
36
+
37
+ def test_range_to_json
38
+ assert_equal '[1, 3]', (1..3).to_json(nil)
39
+ end
40
+
41
+ def test_range_as_json_with_floats
42
+ assert_equal [0.5,5.5], (0.5..5.5).as_json
43
+ end
44
+ end
45
+