cassandra_object 0.6.0.pre

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.
Files changed (113) hide show
  1. data/lib/cassandra_object/associations/one_to_many.rb +136 -0
  2. data/lib/cassandra_object/associations/one_to_one.rb +77 -0
  3. data/lib/cassandra_object/associations.rb +35 -0
  4. data/lib/cassandra_object/attributes.rb +93 -0
  5. data/lib/cassandra_object/base.rb +104 -0
  6. data/lib/cassandra_object/callbacks.rb +10 -0
  7. data/lib/cassandra_object/collection.rb +8 -0
  8. data/lib/cassandra_object/cursor.rb +86 -0
  9. data/lib/cassandra_object/dirty.rb +27 -0
  10. data/lib/cassandra_object/identity/abstract_key_factory.rb +36 -0
  11. data/lib/cassandra_object/identity/key.rb +20 -0
  12. data/lib/cassandra_object/identity/natural_key_factory.rb +51 -0
  13. data/lib/cassandra_object/identity/uuid_key_factory.rb +37 -0
  14. data/lib/cassandra_object/identity.rb +61 -0
  15. data/lib/cassandra_object/indexes.rb +129 -0
  16. data/lib/cassandra_object/legacy_callbacks.rb +33 -0
  17. data/lib/cassandra_object/migrations.rb +72 -0
  18. data/lib/cassandra_object/mocking.rb +15 -0
  19. data/lib/cassandra_object/persistence.rb +193 -0
  20. data/lib/cassandra_object/serialization.rb +6 -0
  21. data/lib/cassandra_object/type_registration.rb +7 -0
  22. data/lib/cassandra_object/types.rb +128 -0
  23. data/lib/cassandra_object/validation.rb +58 -0
  24. data/lib/cassandra_object.rb +30 -0
  25. data/vendor/active_support_shims.rb +4 -0
  26. data/vendor/activemodel/CHANGELOG +13 -0
  27. data/vendor/activemodel/CHANGES +12 -0
  28. data/vendor/activemodel/MIT-LICENSE +21 -0
  29. data/vendor/activemodel/README +21 -0
  30. data/vendor/activemodel/Rakefile +52 -0
  31. data/vendor/activemodel/activemodel.gemspec +19 -0
  32. data/vendor/activemodel/examples/validations.rb +29 -0
  33. data/vendor/activemodel/lib/active_model/attribute_methods.rb +291 -0
  34. data/vendor/activemodel/lib/active_model/callbacks.rb +91 -0
  35. data/vendor/activemodel/lib/active_model/conversion.rb +8 -0
  36. data/vendor/activemodel/lib/active_model/deprecated_error_methods.rb +33 -0
  37. data/vendor/activemodel/lib/active_model/dirty.rb +126 -0
  38. data/vendor/activemodel/lib/active_model/errors.rb +162 -0
  39. data/vendor/activemodel/lib/active_model/lint.rb +91 -0
  40. data/vendor/activemodel/lib/active_model/locale/en.yml +27 -0
  41. data/vendor/activemodel/lib/active_model/naming.rb +45 -0
  42. data/vendor/activemodel/lib/active_model/observing.rb +191 -0
  43. data/vendor/activemodel/lib/active_model/railtie.rb +2 -0
  44. data/vendor/activemodel/lib/active_model/serialization.rb +30 -0
  45. data/vendor/activemodel/lib/active_model/serializers/json.rb +96 -0
  46. data/vendor/activemodel/lib/active_model/serializers/xml.rb +204 -0
  47. data/vendor/activemodel/lib/active_model/state_machine/event.rb +62 -0
  48. data/vendor/activemodel/lib/active_model/state_machine/machine.rb +75 -0
  49. data/vendor/activemodel/lib/active_model/state_machine/state.rb +47 -0
  50. data/vendor/activemodel/lib/active_model/state_machine/state_transition.rb +40 -0
  51. data/vendor/activemodel/lib/active_model/state_machine.rb +70 -0
  52. data/vendor/activemodel/lib/active_model/test_case.rb +18 -0
  53. data/vendor/activemodel/lib/active_model/translation.rb +44 -0
  54. data/vendor/activemodel/lib/active_model/validations/acceptance.rb +55 -0
  55. data/vendor/activemodel/lib/active_model/validations/confirmation.rb +47 -0
  56. data/vendor/activemodel/lib/active_model/validations/exclusion.rb +42 -0
  57. data/vendor/activemodel/lib/active_model/validations/format.rb +64 -0
  58. data/vendor/activemodel/lib/active_model/validations/inclusion.rb +42 -0
  59. data/vendor/activemodel/lib/active_model/validations/length.rb +117 -0
  60. data/vendor/activemodel/lib/active_model/validations/numericality.rb +111 -0
  61. data/vendor/activemodel/lib/active_model/validations/presence.rb +42 -0
  62. data/vendor/activemodel/lib/active_model/validations/with.rb +59 -0
  63. data/vendor/activemodel/lib/active_model/validations.rb +120 -0
  64. data/vendor/activemodel/lib/active_model/validator.rb +110 -0
  65. data/vendor/activemodel/lib/active_model/version.rb +9 -0
  66. data/vendor/activemodel/lib/active_model.rb +61 -0
  67. data/vendor/activemodel/test/cases/attribute_methods_test.rb +46 -0
  68. data/vendor/activemodel/test/cases/callbacks_test.rb +70 -0
  69. data/vendor/activemodel/test/cases/helper.rb +23 -0
  70. data/vendor/activemodel/test/cases/lint_test.rb +28 -0
  71. data/vendor/activemodel/test/cases/naming_test.rb +28 -0
  72. data/vendor/activemodel/test/cases/observing_test.rb +133 -0
  73. data/vendor/activemodel/test/cases/serializeration/json_serialization_test.rb +83 -0
  74. data/vendor/activemodel/test/cases/serializeration/xml_serialization_test.rb +110 -0
  75. data/vendor/activemodel/test/cases/state_machine/event_test.rb +49 -0
  76. data/vendor/activemodel/test/cases/state_machine/machine_test.rb +43 -0
  77. data/vendor/activemodel/test/cases/state_machine/state_test.rb +72 -0
  78. data/vendor/activemodel/test/cases/state_machine/state_transition_test.rb +84 -0
  79. data/vendor/activemodel/test/cases/state_machine_test.rb +312 -0
  80. data/vendor/activemodel/test/cases/tests_database.rb +37 -0
  81. data/vendor/activemodel/test/cases/translation_test.rb +45 -0
  82. data/vendor/activemodel/test/cases/validations/acceptance_validation_test.rb +71 -0
  83. data/vendor/activemodel/test/cases/validations/conditional_validation_test.rb +141 -0
  84. data/vendor/activemodel/test/cases/validations/confirmation_validation_test.rb +58 -0
  85. data/vendor/activemodel/test/cases/validations/exclusion_validation_test.rb +47 -0
  86. data/vendor/activemodel/test/cases/validations/format_validation_test.rb +118 -0
  87. data/vendor/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb +175 -0
  88. data/vendor/activemodel/test/cases/validations/i18n_validation_test.rb +527 -0
  89. data/vendor/activemodel/test/cases/validations/inclusion_validation_test.rb +71 -0
  90. data/vendor/activemodel/test/cases/validations/length_validation_test.rb +437 -0
  91. data/vendor/activemodel/test/cases/validations/numericality_validation_test.rb +180 -0
  92. data/vendor/activemodel/test/cases/validations/presence_validation_test.rb +70 -0
  93. data/vendor/activemodel/test/cases/validations/with_validation_test.rb +166 -0
  94. data/vendor/activemodel/test/cases/validations_test.rb +215 -0
  95. data/vendor/activemodel/test/config.rb +3 -0
  96. data/vendor/activemodel/test/fixtures/topics.yml +41 -0
  97. data/vendor/activemodel/test/models/contact.rb +7 -0
  98. data/vendor/activemodel/test/models/custom_reader.rb +17 -0
  99. data/vendor/activemodel/test/models/developer.rb +6 -0
  100. data/vendor/activemodel/test/models/person.rb +9 -0
  101. data/vendor/activemodel/test/models/reply.rb +34 -0
  102. data/vendor/activemodel/test/models/topic.rb +9 -0
  103. data/vendor/activemodel/test/models/track_back.rb +4 -0
  104. data/vendor/activemodel/test/schema.rb +14 -0
  105. data/vendor/activesupport/lib/active_support/autoload.rb +48 -0
  106. data/vendor/activesupport/lib/active_support/concern.rb +25 -0
  107. data/vendor/activesupport/lib/active_support/core_ext/array/wrap.rb +20 -0
  108. data/vendor/activesupport/lib/active_support/core_ext/object/blank.rb +58 -0
  109. data/vendor/activesupport/lib/active_support/core_ext/object/tap.rb +6 -0
  110. data/vendor/activesupport/lib/active_support/dependency_module.rb +17 -0
  111. data/vendor/activesupport/lib/active_support/i18n.rb +2 -0
  112. data/vendor/activesupport/lib/active_support/locale/en.yml +33 -0
  113. metadata +230 -0
@@ -0,0 +1,437 @@
1
+ # encoding: utf-8
2
+ require 'cases/helper'
3
+ require 'cases/tests_database'
4
+
5
+ require 'models/topic'
6
+ require 'models/developer'
7
+ require 'models/person'
8
+
9
+ class LengthValidationTest < ActiveModel::TestCase
10
+ include ActiveModel::TestsDatabase
11
+
12
+ def teardown
13
+ Topic.reset_callbacks(:validate)
14
+ end
15
+
16
+ def test_validates_length_of_with_allow_nil
17
+ Topic.validates_length_of( :title, :is => 5, :allow_nil=>true )
18
+
19
+ assert !Topic.create("title" => "ab").valid?
20
+ assert !Topic.create("title" => "").valid?
21
+ assert Topic.create("title" => nil).valid?
22
+ assert Topic.create("title" => "abcde").valid?
23
+ end
24
+
25
+ def test_validates_length_of_with_allow_blank
26
+ Topic.validates_length_of( :title, :is => 5, :allow_blank=>true )
27
+
28
+ assert !Topic.create("title" => "ab").valid?
29
+ assert Topic.create("title" => "").valid?
30
+ assert Topic.create("title" => nil).valid?
31
+ assert Topic.create("title" => "abcde").valid?
32
+ end
33
+
34
+ def test_validates_length_of_using_minimum
35
+ Topic.validates_length_of :title, :minimum => 5
36
+
37
+ t = Topic.create("title" => "valid", "content" => "whatever")
38
+ assert t.valid?
39
+
40
+ t.title = "not"
41
+ assert !t.valid?
42
+ assert t.errors[:title].any?
43
+ assert_equal ["is too short (minimum is 5 characters)"], t.errors[:title]
44
+
45
+ t.title = ""
46
+ assert !t.valid?
47
+ assert t.errors[:title].any?
48
+ assert_equal ["is too short (minimum is 5 characters)"], t.errors[:title]
49
+
50
+ t.title = nil
51
+ assert !t.valid?
52
+ assert t.errors[:title].any?
53
+ assert_equal ["is too short (minimum is 5 characters)"], t.errors["title"]
54
+ end
55
+
56
+ def test_validates_length_of_using_maximum_should_allow_nil
57
+ Topic.validates_length_of :title, :maximum => 10
58
+ t = Topic.create
59
+ assert t.valid?
60
+ end
61
+
62
+ def test_optionally_validates_length_of_using_minimum
63
+ Topic.validates_length_of :title, :minimum => 5, :allow_nil => true
64
+
65
+ t = Topic.create("title" => "valid", "content" => "whatever")
66
+ assert t.valid?
67
+
68
+ t.title = nil
69
+ assert t.valid?
70
+ end
71
+
72
+ def test_validates_length_of_using_maximum
73
+ Topic.validates_length_of :title, :maximum => 5
74
+
75
+ t = Topic.create("title" => "valid", "content" => "whatever")
76
+ assert t.valid?
77
+
78
+ t.title = "notvalid"
79
+ assert !t.valid?
80
+ assert t.errors[:title].any?
81
+ assert_equal ["is too long (maximum is 5 characters)"], t.errors[:title]
82
+
83
+ t.title = ""
84
+ assert t.valid?
85
+ end
86
+
87
+ def test_optionally_validates_length_of_using_maximum
88
+ Topic.validates_length_of :title, :maximum => 5, :allow_nil => true
89
+
90
+ t = Topic.create("title" => "valid", "content" => "whatever")
91
+ assert t.valid?
92
+
93
+ t.title = nil
94
+ assert t.valid?
95
+ end
96
+
97
+ def test_validates_length_of_using_within
98
+ Topic.validates_length_of(:title, :content, :within => 3..5)
99
+
100
+ t = Topic.new("title" => "a!", "content" => "I'm ooooooooh so very long")
101
+ assert !t.valid?
102
+ assert_equal ["is too short (minimum is 3 characters)"], t.errors[:title]
103
+ assert_equal ["is too long (maximum is 5 characters)"], t.errors[:content]
104
+
105
+ t.title = nil
106
+ t.content = nil
107
+ assert !t.valid?
108
+ assert_equal ["is too short (minimum is 3 characters)"], t.errors[:title]
109
+ assert_equal ["is too short (minimum is 3 characters)"], t.errors[:content]
110
+
111
+ t.title = "abe"
112
+ t.content = "mad"
113
+ assert t.valid?
114
+ end
115
+
116
+ def test_validates_length_of_using_within_with_exclusive_range
117
+ Topic.validates_length_of(:title, :within => 4...10)
118
+
119
+ t = Topic.new("title" => "9 chars!!")
120
+ assert t.valid?
121
+
122
+ t.title = "Now I'm 10"
123
+ assert !t.valid?
124
+ assert_equal ["is too long (maximum is 9 characters)"], t.errors[:title]
125
+
126
+ t.title = "Four"
127
+ assert t.valid?
128
+ end
129
+
130
+ def test_optionally_validates_length_of_using_within
131
+ Topic.validates_length_of :title, :content, :within => 3..5, :allow_nil => true
132
+
133
+ t = Topic.create('title' => 'abc', 'content' => 'abcd')
134
+ assert t.valid?
135
+
136
+ t.title = nil
137
+ assert t.valid?
138
+ end
139
+
140
+ def test_optionally_validates_length_of_using_within_on_create
141
+ Topic.validates_length_of :title, :content, :within => 5..10, :on => :create, :too_long => "my string is too long: {{count}}"
142
+
143
+ t = Topic.create("title" => "thisisnotvalid", "content" => "whatever")
144
+ assert !t.save
145
+ assert t.errors[:title].any?
146
+ assert_equal ["my string is too long: 10"], t.errors[:title]
147
+
148
+ t.title = "butthisis"
149
+ assert t.save
150
+
151
+ t.title = "few"
152
+ assert t.save
153
+
154
+ t.content = "andthisislong"
155
+ assert t.save
156
+
157
+ t.content = t.title = "iamfine"
158
+ assert t.save
159
+ end
160
+
161
+ def test_optionally_validates_length_of_using_within_on_update
162
+ Topic.validates_length_of :title, :content, :within => 5..10, :on => :update, :too_short => "my string is too short: {{count}}"
163
+
164
+ t = Topic.create("title" => "vali", "content" => "whatever")
165
+ assert !t.save
166
+ assert t.errors[:title].any?
167
+
168
+ t.title = "not"
169
+ assert !t.save
170
+ assert t.errors[:title].any?
171
+ assert_equal ["my string is too short: 5"], t.errors[:title]
172
+
173
+ t.title = "valid"
174
+ t.content = "andthisistoolong"
175
+ assert !t.save
176
+ assert t.errors[:content].any?
177
+
178
+ t.content = "iamfine"
179
+ assert t.save
180
+ end
181
+
182
+ def test_validates_length_of_using_is
183
+ Topic.validates_length_of :title, :is => 5
184
+
185
+ t = Topic.create("title" => "valid", "content" => "whatever")
186
+ assert t.valid?
187
+
188
+ t.title = "notvalid"
189
+ assert !t.valid?
190
+ assert t.errors[:title].any?
191
+ assert_equal ["is the wrong length (should be 5 characters)"], t.errors[:title]
192
+
193
+ t.title = ""
194
+ assert !t.valid?
195
+
196
+ t.title = nil
197
+ assert !t.valid?
198
+ end
199
+
200
+ def test_optionally_validates_length_of_using_is
201
+ Topic.validates_length_of :title, :is => 5, :allow_nil => true
202
+
203
+ t = Topic.create("title" => "valid", "content" => "whatever")
204
+ assert t.valid?
205
+
206
+ t.title = nil
207
+ assert t.valid?
208
+ end
209
+
210
+ def test_validates_length_of_using_bignum
211
+ bigmin = 2 ** 30
212
+ bigmax = 2 ** 32
213
+ bigrange = bigmin...bigmax
214
+ assert_nothing_raised do
215
+ Topic.validates_length_of :title, :is => bigmin + 5
216
+ Topic.validates_length_of :title, :within => bigrange
217
+ Topic.validates_length_of :title, :in => bigrange
218
+ Topic.validates_length_of :title, :minimum => bigmin
219
+ Topic.validates_length_of :title, :maximum => bigmax
220
+ end
221
+ end
222
+
223
+ def test_validates_length_of_nasty_params
224
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :minimum=>6, :maximum=>9) }
225
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :maximum=>9) }
226
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :minimum=>9) }
227
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :is=>9) }
228
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :minimum=>"a") }
229
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :maximum=>"a") }
230
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>"a") }
231
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :is=>"a") }
232
+ end
233
+
234
+ def test_validates_length_of_custom_errors_for_minimum_with_message
235
+ Topic.validates_length_of( :title, :minimum=>5, :message=>"boo {{count}}" )
236
+ t = Topic.create("title" => "uhoh", "content" => "whatever")
237
+ assert !t.valid?
238
+ assert t.errors[:title].any?
239
+ assert_equal ["boo 5"], t.errors[:title]
240
+ end
241
+
242
+ def test_validates_length_of_custom_errors_for_minimum_with_too_short
243
+ Topic.validates_length_of( :title, :minimum=>5, :too_short=>"hoo {{count}}" )
244
+ t = Topic.create("title" => "uhoh", "content" => "whatever")
245
+ assert !t.valid?
246
+ assert t.errors[:title].any?
247
+ assert_equal ["hoo 5"], t.errors[:title]
248
+ end
249
+
250
+ def test_validates_length_of_custom_errors_for_maximum_with_message
251
+ Topic.validates_length_of( :title, :maximum=>5, :message=>"boo {{count}}" )
252
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
253
+ assert !t.valid?
254
+ assert t.errors[:title].any?
255
+ assert_equal ["boo 5"], t.errors[:title]
256
+ end
257
+
258
+ def test_validates_length_of_custom_errors_for_in
259
+ Topic.validates_length_of(:title, :in => 10..20, :message => "hoo {{count}}")
260
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
261
+ assert !t.valid?
262
+ assert t.errors[:title].any?
263
+ assert_equal ["hoo 10"], t.errors["title"]
264
+
265
+ t = Topic.create("title" => "uhohuhohuhohuhohuhohuhohuhohuhoh", "content" => "whatever")
266
+ assert !t.valid?
267
+ assert t.errors[:title].any?
268
+ assert_equal ["hoo 20"], t.errors["title"]
269
+ end
270
+
271
+ def test_validates_length_of_custom_errors_for_maximum_with_too_long
272
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo {{count}}" )
273
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
274
+ assert !t.valid?
275
+ assert t.errors[:title].any?
276
+ assert_equal ["hoo 5"], t.errors["title"]
277
+ end
278
+
279
+ def test_validates_length_of_custom_errors_for_is_with_message
280
+ Topic.validates_length_of( :title, :is=>5, :message=>"boo {{count}}" )
281
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
282
+ assert !t.valid?
283
+ assert t.errors[:title].any?
284
+ assert_equal ["boo 5"], t.errors["title"]
285
+ end
286
+
287
+ def test_validates_length_of_custom_errors_for_is_with_wrong_length
288
+ Topic.validates_length_of( :title, :is=>5, :wrong_length=>"hoo {{count}}" )
289
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
290
+ assert !t.valid?
291
+ assert t.errors[:title].any?
292
+ assert_equal ["hoo 5"], t.errors["title"]
293
+ end
294
+
295
+ def test_validates_length_of_using_minimum_utf8
296
+ with_kcode('UTF8') do
297
+ Topic.validates_length_of :title, :minimum => 5
298
+
299
+ t = Topic.create("title" => "一二三四五", "content" => "whatever")
300
+ assert t.valid?
301
+
302
+ t.title = "一二三四"
303
+ assert !t.valid?
304
+ assert t.errors[:title].any?
305
+ assert_equal ["is too short (minimum is 5 characters)"], t.errors["title"]
306
+ end
307
+ end
308
+
309
+ def test_validates_length_of_using_maximum_utf8
310
+ with_kcode('UTF8') do
311
+ Topic.validates_length_of :title, :maximum => 5
312
+
313
+ t = Topic.create("title" => "一二三四五", "content" => "whatever")
314
+ assert t.valid?
315
+
316
+ t.title = "一二34五六"
317
+ assert !t.valid?
318
+ assert t.errors[:title].any?
319
+ assert_equal ["is too long (maximum is 5 characters)"], t.errors["title"]
320
+ end
321
+ end
322
+
323
+ def test_validates_length_of_using_within_utf8
324
+ with_kcode('UTF8') do
325
+ Topic.validates_length_of(:title, :content, :within => 3..5)
326
+
327
+ t = Topic.new("title" => "一二", "content" => "12三四五六七")
328
+ assert !t.valid?
329
+ assert_equal ["is too short (minimum is 3 characters)"], t.errors[:title]
330
+ assert_equal ["is too long (maximum is 5 characters)"], t.errors[:content]
331
+ t.title = "一二三"
332
+ t.content = "12三"
333
+ assert t.valid?
334
+ end
335
+ end
336
+
337
+ def test_optionally_validates_length_of_using_within_utf8
338
+ with_kcode('UTF8') do
339
+ Topic.validates_length_of :title, :within => 3..5, :allow_nil => true
340
+
341
+ t = Topic.create(:title => "一二三四五")
342
+ assert t.valid?, t.errors.inspect
343
+
344
+ t = Topic.create(:title => "一二三")
345
+ assert t.valid?, t.errors.inspect
346
+
347
+ t.title = nil
348
+ assert t.valid?, t.errors.inspect
349
+ end
350
+ end
351
+
352
+ def test_optionally_validates_length_of_using_within_on_create_utf8
353
+ with_kcode('UTF8') do
354
+ Topic.validates_length_of :title, :within => 5..10, :on => :create, :too_long => "長すぎます: {{count}}"
355
+
356
+ t = Topic.create("title" => "一二三四五六七八九十A", "content" => "whatever")
357
+ assert !t.save
358
+ assert t.errors[:title].any?
359
+ assert_equal "長すぎます: 10", t.errors[:title].first
360
+
361
+ t.title = "一二三四五六七八九"
362
+ assert t.save
363
+
364
+ t.title = "一二3"
365
+ assert t.save
366
+
367
+ t.content = "一二三四五六七八九十"
368
+ assert t.save
369
+
370
+ t.content = t.title = "一二三四五六"
371
+ assert t.save
372
+ end
373
+ end
374
+
375
+ def test_optionally_validates_length_of_using_within_on_update_utf8
376
+ with_kcode('UTF8') do
377
+ Topic.validates_length_of :title, :within => 5..10, :on => :update, :too_short => "短すぎます: {{count}}"
378
+
379
+ t = Topic.create("title" => "一二三4", "content" => "whatever")
380
+ assert !t.save
381
+ assert t.errors[:title].any?
382
+
383
+ t.title = "1二三4"
384
+ assert !t.save
385
+ assert t.errors[:title].any?
386
+ assert_equal ["短すぎます: 5"], t.errors[:title]
387
+
388
+ t.title = "一二三四五六七八九十A"
389
+ assert !t.save
390
+ assert t.errors[:title].any?
391
+
392
+ t.title = "一二345"
393
+ assert t.save
394
+ end
395
+ end
396
+
397
+ def test_validates_length_of_using_is_utf8
398
+ with_kcode('UTF8') do
399
+ Topic.validates_length_of :title, :is => 5
400
+
401
+ t = Topic.create("title" => "一二345", "content" => "whatever")
402
+ assert t.valid?
403
+
404
+ t.title = "一二345六"
405
+ assert !t.valid?
406
+ assert t.errors[:title].any?
407
+ assert_equal ["is the wrong length (should be 5 characters)"], t.errors["title"]
408
+ end
409
+ end
410
+
411
+ def test_validates_length_of_with_block
412
+ Topic.validates_length_of :content, :minimum => 5, :too_short=>"Your essay must be at least {{count}} words.",
413
+ :tokenizer => lambda {|str| str.scan(/\w+/) }
414
+ t = Topic.create!(:content => "this content should be long enough")
415
+ assert t.valid?
416
+
417
+ t.content = "not long enough"
418
+ assert !t.valid?
419
+ assert t.errors[:content].any?
420
+ assert_equal ["Your essay must be at least 5 words."], t.errors[:content]
421
+ end
422
+
423
+ def test_validates_length_of_for_ruby_class
424
+ Person.validates_length_of :karma, :minimum => 5
425
+
426
+ p = Person.new
427
+ p.karma = "Pix"
428
+ assert p.invalid?
429
+
430
+ assert_equal ["is too short (minimum is 5 characters)"], p.errors[:karma]
431
+
432
+ p.karma = "The Smiths"
433
+ assert p.valid?
434
+ ensure
435
+ Person.reset_callbacks(:validate)
436
+ end
437
+ end
@@ -0,0 +1,180 @@
1
+ # encoding: utf-8
2
+ require 'cases/helper'
3
+ require 'cases/tests_database'
4
+
5
+ require 'models/topic'
6
+ require 'models/developer'
7
+ require 'models/person'
8
+
9
+ class NumericalityValidationTest < ActiveModel::TestCase
10
+ include ActiveModel::TestsDatabase
11
+
12
+ def teardown
13
+ Topic.reset_callbacks(:validate)
14
+ end
15
+
16
+ NIL = [nil]
17
+ BLANK = ["", " ", " \t \r \n"]
18
+ BIGDECIMAL_STRINGS = %w(12345678901234567890.1234567890) # 30 significent digits
19
+ FLOAT_STRINGS = %w(0.0 +0.0 -0.0 10.0 10.5 -10.5 -0.0001 -090.1 90.1e1 -90.1e5 -90.1e-5 90e-5)
20
+ INTEGER_STRINGS = %w(0 +0 -0 10 +10 -10 0090 -090)
21
+ FLOATS = [0.0, 10.0, 10.5, -10.5, -0.0001] + FLOAT_STRINGS
22
+ INTEGERS = [0, 10, -10] + INTEGER_STRINGS
23
+ BIGDECIMAL = BIGDECIMAL_STRINGS.collect! { |bd| BigDecimal.new(bd) }
24
+ JUNK = ["not a number", "42 not a number", "0xdeadbeef", "00-1", "--3", "+-3", "+3-1", "-+019.0", "12.12.13.12", "123\nnot a number"]
25
+ INFINITY = [1.0/0.0]
26
+
27
+ def test_default_validates_numericality_of
28
+ Topic.validates_numericality_of :approved
29
+ invalid!(NIL + BLANK + JUNK)
30
+ valid!(FLOATS + INTEGERS + BIGDECIMAL + INFINITY)
31
+ end
32
+
33
+ def test_validates_numericality_of_with_nil_allowed
34
+ Topic.validates_numericality_of :approved, :allow_nil => true
35
+
36
+ invalid!(JUNK)
37
+ valid!(NIL + BLANK + FLOATS + INTEGERS + BIGDECIMAL + INFINITY)
38
+ end
39
+
40
+ def test_validates_numericality_of_with_integer_only
41
+ Topic.validates_numericality_of :approved, :only_integer => true
42
+
43
+ invalid!(NIL + BLANK + JUNK + FLOATS + BIGDECIMAL + INFINITY)
44
+ valid!(INTEGERS)
45
+ end
46
+
47
+ def test_validates_numericality_of_with_integer_only_and_nil_allowed
48
+ Topic.validates_numericality_of :approved, :only_integer => true, :allow_nil => true
49
+
50
+ invalid!(JUNK + FLOATS + BIGDECIMAL + INFINITY)
51
+ valid!(NIL + BLANK + INTEGERS)
52
+ end
53
+
54
+ def test_validates_numericality_with_greater_than
55
+ Topic.validates_numericality_of :approved, :greater_than => 10
56
+
57
+ invalid!([-10, 10], 'must be greater than 10')
58
+ valid!([11])
59
+ end
60
+
61
+ def test_validates_numericality_with_greater_than_or_equal
62
+ Topic.validates_numericality_of :approved, :greater_than_or_equal_to => 10
63
+
64
+ invalid!([-9, 9], 'must be greater than or equal to 10')
65
+ valid!([10])
66
+ end
67
+
68
+ def test_validates_numericality_with_equal_to
69
+ Topic.validates_numericality_of :approved, :equal_to => 10
70
+
71
+ invalid!([-10, 11] + INFINITY, 'must be equal to 10')
72
+ valid!([10])
73
+ end
74
+
75
+ def test_validates_numericality_with_less_than
76
+ Topic.validates_numericality_of :approved, :less_than => 10
77
+
78
+ invalid!([10], 'must be less than 10')
79
+ valid!([-9, 9])
80
+ end
81
+
82
+ def test_validates_numericality_with_less_than_or_equal_to
83
+ Topic.validates_numericality_of :approved, :less_than_or_equal_to => 10
84
+
85
+ invalid!([11], 'must be less than or equal to 10')
86
+ valid!([-10, 10])
87
+ end
88
+
89
+ def test_validates_numericality_with_odd
90
+ Topic.validates_numericality_of :approved, :odd => true
91
+
92
+ invalid!([-2, 2], 'must be odd')
93
+ valid!([-1, 1])
94
+ end
95
+
96
+ def test_validates_numericality_with_even
97
+ Topic.validates_numericality_of :approved, :even => true
98
+
99
+ invalid!([-1, 1], 'must be even')
100
+ valid!([-2, 2])
101
+ end
102
+
103
+ def test_validates_numericality_with_greater_than_less_than_and_even
104
+ Topic.validates_numericality_of :approved, :greater_than => 1, :less_than => 4, :even => true
105
+
106
+ invalid!([1, 3, 4])
107
+ valid!([2])
108
+ end
109
+
110
+ def test_validates_numericality_with_proc
111
+ Topic.send(:define_method, :min_approved, lambda { 5 })
112
+ Topic.validates_numericality_of :approved, :greater_than_or_equal_to => Proc.new {|topic| topic.min_approved }
113
+
114
+ invalid!([3, 4])
115
+ valid!([5, 6])
116
+ Topic.send(:remove_method, :min_approved)
117
+ end
118
+
119
+ def test_validates_numericality_with_symbol
120
+ Topic.send(:define_method, :max_approved, lambda { 5 })
121
+ Topic.validates_numericality_of :approved, :less_than_or_equal_to => :max_approved
122
+
123
+ invalid!([6])
124
+ valid!([4, 5])
125
+ Topic.send(:remove_method, :max_approved)
126
+ end
127
+
128
+ def test_validates_numericality_with_numeric_message
129
+ Topic.validates_numericality_of :approved, :less_than => 4, :message => "smaller than {{count}}"
130
+ topic = Topic.new("title" => "numeric test", "approved" => 10)
131
+
132
+ assert !topic.valid?
133
+ assert_equal ["smaller than 4"], topic.errors[:approved]
134
+
135
+ Topic.validates_numericality_of :approved, :greater_than => 4, :message => "greater than {{count}}"
136
+ topic = Topic.new("title" => "numeric test", "approved" => 1)
137
+
138
+ assert !topic.valid?
139
+ assert_equal ["greater than 4"], topic.errors[:approved]
140
+ end
141
+
142
+ def test_validates_numericality_of_for_ruby_class
143
+ Person.validates_numericality_of :karma, :allow_nil => false
144
+
145
+ p = Person.new
146
+ p.karma = "Pix"
147
+ assert p.invalid?
148
+
149
+ assert_equal ["is not a number"], p.errors[:karma]
150
+
151
+ p.karma = "1234"
152
+ assert p.valid?
153
+ ensure
154
+ Person.reset_callbacks(:validate)
155
+ end
156
+
157
+ private
158
+
159
+ def invalid!(values, error = nil)
160
+ with_each_topic_approved_value(values) do |topic, value|
161
+ assert !topic.valid?, "#{value.inspect} not rejected as a number"
162
+ assert topic.errors[:approved].any?, "FAILED for #{value.inspect}"
163
+ assert_equal error, topic.errors[:approved].first if error
164
+ end
165
+ end
166
+
167
+ def valid!(values)
168
+ with_each_topic_approved_value(values) do |topic, value|
169
+ assert topic.valid?, "#{value.inspect} not accepted as a number"
170
+ end
171
+ end
172
+
173
+ def with_each_topic_approved_value(values)
174
+ topic = Topic.new(:title => "numeric test", :content => "whatever")
175
+ values.each do |value|
176
+ topic.approved = value
177
+ yield topic, value
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ require 'cases/helper'
3
+ require 'cases/tests_database'
4
+
5
+ require 'models/topic'
6
+ require 'models/developer'
7
+ require 'models/person'
8
+ require 'models/custom_reader'
9
+
10
+ class PresenceValidationTest < ActiveModel::TestCase
11
+ include ActiveModel::TestsDatabase
12
+
13
+ def test_validate_presences
14
+ Topic.validates_presence_of(:title, :content)
15
+
16
+ t = Topic.create
17
+ assert !t.save
18
+ assert_equal ["can't be blank"], t.errors[:title]
19
+ assert_equal ["can't be blank"], t.errors[:content]
20
+
21
+ t.title = "something"
22
+ t.content = " "
23
+
24
+ assert !t.save
25
+ assert_equal ["can't be blank"], t.errors[:content]
26
+
27
+ t.content = "like stuff"
28
+
29
+ assert t.save
30
+ ensure
31
+ Topic.reset_callbacks(:validate)
32
+ end
33
+
34
+ def test_validates_acceptance_of_with_custom_error_using_quotes
35
+ Person.validates_presence_of :karma, :message=> "This string contains 'single' and \"double\" quotes"
36
+ p = Person.new
37
+ assert !p.valid?
38
+ assert_equal "This string contains 'single' and \"double\" quotes", p.errors[:karma].last
39
+ ensure
40
+ Person.reset_callbacks(:validate)
41
+ end
42
+
43
+ def test_validates_presence_of_for_ruby_class
44
+ Person.validates_presence_of :karma
45
+
46
+ p = Person.new
47
+ assert p.invalid?
48
+
49
+ assert_equal ["can't be blank"], p.errors[:karma]
50
+
51
+ p.karma = "Cold"
52
+ assert p.valid?
53
+ ensure
54
+ Person.reset_callbacks(:validate)
55
+ end
56
+
57
+ def test_validates_presence_of_for_ruby_class_with_custom_reader
58
+ CustomReader.validates_presence_of :karma
59
+
60
+ p = CustomReader.new
61
+ assert p.invalid?
62
+
63
+ assert_equal ["can't be blank"], p.errors[:karma]
64
+
65
+ p[:karma] = "Cold"
66
+ assert p.valid?
67
+ ensure
68
+ CustomReader.reset_callbacks(:validate)
69
+ end
70
+ end