sbf-dm-validations 1.3.0.beta

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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +38 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +468 -0
  5. data/.travis.yml +51 -0
  6. data/Gemfile +60 -0
  7. data/LICENSE +21 -0
  8. data/README.rdoc +122 -0
  9. data/Rakefile +4 -0
  10. data/dm-validations.gemspec +20 -0
  11. data/lib/data_mapper/core.rb +1 -0
  12. data/lib/data_mapper/support/assertions.rb +1 -0
  13. data/lib/data_mapper/support/equalizer.rb +1 -0
  14. data/lib/data_mapper/support/ordered_set.rb +2 -0
  15. data/lib/data_mapper/validation/backward.rb +205 -0
  16. data/lib/data_mapper/validation/context.rb +57 -0
  17. data/lib/data_mapper/validation/contextual_rule_set.rb +210 -0
  18. data/lib/data_mapper/validation/exceptions.rb +7 -0
  19. data/lib/data_mapper/validation/inferred.rb +264 -0
  20. data/lib/data_mapper/validation/macros.rb +449 -0
  21. data/lib/data_mapper/validation/message_transformer.rb +111 -0
  22. data/lib/data_mapper/validation/model_extensions.rb +17 -0
  23. data/lib/data_mapper/validation/resource_extensions.rb +131 -0
  24. data/lib/data_mapper/validation/rule/absence.rb +31 -0
  25. data/lib/data_mapper/validation/rule/acceptance.rb +49 -0
  26. data/lib/data_mapper/validation/rule/block.rb +37 -0
  27. data/lib/data_mapper/validation/rule/confirmation.rb +47 -0
  28. data/lib/data_mapper/validation/rule/format/proc.rb +34 -0
  29. data/lib/data_mapper/validation/rule/format/regexp.rb +51 -0
  30. data/lib/data_mapper/validation/rule/format.rb +86 -0
  31. data/lib/data_mapper/validation/rule/formats/email.rb +54 -0
  32. data/lib/data_mapper/validation/rule/formats/url.rb +13 -0
  33. data/lib/data_mapper/validation/rule/length/equal.rb +48 -0
  34. data/lib/data_mapper/validation/rule/length/maximum.rb +50 -0
  35. data/lib/data_mapper/validation/rule/length/minimum.rb +50 -0
  36. data/lib/data_mapper/validation/rule/length/range.rb +50 -0
  37. data/lib/data_mapper/validation/rule/length.rb +96 -0
  38. data/lib/data_mapper/validation/rule/method.rb +42 -0
  39. data/lib/data_mapper/validation/rule/numericalness/equal.rb +34 -0
  40. data/lib/data_mapper/validation/rule/numericalness/greater_than.rb +34 -0
  41. data/lib/data_mapper/validation/rule/numericalness/greater_than_or_equal.rb +34 -0
  42. data/lib/data_mapper/validation/rule/numericalness/integer.rb +41 -0
  43. data/lib/data_mapper/validation/rule/numericalness/less_than.rb +34 -0
  44. data/lib/data_mapper/validation/rule/numericalness/less_than_or_equal.rb +34 -0
  45. data/lib/data_mapper/validation/rule/numericalness/not_equal.rb +34 -0
  46. data/lib/data_mapper/validation/rule/numericalness/numeric.rb +68 -0
  47. data/lib/data_mapper/validation/rule/numericalness.rb +91 -0
  48. data/lib/data_mapper/validation/rule/presence.rb +52 -0
  49. data/lib/data_mapper/validation/rule/primitive_type.rb +32 -0
  50. data/lib/data_mapper/validation/rule/uniqueness.rb +64 -0
  51. data/lib/data_mapper/validation/rule/within/range/bounded.rb +29 -0
  52. data/lib/data_mapper/validation/rule/within/range/unbounded_begin.rb +29 -0
  53. data/lib/data_mapper/validation/rule/within/range/unbounded_end.rb +29 -0
  54. data/lib/data_mapper/validation/rule/within/range.rb +55 -0
  55. data/lib/data_mapper/validation/rule/within/set.rb +45 -0
  56. data/lib/data_mapper/validation/rule/within.rb +32 -0
  57. data/lib/data_mapper/validation/rule.rb +232 -0
  58. data/lib/data_mapper/validation/rule_set.rb +157 -0
  59. data/lib/data_mapper/validation/support/object.rb +19 -0
  60. data/lib/data_mapper/validation/support/ordered_hash.rb +434 -0
  61. data/lib/data_mapper/validation/version.rb +5 -0
  62. data/lib/data_mapper/validation/violation.rb +136 -0
  63. data/lib/data_mapper/validation/violation_set.rb +115 -0
  64. data/lib/data_mapper/validation.rb +105 -0
  65. data/lib/dm-validations.rb +24 -0
  66. data/spec/data_mapper/validation/resource_extensions/save_spec.rb +56 -0
  67. data/spec/data_mapper/validation/resource_extensions/validate_spec.rb +103 -0
  68. data/spec/fixtures/barcode.rb +40 -0
  69. data/spec/fixtures/basketball_court.rb +58 -0
  70. data/spec/fixtures/basketball_player.rb +34 -0
  71. data/spec/fixtures/beta_tester_account.rb +33 -0
  72. data/spec/fixtures/bill_of_landing.rb +47 -0
  73. data/spec/fixtures/boat_dock.rb +26 -0
  74. data/spec/fixtures/city.rb +24 -0
  75. data/spec/fixtures/company.rb +93 -0
  76. data/spec/fixtures/corporate_world.rb +39 -0
  77. data/spec/fixtures/country.rb +24 -0
  78. data/spec/fixtures/ethernet_frame.rb +56 -0
  79. data/spec/fixtures/event.rb +44 -0
  80. data/spec/fixtures/g3_concert.rb +57 -0
  81. data/spec/fixtures/integer_dumped_as_string_property.rb +24 -0
  82. data/spec/fixtures/jabberwock.rb +27 -0
  83. data/spec/fixtures/kayak.rb +28 -0
  84. data/spec/fixtures/lernean_hydra.rb +39 -0
  85. data/spec/fixtures/llama_spaceship.rb +15 -0
  86. data/spec/fixtures/mathematical_function.rb +34 -0
  87. data/spec/fixtures/memory_object.rb +35 -0
  88. data/spec/fixtures/mittelschnauzer.rb +39 -0
  89. data/spec/fixtures/motor_launch.rb +21 -0
  90. data/spec/fixtures/multibyte.rb +16 -0
  91. data/spec/fixtures/page.rb +32 -0
  92. data/spec/fixtures/phone_number.rb +28 -0
  93. data/spec/fixtures/pirogue.rb +28 -0
  94. data/spec/fixtures/programming_language.rb +83 -0
  95. data/spec/fixtures/reservation.rb +38 -0
  96. data/spec/fixtures/scm_operation.rb +56 -0
  97. data/spec/fixtures/sms_message.rb +22 -0
  98. data/spec/fixtures/udp_packet.rb +49 -0
  99. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  100. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  101. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  102. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  103. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  104. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  105. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  106. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  107. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  108. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  109. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  110. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  111. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  112. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
  113. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
  114. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  115. data/spec/integration/block_validator/spec_helper.rb +5 -0
  116. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  117. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  118. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  119. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  120. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  121. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  122. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  123. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  124. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  125. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  126. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  127. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  128. data/spec/integration/format_validator/spec_helper.rb +5 -0
  129. data/spec/integration/format_validator/url_format_validator_spec.rb +91 -0
  130. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  131. data/spec/integration/length_validator/equality_spec.rb +83 -0
  132. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  133. data/spec/integration/length_validator/maximum_spec.rb +47 -0
  134. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  135. data/spec/integration/length_validator/range_spec.rb +87 -0
  136. data/spec/integration/length_validator/spec_helper.rb +7 -0
  137. data/spec/integration/method_validator/method_validator_spec.rb +243 -0
  138. data/spec/integration/method_validator/spec_helper.rb +5 -0
  139. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  140. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  141. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  142. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  143. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +36 -0
  144. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  145. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  146. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  147. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  148. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  149. data/spec/integration/primitive_validator/primitive_validator_spec.rb +112 -0
  150. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  151. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  152. data/spec/integration/required_field_validator/association_spec.rb +69 -0
  153. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
  154. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  155. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  156. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  157. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  158. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  159. data/spec/integration/required_field_validator/shared_examples.rb +27 -0
  160. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  161. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  162. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  163. data/spec/integration/shared/default_validation_context.rb +13 -0
  164. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  165. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  166. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  167. data/spec/integration/within_validator/spec_helper.rb +5 -0
  168. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  169. data/spec/public/resource_spec.rb +113 -0
  170. data/spec/spec_helper.rb +28 -0
  171. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  172. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  173. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  174. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  175. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  176. data/spec/unit/validators/within_validator_spec.rb +23 -0
  177. data/spec/unit/violation_set/adding_spec.rb +54 -0
  178. data/spec/unit/violation_set/emptiness_spec.rb +38 -0
  179. data/spec/unit/violation_set/enumerable_spec.rb +32 -0
  180. data/spec/unit/violation_set/reading_spec.rb +35 -0
  181. data/spec/unit/violation_set/respond_to_spec.rb +15 -0
  182. data/tasks/spec.rake +21 -0
  183. data/tasks/yard.rake +9 -0
  184. data/tasks/yardstick.rake +19 -0
  185. metadata +245 -0
@@ -0,0 +1,49 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '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_behaves_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_behaves_like 'valid model'
48
+ end
49
+ end
@@ -0,0 +1,100 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '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_behaves_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_behaves_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_behaves_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_behaves_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_behaves_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_behaves_like 'invalid model'
61
+
62
+ it "has a meaningful error message" do
63
+ expect(@model.errors.on(:bool)).to eq [ '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_behaves_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_behaves_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_behaves_like 'invalid model'
95
+
96
+ it "has a meaningful error message" do
97
+ expect(@model.errors.on(:bool)).to eq [ 'Bool must not be nil' ]
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '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_behaves_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_behaves_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_behaves_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_behaves_like "invalid model"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '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
+ expect(@model).to 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
+ expect(@model).to 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
+ expect(@model).not_to be_valid_for_format_test
29
+ end
30
+
31
+ it "has a meaningful error message" do
32
+ expect(@model.errors.on(:code)).to eq [ 'Code has an invalid format' ]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,70 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative '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_behaves_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_behaves_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
+ expect(@model).not_to be_valid
35
+ end
36
+
37
+ it "has a meaningful default error message" do
38
+ expect(@model.errors.on(:id)).to eq [ '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
+ expect(@model).not_to be_valid
49
+ end
50
+
51
+ it "has a meaningful default error message" do
52
+ expect(@model.errors.on(:id)).to eq [ '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
+ expect(@model).not_to be_valid
63
+ end
64
+
65
+ it "has a meaningful default error message" do
66
+ expect(@model.errors.on(:id)).to eq [ 'Id must be less than or equal to 10' ]
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,142 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'SailBoat' do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new(:id => 1)
9
+ expect(@model).to 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
+ expect(@model).to 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
+ expect(@model).not_to be_valid_for_length_test_1
32
+ expect(@model.errors.on(:description)).to eq [ '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_behaves_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
+ expect(@model).to 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
+ expect(@model).to 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
+ expect(@model).not_to be_valid_for_length_test_2
73
+ end
74
+
75
+ it "has a meaningful error message" do
76
+ expect(@model.errors.on(:notes)).to eq [ '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_behaves_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_behaves_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_behaves_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_behaves_like 'invalid model'
120
+
121
+ it "has a meaningful error message" do
122
+ expect(@model.errors.on(:body)).to eq [ '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 "raises when trying to set the upper bound of a property length range to Infinity" do
136
+ expected_msg = 'Infinity is not a valid upper bound for a length range'
137
+ expect {
138
+ @model.class.property :body, String, :length => (1..1.0/0)
139
+ }.to raise_error(ArgumentError, expected_msg)
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'SailBoat' do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new(:id => 1)
9
+ @model.name = 'Float'
10
+ expect(@model).to be_valid_for_presence_test
11
+ end
12
+
13
+ describe "without name" do
14
+ before :all do
15
+ @model.name = nil
16
+ end
17
+
18
+ # has validates_is_present for name thanks to :required => true
19
+ it "is invalid" do
20
+ expect(@model).not_to be_valid_for_presence_test
21
+ expect(@model.errors.on(:name)).to eq [ 'Name must not be blank' ]
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+
28
+ describe 'SailBoat' do
29
+ before :all do
30
+ SailBoat.auto_migrate!
31
+
32
+ @model = SailBoat.new(:id => 1)
33
+ @model.name = 'Float'
34
+ expect(@model).to be_valid_for_presence_test
35
+ end
36
+
37
+ describe "with a name" do
38
+ before :all do
39
+ # no op
40
+ end
41
+
42
+ # has validates_is_present for name thanks to :required => true
43
+ it_behaves_like 'valid model'
44
+ end
45
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'SailBoat' do
5
+ before :all do
6
+ SailBoat.auto_migrate!
7
+
8
+ @model = SailBoat.new(:id => 1)
9
+ expect(@model).to be_valid_for_primitive_test
10
+ end
11
+
12
+ describe "with invlid value assigned to primitive column" do
13
+ before :all do
14
+ @model.build_date = 'ABC'
15
+ end
16
+
17
+ it "is invalid" do
18
+ expect(@model).not_to be_valid_for_primitive_test
19
+ expect(@model.errors.on(:build_date)).to eq [ 'Build date must be of type Date' ]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'uniqueness' do
5
+ describe 'single attribute' do
6
+ before :all do
7
+ class UniqueEventsSingle
8
+ include DataMapper::Resource
9
+
10
+ # storage_names[:default] = 'unique_events_single'
11
+
12
+ property :id, Integer, :key => true
13
+ property :start_year, Integer, :unique => true
14
+ end
15
+ UniqueEventsSingle.auto_migrate!
16
+
17
+ @existing = UniqueEventsSingle.create(:id => 1, :start_year => 2008)
18
+ @new = UniqueEventsSingle.new(:id => 2, :start_year => 2008)
19
+ end
20
+
21
+ it 'validates' do
22
+ expect(@new).not_to be_valid
23
+ end
24
+ end
25
+
26
+ describe 'multiple attributes' do
27
+ before :all do
28
+ class UniqueEventsMultiple
29
+ include DataMapper::Resource
30
+
31
+ # storage_names[:default] = 'unique_events_multiple'
32
+
33
+ property :id, Integer, :key => true
34
+ property :start_year, Integer, :unique => :years
35
+ property :stop_year, Integer, :unique => :years
36
+ end
37
+ UniqueEventsMultiple.auto_migrate!
38
+
39
+ @new = UniqueEventsMultiple.new(:id => 1, :start_year => 2008, :stop_year => 2009)
40
+ end
41
+
42
+ it 'validates uniquness' do
43
+ expect {
44
+ expect(@new).not_to be_valid
45
+ }.to raise_error(ArgumentError)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../spec_helper'
2
+ require_relative 'spec_helper'
3
+
4
+ describe 'A model with a :set & :default options on a property' do
5
+ before :all do
6
+ class ::LimitedBoat
7
+ include DataMapper::Resource
8
+ property :id, DataMapper::Property::Serial
9
+ property :limited, String, :set => %w[ foo bar bang ], :default => 'foo'
10
+ end
11
+
12
+ LimitedBoat.finalize
13
+ end
14
+
15
+ describe "without value on that property" do
16
+ before :all do
17
+ @model = LimitedBoat.new
18
+ end
19
+
20
+ # default value is respected
21
+ it_behaves_like 'valid model'
22
+ end
23
+
24
+ describe "without value on that property that is not in allowed range/set" do
25
+ before :all do
26
+ @model = LimitedBoat.new(:limited => "blah")
27
+ end
28
+
29
+ it_behaves_like 'invalid model'
30
+
31
+ it "has a meaningful error message" do
32
+ expect(@model.errors.on(:limited)).to eq [ 'Limited must be one of foo, bar, bang' ]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,57 @@
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
8
+
9
+ # TODO: one day we need to get rid of this remaining foobarness
10
+ # and use a few more realistic models with ParanoidBoolean and all
11
+ # that
12
+
13
+ class SailBoat
14
+ include DataMapper::Resource
15
+
16
+ # this one is not Serial intentionally
17
+ # use Serial in real world apps
18
+ property :id, Integer, :key => true, :min => 1, :max => 10
19
+
20
+ property :name, String, :required => true, :validates => :presence_test
21
+ property :description, String, :length => 10, :validates => :length_test_1
22
+ property :notes, String, :length => 2..10, :validates => :length_test_2
23
+ property :no_validation, String, :auto_validation => false
24
+ property :salesman, String, :required => true, :validates => [:multi_context_1, :multi_context_2]
25
+ property :code, String, :format => Proc.new { |code| code =~ /A\d{4}\z/ }, :validates => :format_test
26
+ property :allow_nil, String, :length => 5..10, :required => false, :validates => :nil_test
27
+ property :build_date, Date, :validates => :primitive_test
28
+ property :float, Float, :precision => 2, :scale => 1
29
+ property :big_decimal, Decimal, :precision => 2, :scale => 1
30
+ end
31
+
32
+ class HasNullableBoolean
33
+ include DataMapper::Resource
34
+
35
+ # this one is not Serial intentionally
36
+ # use Serial in real world apps
37
+ property :id, Integer, :key => true
38
+ property :bool, Boolean # :required => false by default
39
+ end
40
+
41
+ class HasRequiredBoolean
42
+ include DataMapper::Resource
43
+
44
+ # this one is not Serial intentionally
45
+ # use Serial in real world apps
46
+ property :id, Integer, :key => true
47
+ property :bool, Boolean, :required => true
48
+ end
49
+
50
+ class HasRequiredParanoidBoolean
51
+ include DataMapper::Resource
52
+
53
+ # this one is not Serial intentionally
54
+ # use Serial in real world apps
55
+ property :id, Integer, :key => true
56
+ property :bool, ParanoidBoolean, :required => true
57
+ end
@@ -0,0 +1,5 @@
1
+ # make sure you check out spec/fixtures to see fixture models
2
+ # already written
3
+ #
4
+ # DataMapper developers feels strongly against foobars in the spec
5
+ # suite