ardm-validations 1.2.0

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 (153) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +51 -0
  5. data/LICENSE +21 -0
  6. data/README.rdoc +122 -0
  7. data/Rakefile +4 -0
  8. data/ardm-validations.gemspec +28 -0
  9. data/lib/ardm-validations.rb +1 -0
  10. data/lib/dm-validations.rb +169 -0
  11. data/lib/dm-validations/auto_validate.rb +252 -0
  12. data/lib/dm-validations/context.rb +66 -0
  13. data/lib/dm-validations/contextual_validators.rb +220 -0
  14. data/lib/dm-validations/exceptions.rb +5 -0
  15. data/lib/dm-validations/formats/email.rb +65 -0
  16. data/lib/dm-validations/formats/url.rb +27 -0
  17. data/lib/dm-validations/support/object.rb +18 -0
  18. data/lib/dm-validations/support/ordered_hash.rb +434 -0
  19. data/lib/dm-validations/validation_errors.rb +137 -0
  20. data/lib/dm-validations/validators/absent_field_validator.rb +58 -0
  21. data/lib/dm-validations/validators/acceptance_validator.rb +79 -0
  22. data/lib/dm-validations/validators/block_validator.rb +61 -0
  23. data/lib/dm-validations/validators/confirmation_validator.rb +92 -0
  24. data/lib/dm-validations/validators/format_validator.rb +124 -0
  25. data/lib/dm-validations/validators/generic_validator.rb +184 -0
  26. data/lib/dm-validations/validators/length_validator.rb +249 -0
  27. data/lib/dm-validations/validators/method_validator.rb +64 -0
  28. data/lib/dm-validations/validators/numeric_validator.rb +182 -0
  29. data/lib/dm-validations/validators/primitive_validator.rb +58 -0
  30. data/lib/dm-validations/validators/required_field_validator.rb +83 -0
  31. data/lib/dm-validations/validators/uniqueness_validator.rb +67 -0
  32. data/lib/dm-validations/validators/within_validator.rb +74 -0
  33. data/lib/dm-validations/version.rb +5 -0
  34. data/spec/fixtures/barcode.rb +40 -0
  35. data/spec/fixtures/basketball_court.rb +58 -0
  36. data/spec/fixtures/basketball_player.rb +34 -0
  37. data/spec/fixtures/beta_tester_account.rb +33 -0
  38. data/spec/fixtures/bill_of_landing.rb +47 -0
  39. data/spec/fixtures/boat_dock.rb +26 -0
  40. data/spec/fixtures/city.rb +24 -0
  41. data/spec/fixtures/company.rb +93 -0
  42. data/spec/fixtures/corporate_world.rb +39 -0
  43. data/spec/fixtures/country.rb +24 -0
  44. data/spec/fixtures/ethernet_frame.rb +56 -0
  45. data/spec/fixtures/event.rb +44 -0
  46. data/spec/fixtures/g3_concert.rb +57 -0
  47. data/spec/fixtures/jabberwock.rb +27 -0
  48. data/spec/fixtures/kayak.rb +28 -0
  49. data/spec/fixtures/lernean_hydra.rb +39 -0
  50. data/spec/fixtures/llama_spaceship.rb +15 -0
  51. data/spec/fixtures/mathematical_function.rb +34 -0
  52. data/spec/fixtures/memory_object.rb +30 -0
  53. data/spec/fixtures/mittelschnauzer.rb +39 -0
  54. data/spec/fixtures/motor_launch.rb +21 -0
  55. data/spec/fixtures/multibyte.rb +16 -0
  56. data/spec/fixtures/page.rb +32 -0
  57. data/spec/fixtures/phone_number.rb +28 -0
  58. data/spec/fixtures/pirogue.rb +28 -0
  59. data/spec/fixtures/programming_language.rb +83 -0
  60. data/spec/fixtures/reservation.rb +38 -0
  61. data/spec/fixtures/scm_operation.rb +56 -0
  62. data/spec/fixtures/sms_message.rb +22 -0
  63. data/spec/fixtures/udp_packet.rb +49 -0
  64. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  65. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  66. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  67. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  68. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  69. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  70. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  71. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  72. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  73. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  74. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  75. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  76. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  77. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +52 -0
  78. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +39 -0
  79. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  80. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  81. data/spec/integration/block_validator/spec_helper.rb +5 -0
  82. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  83. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  84. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  85. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  86. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  87. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  88. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  89. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  90. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  91. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  92. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  93. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  94. data/spec/integration/format_validator/spec_helper.rb +5 -0
  95. data/spec/integration/format_validator/url_format_validator_spec.rb +93 -0
  96. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  97. data/spec/integration/length_validator/equality_spec.rb +87 -0
  98. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  99. data/spec/integration/length_validator/maximum_spec.rb +49 -0
  100. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  101. data/spec/integration/length_validator/range_spec.rb +87 -0
  102. data/spec/integration/length_validator/spec_helper.rb +7 -0
  103. data/spec/integration/method_validator/method_validator_spec.rb +241 -0
  104. data/spec/integration/method_validator/spec_helper.rb +5 -0
  105. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  106. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  107. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  108. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  109. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  110. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  111. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  112. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  113. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  114. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  115. data/spec/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  116. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  117. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  118. data/spec/integration/required_field_validator/association_spec.rb +72 -0
  119. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +155 -0
  120. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  121. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  122. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  123. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  124. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  125. data/spec/integration/required_field_validator/shared_examples.rb +26 -0
  126. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  127. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  128. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  129. data/spec/integration/shared/default_validation_context.rb +13 -0
  130. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  131. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  132. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  133. data/spec/integration/within_validator/spec_helper.rb +5 -0
  134. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  135. data/spec/public/resource_spec.rb +105 -0
  136. data/spec/rcov.opts +6 -0
  137. data/spec/spec.opts +4 -0
  138. data/spec/spec_helper.rb +29 -0
  139. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  140. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  141. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  142. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  143. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  144. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  145. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  146. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  147. data/spec/unit/validation_errors/reading_spec.rb +35 -0
  148. data/spec/unit/validation_errors/respond_to_spec.rb +15 -0
  149. data/spec/unit/validators/within_validator_spec.rb +23 -0
  150. data/tasks/spec.rake +38 -0
  151. data/tasks/yard.rake +9 -0
  152. data/tasks/yardstick.rake +19 -0
  153. metadata +256 -0
@@ -0,0 +1,7 @@
1
+ # put validator specific fixture models and helpers here
2
+ #
3
+ # make sure you check out spec/fixtures to see fixture models
4
+ # already written
5
+ #
6
+ # DataMapper developers feels strongly against foobars in the spec
7
+ # suite
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe 'Inferred validations' do
5
+ it "allow overriding a single error message" do
6
+ custom_boat = Class.new do
7
+ include DataMapper::Resource
8
+
9
+ def self.name
10
+ 'Boat'
11
+ end
12
+
13
+ property :id, DataMapper::Property::Serial
14
+ property :name, String, :required => true, :message => "This boat must have name"
15
+ end
16
+ boat = custom_boat.new
17
+ boat.should_not be_valid
18
+ boat.errors.on(:name).should == [ 'This boat must have name' ]
19
+ end
20
+
21
+ it "should have correct error messages" do
22
+ custom_boat = Class.new do
23
+ include DataMapper::Resource
24
+
25
+ def self.name
26
+ 'Boat'
27
+ end
28
+
29
+ property :id, DataMapper::Property::Serial
30
+ property :name, String, :required => true, :length => 5..20, :format => /^[a-z]+$/,
31
+ :messages => {
32
+ :presence => "This boat must have name",
33
+ :length => "Name must have at least 4 and at most 20 chars",
34
+ :format => "Please use only small letters"
35
+ }
36
+ end
37
+
38
+ boat = custom_boat.new
39
+ boat.should_not be_valid
40
+ boat.errors.on(:name).should == [ 'This boat must have name' ]
41
+
42
+ boat.name = "%%"
43
+ boat.should_not be_valid
44
+ boat.errors.on(:name).should == [
45
+ 'Name must have at least 4 and at most 20 chars',
46
+ 'Please use only small letters',
47
+ ]
48
+
49
+ boat.name = "%%asd"
50
+ boat.should_not be_valid
51
+ boat.errors.on(:name).should == [ 'Please use only small letters' ]
52
+
53
+ boat.name = "superboat"
54
+ boat.should be_valid
55
+ boat.errors.on(:name).should be_nil
56
+ end
57
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe "A class with inferred validations disabled for all properties with an option" do
5
+ before :all do
6
+ @klass = Class.new do
7
+ include DataMapper::Resource
8
+
9
+ def self.name
10
+ 'InferredValidation'
11
+ end
12
+
13
+ property :id, DataMapper::Property::Serial, :auto_validation => false
14
+ property :name, String, :required => true, :auto_validation => false
15
+ property :bool, DataMapper::Property::Boolean, :required => true, :auto_validation => false
16
+ end
17
+
18
+ @model = @klass.new
19
+ end
20
+
21
+ describe "when instantiated w/o any attributes" do
22
+ it_should_behave_like "valid model"
23
+ end
24
+ end
25
+
26
+
27
+ describe "A class with inferred validations disabled for all properties with a block" do
28
+ before :all do
29
+ @klass = Class.new do
30
+ include DataMapper::Resource
31
+
32
+ def self.name
33
+ 'InferredValidation'
34
+ end
35
+
36
+ without_auto_validations do
37
+ property :id, DataMapper::Property::Serial
38
+ property :name, String, :required => true
39
+ property :bool, DataMapper::Property::Boolean, :required => true
40
+ end
41
+ end
42
+
43
+ @model = @klass.new
44
+ end
45
+
46
+ describe "when instantiated w/o any attributes" do
47
+ it_should_behave_like "valid model"
48
+ end
49
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe "A model with a Boolean property" do
5
+ before :all do
6
+ @model = HasNullableBoolean.new(:id => 1)
7
+ end
8
+
9
+ describe "assigned a true" do
10
+ before :all do
11
+ @model.bool = true
12
+ end
13
+
14
+ it_should_behave_like "valid model"
15
+ end
16
+
17
+ describe "assigned a false" do
18
+ before :all do
19
+ @model.bool = false
20
+ end
21
+
22
+ it_should_behave_like "valid model"
23
+ end
24
+
25
+ describe "assigned a nil" do
26
+ before :all do
27
+ @model.bool = nil
28
+ end
29
+
30
+ it_should_behave_like "valid model"
31
+ end
32
+ end
33
+
34
+ describe "A model with a required Boolean property" do
35
+ before :all do
36
+ @model = HasRequiredBoolean.new(:id => 1)
37
+ end
38
+
39
+ describe "assigned a true" do
40
+ before :all do
41
+ @model.bool = true
42
+ end
43
+
44
+ it_should_behave_like "valid model"
45
+ end
46
+
47
+ describe "assigned a false" do
48
+ before :all do
49
+ @model.bool = false
50
+ end
51
+
52
+ it_should_behave_like "valid model"
53
+ end
54
+
55
+ describe "assigned a nil" do
56
+ before :all do
57
+ @model.bool = nil
58
+ end
59
+
60
+ it_should_behave_like "invalid model"
61
+
62
+ it "has a meaningful error message" do
63
+ @model.errors.on(:bool).should == [ 'Bool must not be nil' ]
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "A model with a required paranoid Boolean property" do
69
+ before :all do
70
+ @model = HasRequiredParanoidBoolean.new(:id => 1)
71
+ end
72
+
73
+ describe "assigned a true" do
74
+ before :all do
75
+ @model.bool = true
76
+ end
77
+
78
+ it_should_behave_like "valid model"
79
+ end
80
+
81
+ describe "assigned a false" do
82
+ before :all do
83
+ @model.bool = false
84
+ end
85
+
86
+ it_should_behave_like "valid model"
87
+ end
88
+
89
+ describe "assigned a nil" do
90
+ before :all do
91
+ @model.bool = nil
92
+ end
93
+
94
+ it_should_behave_like "invalid model"
95
+
96
+ it "has a meaningful error message" do
97
+ @model.errors.on(:bool).should == [ 'Bool must not be nil' ]
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+
5
+ { :float => Float, :big_decimal => BigDecimal }.each do |column, type|
6
+ describe "#{type} property" do
7
+ before :all do
8
+ SailBoat.auto_migrate!
9
+
10
+ @model = SailBoat.new(:id => 1)
11
+ end
12
+
13
+ describe "with an integer value" do
14
+ before :all do
15
+ @model.attributes = {column => 1}
16
+ end
17
+
18
+ it_should_behave_like "valid model"
19
+ end
20
+
21
+ describe "with a float value" do
22
+ before :all do
23
+ @model.attributes = {column => 1.0}
24
+ end
25
+
26
+ it_should_behave_like "valid model"
27
+ end
28
+
29
+ describe "with a BigDecimal value" do
30
+ before :all do
31
+ @model.attributes = {column => BigDecimal('1')}
32
+ end
33
+
34
+ it_should_behave_like "valid model"
35
+ end
36
+
37
+ describe "with an uncoercible value" do
38
+ before :all do
39
+ @model.attributes = {column => "foo"}
40
+ end
41
+
42
+ it_should_behave_like "invalid model"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe 'SailBoat', "with a :format option on a property" do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new
9
+ @model.should be_valid_for_format_test
10
+ end
11
+
12
+ describe "and value that matches the format" do
13
+ before :all do
14
+ @model.code = 'A1234'
15
+ end
16
+
17
+ it "passes inferred format validation" do
18
+ @model.should be_valid_for_format_test
19
+ end
20
+ end
21
+
22
+ describe "and value that DOES NOT match the format" do
23
+ before :all do
24
+ @model.code = 'BAD CODE'
25
+ end
26
+
27
+ it "does not pass inferred format validation" do
28
+ @model.should_not be_valid_for_format_test
29
+ end
30
+
31
+ it "has a meaningful error message" do
32
+ @model.errors.on(:code).should == [ 'Code has an invalid format' ]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe "A model with an Integer property" do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new
9
+ end
10
+
11
+ # success case
12
+ describe "assigned to an integer" do
13
+ before :all do
14
+ @model.id = 1
15
+ end
16
+
17
+ it_should_behave_like "valid model"
18
+ end
19
+
20
+ describe "assigned a value coercible into an integer" do
21
+ before :all do
22
+ @model.id = 1.0
23
+ end
24
+
25
+ it_should_behave_like "valid model"
26
+ end
27
+
28
+ describe "assigned a value not coercible into an integer" do
29
+ before :all do
30
+ @model.id = "foo"
31
+ end
32
+
33
+ it "is invalid" do
34
+ @model.should_not be_valid
35
+ end
36
+
37
+ it "has a meaningful default error message" do
38
+ @model.errors.on(:id).should == [ 'Id must be an integer' ]
39
+ end
40
+ end
41
+
42
+ describe "assigned to a too-small integer" do
43
+ before :all do
44
+ @model.id = 0
45
+ end
46
+
47
+ it "is invalid" do
48
+ @model.should_not be_valid
49
+ end
50
+
51
+ it "has a meaningful default error message" do
52
+ @model.errors.on(:id).should == [ 'Id must be greater than or equal to 1' ]
53
+ end
54
+ end
55
+
56
+ describe "assigned to a too-large integer" do
57
+ before :all do
58
+ @model.id = 11
59
+ end
60
+
61
+ it "is invalid" do
62
+ @model.should_not be_valid
63
+ end
64
+
65
+ it "has a meaningful default error message" do
66
+ @model.errors.on(:id).should == [ 'Id must be less than or equal to 10' ]
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe 'SailBoat' do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new(:id => 1)
9
+ @model.should be_valid_for_length_test_1
10
+ end
11
+
12
+
13
+ describe "with a nil value on property that allows nil" do
14
+ before :all do
15
+ @model.allow_nil = nil
16
+ end
17
+
18
+ it "is valid" do
19
+ @model.should be_valid_for_nil_test
20
+ end
21
+ end
22
+
23
+
24
+ describe "with 11 characters long description" do
25
+ before :all do
26
+ @model.description = 'ABCDEFGHIJK' #11
27
+ end
28
+
29
+ # validates_length_of is inferred from property's :length option
30
+ it "is invalid" do
31
+ @model.should_not be_valid_for_length_test_1
32
+ @model.errors.on(:description).should == [ 'Description must be at most 10 characters long' ]
33
+ end
34
+ end
35
+
36
+
37
+ describe "with 9 characters long description" do
38
+ before :all do
39
+ @model.description = 'ABCDEFGHI' # 9
40
+ end
41
+
42
+ # validates_length_of is inferred from property's :length option
43
+ it_should_behave_like "valid model"
44
+ end
45
+
46
+ describe "with 2 character long note" do
47
+ before :all do
48
+ @model = SailBoat.new(:notes => "AB")
49
+ end
50
+
51
+ it "is valid" do
52
+ @model.should be_valid_for_length_test_2
53
+ end
54
+ end
55
+
56
+ describe "with 10 character long note" do
57
+ before :all do
58
+ @model = SailBoat.new(:notes => "ABCDEFGHIJ")
59
+ end
60
+
61
+ it "is valid" do
62
+ @model.should be_valid_for_length_test_2
63
+ end
64
+ end
65
+
66
+ describe "with 11 character long note" do
67
+ before :all do
68
+ @model = SailBoat.new(:notes => "ABCDEFGHIJK")
69
+ end
70
+
71
+ it "is invalid" do
72
+ @model.should_not be_valid_for_length_test_2
73
+ end
74
+
75
+ it "has a meaningful error message" do
76
+ @model.errors.on(:notes).should == [ 'Notes must be between 2 and 10 characters long' ]
77
+ end
78
+ end
79
+ end
80
+
81
+
82
+
83
+ describe 'DataMapper::Validations::Fixtures::SmsMessage' do
84
+ before :all do
85
+ DataMapper::Validations::Fixtures::SmsMessage.auto_migrate!
86
+
87
+ @model = DataMapper::Validations::Fixtures::SmsMessage.new(:id => 10)
88
+ end
89
+
90
+ describe "with 2 character long note" do
91
+ before :all do
92
+ @model.body = "ab"
93
+ end
94
+
95
+ it_should_behave_like "valid model"
96
+ end
97
+
98
+ describe "with 10 character long note" do
99
+ before :all do
100
+ @model.body = "ABCDEFGHIJ"
101
+ end
102
+
103
+ it_should_behave_like "valid model"
104
+ end
105
+
106
+ describe "with 499 character long note" do
107
+ before :all do
108
+ @model.body = "a" * 499
109
+ end
110
+
111
+ it_should_behave_like "valid model"
112
+ end
113
+
114
+ describe "with 503 character long note" do
115
+ before :all do
116
+ @model.body = "a" * 503
117
+ end
118
+
119
+ it_should_behave_like "invalid model"
120
+
121
+ it "has a meaningful error message" do
122
+ @model.errors.on(:body).should == [ 'Body must be between 1 and 500 characters long' ]
123
+ end
124
+ end
125
+
126
+ describe 'with an infinitely long note' do
127
+ before do
128
+ @original = @model.class.properties[:body]
129
+ end
130
+
131
+ after do
132
+ @model.class.property(@original.name, @original.class, @original.options)
133
+ end
134
+
135
+ it "should raise when trying to set the upper bound of a property length range to Infinity" do
136
+ expected_msg = "Infinity is no valid upper bound for a length range"
137
+ lambda {
138
+ @model.class.property :body, String, :length => (1..1.0/0)
139
+ }.should raise_error(ArgumentError, expected_msg)
140
+ end
141
+ end
142
+ end