aequitas 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. data/.gitignore +4 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +21 -0
  5. data/README.rdoc +125 -0
  6. data/Rakefile +25 -0
  7. data/VERSION +1 -0
  8. data/aequitas.gemspec +20 -0
  9. data/lib/aequitas.rb +80 -0
  10. data/lib/aequitas/class_methods.rb +26 -0
  11. data/lib/aequitas/context.rb +53 -0
  12. data/lib/aequitas/contextual_rule_set.rb +221 -0
  13. data/lib/aequitas/exceptions.rb +10 -0
  14. data/lib/aequitas/macros.rb +466 -0
  15. data/lib/aequitas/message_transformer.rb +127 -0
  16. data/lib/aequitas/rule.rb +153 -0
  17. data/lib/aequitas/rule/absence.rb +14 -0
  18. data/lib/aequitas/rule/absence/blank.rb +21 -0
  19. data/lib/aequitas/rule/absence/nil.rb +21 -0
  20. data/lib/aequitas/rule/acceptance.rb +36 -0
  21. data/lib/aequitas/rule/block.rb +33 -0
  22. data/lib/aequitas/rule/confirmation.rb +41 -0
  23. data/lib/aequitas/rule/format.rb +81 -0
  24. data/lib/aequitas/rule/format/proc.rb +28 -0
  25. data/lib/aequitas/rule/format/regexp.rb +44 -0
  26. data/lib/aequitas/rule/formats/email.rb +52 -0
  27. data/lib/aequitas/rule/formats/url.rb +14 -0
  28. data/lib/aequitas/rule/guard.rb +51 -0
  29. data/lib/aequitas/rule/length.rb +87 -0
  30. data/lib/aequitas/rule/length/equal.rb +46 -0
  31. data/lib/aequitas/rule/length/maximum.rb +46 -0
  32. data/lib/aequitas/rule/length/minimum.rb +46 -0
  33. data/lib/aequitas/rule/length/range.rb +46 -0
  34. data/lib/aequitas/rule/method.rb +31 -0
  35. data/lib/aequitas/rule/numericalness.rb +85 -0
  36. data/lib/aequitas/rule/numericalness/equal.rb +30 -0
  37. data/lib/aequitas/rule/numericalness/greater_than.rb +30 -0
  38. data/lib/aequitas/rule/numericalness/greater_than_or_equal.rb +30 -0
  39. data/lib/aequitas/rule/numericalness/integer.rb +37 -0
  40. data/lib/aequitas/rule/numericalness/less_than.rb +30 -0
  41. data/lib/aequitas/rule/numericalness/less_than_or_equal.rb +30 -0
  42. data/lib/aequitas/rule/numericalness/non_integer.rb +64 -0
  43. data/lib/aequitas/rule/numericalness/not_equal.rb +30 -0
  44. data/lib/aequitas/rule/presence.rb +14 -0
  45. data/lib/aequitas/rule/presence/not_blank.rb +21 -0
  46. data/lib/aequitas/rule/presence/not_nil.rb +21 -0
  47. data/lib/aequitas/rule/primitive_type.rb +28 -0
  48. data/lib/aequitas/rule/skip_condition.rb +104 -0
  49. data/lib/aequitas/rule/within.rb +28 -0
  50. data/lib/aequitas/rule/within/range.rb +53 -0
  51. data/lib/aequitas/rule/within/range/bounded.rb +25 -0
  52. data/lib/aequitas/rule/within/range/unbounded_begin.rb +25 -0
  53. data/lib/aequitas/rule/within/range/unbounded_end.rb +25 -0
  54. data/lib/aequitas/rule/within/set.rb +39 -0
  55. data/lib/aequitas/rule_set.rb +80 -0
  56. data/lib/aequitas/support/blank.rb +22 -0
  57. data/lib/aequitas/support/equalizable.rb +113 -0
  58. data/lib/aequitas/support/ordered_hash.rb +438 -0
  59. data/lib/aequitas/version.rb +5 -0
  60. data/lib/aequitas/violation.rb +116 -0
  61. data/lib/aequitas/violation_set.rb +123 -0
  62. data/lib/aequitas/virtus.rb +29 -0
  63. data/lib/aequitas/virtus/inline_attribute_rule_extractor.rb +41 -0
  64. data/lib/aequitas/virtus/inline_attribute_rule_extractor/boolean.rb +17 -0
  65. data/lib/aequitas/virtus/inline_attribute_rule_extractor/object.rb +25 -0
  66. data/lib/aequitas/virtus/inline_attribute_rule_extractor/string.rb +27 -0
  67. data/spec/integration/aequitas/macros/validates_absence_of_spec.rb +19 -0
  68. data/spec/integration/aequitas/macros/validates_acceptance_of_spec.rb +19 -0
  69. data/spec/integration/aequitas/macros/validates_confirmation_of_spec.rb +25 -0
  70. data/spec/integration/aequitas/macros/validates_format_of_spec.rb +87 -0
  71. data/spec/integration/aequitas/macros/validates_length_of.rb +77 -0
  72. data/spec/integration/aequitas/macros/validates_numericalness_of_spec.rb +221 -0
  73. data/spec/integration/aequitas/macros/validates_presence_of_spec.rb +19 -0
  74. data/spec/integration/aequitas/macros/validates_with_block.rb +23 -0
  75. data/spec/integration/aequitas/macros/validates_with_method.rb +19 -0
  76. data/spec/integration/aequitas/macros/validates_within.rb +87 -0
  77. data/spec/integration/shared/macros/integration_spec.rb +67 -0
  78. data/spec/integration/virtus/boolean/presence_spec.rb +49 -0
  79. data/spec/integration/virtus/string/format/email_address_spec.rb +55 -0
  80. data/spec/integration/virtus/string/format/regexp_spec.rb +55 -0
  81. data/spec/integration/virtus/string/format/url_spec.rb +55 -0
  82. data/spec/integration/virtus/string/length/equal_spec.rb +49 -0
  83. data/spec/integration/virtus/string/length/range_spec.rb +49 -0
  84. data/spec/integration/virtus/string/presence_spec.rb +49 -0
  85. data/spec/rcov.opts +6 -0
  86. data/spec/spec_helper.rb +5 -0
  87. data/spec/suite.rb +5 -0
  88. data/spec/unit/aequitas/rule/absence/blank_spec.rb +45 -0
  89. data/spec/unit/aequitas/rule/acceptance_spec.rb +71 -0
  90. data/spec/unit/aequitas/rule/confirmation_spec.rb +80 -0
  91. data/spec/unit/aequitas/rule/guard_spec.rb +120 -0
  92. data/spec/unit/aequitas/rule/skip_condition_spec.rb +170 -0
  93. data/spec/unit/aequitas/rule_spec.rb +40 -0
  94. data/spec/unit/aequitas/support/blank_spec.rb +83 -0
  95. data/spec/unit/aequitas/support/equalizable/equalizer_spec.rb +21 -0
  96. data/spec/unit/aequitas/support/equalizable_spec.rb +67 -0
  97. data/spec/unit/aequitas/violation_set_spec.rb +154 -0
  98. data/spec_legacy/fixtures/barcode.rb +40 -0
  99. data/spec_legacy/fixtures/basketball_court.rb +58 -0
  100. data/spec_legacy/fixtures/basketball_player.rb +34 -0
  101. data/spec_legacy/fixtures/beta_tester_account.rb +33 -0
  102. data/spec_legacy/fixtures/bill_of_landing.rb +47 -0
  103. data/spec_legacy/fixtures/boat_dock.rb +26 -0
  104. data/spec_legacy/fixtures/city.rb +24 -0
  105. data/spec_legacy/fixtures/company.rb +93 -0
  106. data/spec_legacy/fixtures/corporate_world.rb +39 -0
  107. data/spec_legacy/fixtures/country.rb +24 -0
  108. data/spec_legacy/fixtures/ethernet_frame.rb +56 -0
  109. data/spec_legacy/fixtures/event.rb +44 -0
  110. data/spec_legacy/fixtures/g3_concert.rb +57 -0
  111. data/spec_legacy/fixtures/jabberwock.rb +27 -0
  112. data/spec_legacy/fixtures/kayak.rb +28 -0
  113. data/spec_legacy/fixtures/lernean_hydra.rb +39 -0
  114. data/spec_legacy/fixtures/llama_spaceship.rb +15 -0
  115. data/spec_legacy/fixtures/mathematical_function.rb +34 -0
  116. data/spec_legacy/fixtures/memory_object.rb +30 -0
  117. data/spec_legacy/fixtures/mittelschnauzer.rb +39 -0
  118. data/spec_legacy/fixtures/motor_launch.rb +21 -0
  119. data/spec_legacy/fixtures/multibyte.rb +16 -0
  120. data/spec_legacy/fixtures/page.rb +32 -0
  121. data/spec_legacy/fixtures/phone_number.rb +28 -0
  122. data/spec_legacy/fixtures/pirogue.rb +28 -0
  123. data/spec_legacy/fixtures/programming_language.rb +83 -0
  124. data/spec_legacy/fixtures/reservation.rb +38 -0
  125. data/spec_legacy/fixtures/scm_operation.rb +56 -0
  126. data/spec_legacy/fixtures/sms_message.rb +22 -0
  127. data/spec_legacy/fixtures/udp_packet.rb +49 -0
  128. data/spec_legacy/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  129. data/spec_legacy/integration/absent_field_validator/spec_helper.rb +7 -0
  130. data/spec_legacy/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  131. data/spec_legacy/integration/acceptance_validator/spec_helper.rb +7 -0
  132. data/spec_legacy/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  133. data/spec_legacy/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  134. data/spec_legacy/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  135. data/spec_legacy/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  136. data/spec_legacy/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  137. data/spec_legacy/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  138. data/spec_legacy/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  139. data/spec_legacy/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  140. data/spec_legacy/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  141. data/spec_legacy/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
  142. data/spec_legacy/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
  143. data/spec_legacy/integration/automatic_validation/spec_helper.rb +57 -0
  144. data/spec_legacy/integration/block_validator/block_validator_spec.rb +32 -0
  145. data/spec_legacy/integration/block_validator/spec_helper.rb +5 -0
  146. data/spec_legacy/integration/conditional_validation/if_condition_spec.rb +63 -0
  147. data/spec_legacy/integration/conditional_validation/spec_helper.rb +5 -0
  148. data/spec_legacy/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  149. data/spec_legacy/integration/confirmation_validator/spec_helper.rb +5 -0
  150. data/spec_legacy/integration/datamapper_models/association_validation_spec.rb +29 -0
  151. data/spec_legacy/integration/datamapper_models/inheritance_spec.rb +82 -0
  152. data/spec_legacy/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  153. data/spec_legacy/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  154. data/spec_legacy/integration/duplicated_validations/spec_helper.rb +5 -0
  155. data/spec_legacy/integration/format_validator/email_format_validator_spec.rb +139 -0
  156. data/spec_legacy/integration/format_validator/format_validator_spec.rb +64 -0
  157. data/spec_legacy/integration/format_validator/regexp_validator_spec.rb +33 -0
  158. data/spec_legacy/integration/format_validator/spec_helper.rb +5 -0
  159. data/spec_legacy/integration/format_validator/url_format_validator_spec.rb +93 -0
  160. data/spec_legacy/integration/length_validator/default_value_spec.rb +14 -0
  161. data/spec_legacy/integration/length_validator/equality_spec.rb +87 -0
  162. data/spec_legacy/integration/length_validator/error_message_spec.rb +22 -0
  163. data/spec_legacy/integration/length_validator/maximum_spec.rb +49 -0
  164. data/spec_legacy/integration/length_validator/minimum_spec.rb +54 -0
  165. data/spec_legacy/integration/length_validator/range_spec.rb +87 -0
  166. data/spec_legacy/integration/length_validator/spec_helper.rb +7 -0
  167. data/spec_legacy/integration/method_validator/method_validator_spec.rb +242 -0
  168. data/spec_legacy/integration/method_validator/spec_helper.rb +5 -0
  169. data/spec_legacy/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  170. data/spec_legacy/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  171. data/spec_legacy/integration/numeric_validator/float_type_spec.rb +90 -0
  172. data/spec_legacy/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  173. data/spec_legacy/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  174. data/spec_legacy/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  175. data/spec_legacy/integration/numeric_validator/integer_type_spec.rb +86 -0
  176. data/spec_legacy/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  177. data/spec_legacy/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  178. data/spec_legacy/integration/numeric_validator/spec_helper.rb +5 -0
  179. data/spec_legacy/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  180. data/spec_legacy/integration/primitive_validator/spec_helper.rb +5 -0
  181. data/spec_legacy/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  182. data/spec_legacy/integration/required_field_validator/association_spec.rb +69 -0
  183. data/spec_legacy/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
  184. data/spec_legacy/integration/required_field_validator/date_type_value_spec.rb +127 -0
  185. data/spec_legacy/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  186. data/spec_legacy/integration/required_field_validator/float_type_value_spec.rb +131 -0
  187. data/spec_legacy/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  188. data/spec_legacy/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  189. data/spec_legacy/integration/required_field_validator/shared_examples.rb +26 -0
  190. data/spec_legacy/integration/required_field_validator/spec_helper.rb +7 -0
  191. data/spec_legacy/integration/required_field_validator/string_type_value_spec.rb +167 -0
  192. data/spec_legacy/integration/required_field_validator/text_type_value_spec.rb +49 -0
  193. data/spec_legacy/integration/shared/default_validation_context.rb +13 -0
  194. data/spec_legacy/integration/shared/valid_and_invalid_model.rb +35 -0
  195. data/spec_legacy/integration/uniqueness_validator/spec_helper.rb +5 -0
  196. data/spec_legacy/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  197. data/spec_legacy/integration/within_validator/spec_helper.rb +5 -0
  198. data/spec_legacy/integration/within_validator/within_validator_spec.rb +168 -0
  199. data/spec_legacy/public/resource_spec.rb +105 -0
  200. data/spec_legacy/spec.opts +4 -0
  201. data/spec_legacy/spec_helper.rb +29 -0
  202. data/spec_legacy/unit/contextual_validators/emptiness_spec.rb +50 -0
  203. data/spec_legacy/unit/contextual_validators/execution_spec.rb +48 -0
  204. data/spec_legacy/unit/contextual_validators/spec_helper.rb +37 -0
  205. data/spec_legacy/unit/generic_validator/equality_operator_spec.rb +26 -0
  206. data/spec_legacy/unit/generic_validator/optional_spec.rb +54 -0
  207. data/spec_legacy/unit/validators/within_validator_spec.rb +23 -0
  208. data/spec_legacy/unit/violation_set/adding_spec.rb +54 -0
  209. data/spec_legacy/unit/violation_set/emptiness_spec.rb +38 -0
  210. data/spec_legacy/unit/violation_set/enumerable_spec.rb +32 -0
  211. data/spec_legacy/unit/violation_set/reading_spec.rb +35 -0
  212. data/spec_legacy/unit/violation_set/respond_to_spec.rb +15 -0
  213. data/tasks/spec.rake +38 -0
  214. data/tasks/yard.rake +9 -0
  215. data/tasks/yardstick.rake +19 -0
  216. metadata +302 -0
@@ -0,0 +1,45 @@
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.name = 'Float'
10
+ @model.should 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
+ @model.should_not be_valid_for_presence_test
21
+ @model.errors.on(:name).should == [ '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
+ @model.should 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_should_behave_like "valid model"
44
+ end
45
+ end
@@ -0,0 +1,22 @@
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_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
+ @model.should_not be_valid_for_primitive_test
19
+ @model.errors.on(:build_date).should == [ 'Build date must be of type Date' ]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/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
+ @new.should_not 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
+ lambda {
44
+ @new.should_not be_valid
45
+ }.should raise_error(ArgumentError)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/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_should_behave_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_should_behave_like "invalid model"
30
+
31
+ it "has a meaningful error message" do
32
+ @model.errors.on(:limited).should == [ '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,32 @@
1
+ require 'spec_helper'
2
+ require 'integration/block_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::G3Concert' do
5
+ before :all do
6
+ @model = DataMapper::Validations::Fixtures::G3Concert.new(:year => 2004, :participants => "Joe Satriani, Steve Vai, Yngwie Malmsteen", :city => "Denver")
7
+ @model.should be_valid
8
+ end
9
+
10
+ describe "some non existing year/participants/city combination" do
11
+ before :all do
12
+ @model.year = 2015
13
+ end
14
+
15
+ it_should_behave_like "invalid model"
16
+
17
+ it "uses error messages returned by the validation block" do
18
+ @model.errors.on(:participants).should == [ 'this G3 is probably yet to take place' ]
19
+ end
20
+ end
21
+
22
+
23
+ describe "existing year/participants/city combination" do
24
+ before :all do
25
+ @model.year = 2001
26
+ @model.city = "Los Angeles"
27
+ @model.participants = "Joe Satriani, Steve Vai, John Petrucci"
28
+ end
29
+
30
+ it_should_behave_like "valid model"
31
+ end
32
+ 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
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'integration/conditional_validation/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::UDPPacket' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::UDPPacket.auto_migrate!
7
+
8
+ @model = DataMapper::Validations::Fixtures::UDPPacket.new
9
+ end
10
+
11
+ describe "that is transported encapsulated into IPv4 packet" do
12
+ before :all do
13
+ @model.underlying_ip_version = 4
14
+ end
15
+
16
+ describe "and has no checksum" do
17
+ before :all do
18
+ @model.checksum = nil
19
+ end
20
+
21
+ it_should_behave_like "valid model"
22
+ end
23
+
24
+ describe "and has no checksum algorithm" do
25
+ before :all do
26
+ @model.checksum_algorithm = nil
27
+ end
28
+
29
+ it_should_behave_like "valid model"
30
+ end
31
+ end
32
+
33
+
34
+ describe "that is transported encapsulated into IPv6 packet" do
35
+ before :all do
36
+ @model.underlying_ip_version = 6
37
+ end
38
+
39
+ describe "and has no checksum" do
40
+ before :all do
41
+ @model.checksum = nil
42
+ end
43
+
44
+ it_should_behave_like "invalid model"
45
+
46
+ it "has a meaningful error message" do
47
+ @model.errors.on(:checksum).should == [ 'Checksum is mandatory when used with IPv6' ]
48
+ end
49
+ end
50
+
51
+ describe "and has no checksum algorithm" do
52
+ before :all do
53
+ @model.checksum_algorithm = nil
54
+ end
55
+
56
+ it_should_behave_like "invalid model"
57
+
58
+ it "has a meaningful error message" do
59
+ @model.errors.on(:checksum_algorithm).should == [ 'Checksum is mandatory when used with IPv6' ]
60
+ end
61
+ end
62
+ end
63
+ 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
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'integration/confirmation_validator/spec_helper'
3
+
4
+ describe "reservation with mismatched person name", :shared => true do
5
+ it "has meaningful error message" do
6
+ @model.errors.on(:person_name).should == [ 'Person name does not match the confirmation' ]
7
+ end
8
+ end
9
+
10
+ describe "reservation with mismatched seats number", :shared => true do
11
+ it "has meaningful error message" do
12
+ # Proc gets expanded here
13
+ @model.errors.on(:number_of_seats).should == [ 'Reservation requires confirmation for number_of_seats' ]
14
+ end
15
+ end
16
+
17
+
18
+ describe 'DataMapper::Validations::Fixtures::Reservation' do
19
+ before :all do
20
+ DataMapper::Validations::Fixtures::Reservation.auto_migrate!
21
+
22
+ @model = DataMapper::Validations::Fixtures::Reservation.new(:person_name => "Tyler Durden",
23
+ :person_name_confirmation => "Tyler Durden",
24
+ :number_of_seats => 2,
25
+ :seats_confirmation => 2)
26
+ @model.should be_valid
27
+ end
28
+
29
+ describe "with matching person name and confirmation" do
30
+ before :all do
31
+ @model.person_name = "mismatch"
32
+ end
33
+
34
+ it_should_behave_like "invalid model"
35
+ it_should_behave_like "reservation with mismatched person name"
36
+ end
37
+
38
+
39
+ describe "with a blank person name and confirmation" do
40
+ before :all do
41
+ @model.person_name = ""
42
+ end
43
+
44
+ it_should_behave_like "invalid model"
45
+ it_should_behave_like "reservation with mismatched person name"
46
+ end
47
+
48
+
49
+ describe "with a missing person name and confirmation" do
50
+ before :all do
51
+ @model.person_name = nil
52
+ end
53
+
54
+ it_should_behave_like "invalid model"
55
+ it_should_behave_like "reservation with mismatched person name"
56
+ end
57
+
58
+
59
+ describe "with mismatching number of seats and confirmation" do
60
+ before :all do
61
+ @model.number_of_seats = -1
62
+ end
63
+
64
+ it_should_behave_like "invalid model"
65
+ it_should_behave_like "reservation with mismatched seats number"
66
+ end
67
+
68
+
69
+ describe "with a blank number of seats and confirmation" do
70
+ before :all do
71
+ @model.number_of_seats = nil
72
+ end
73
+
74
+ it_should_behave_like "valid model"
75
+ end
76
+ 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
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Fixtures::Product' do
4
+ before :all do
5
+ DataMapper::Validations::Fixtures::ProductCompany.auto_migrate!
6
+ DataMapper::Validations::Fixtures::Product.auto_migrate!
7
+
8
+ parent_model = DataMapper::Validations::Fixtures::ProductCompany
9
+ @parent = parent_model.new(:title => "Apple", :flagship_product => "Macintosh")
10
+ @parent.should be_valid
11
+ @parent.save.should be_true
12
+
13
+ model_model = DataMapper::Validations::Fixtures::Product
14
+ @model = model_model.new(:name => "MacBook Pro", :company => @parent)
15
+ @model.should be_valid
16
+ end
17
+
18
+ describe "without company" do
19
+ before :all do
20
+ @model.company = nil
21
+ end
22
+
23
+ it_should_behave_like "invalid model"
24
+
25
+ it "has a meaningful error message" do
26
+ @model.errors.on(:company).should == [ 'Company must not be blank' ]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Fixtures::ServiceCompany' do
4
+ before :all do
5
+ DataMapper::Validations::Fixtures::ServiceCompany.auto_migrate!
6
+
7
+ @model = DataMapper::Validations::Fixtures::ServiceCompany.new(:title => "Monsters, Inc.", :area_of_expertise => "Little children's nightmares")
8
+ @model.valid?
9
+ end
10
+
11
+ describe "without title" do
12
+ before :all do
13
+ @model.title = nil
14
+ end
15
+
16
+ it_should_behave_like "invalid model"
17
+
18
+ it "has a meaningful error message for inherited property" do
19
+ @model.errors.on(:title).should == [ 'Company name is a required field' ]
20
+ end
21
+ end
22
+
23
+ describe "without area of expertise" do
24
+ before :all do
25
+ @model.area_of_expertise = nil
26
+ end
27
+
28
+ it_should_behave_like "invalid model"
29
+
30
+ it "has a meaningful error message for own property" do
31
+ @model.errors.on(:area_of_expertise).should == [ 'Area of expertise must not be blank' ]
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+
38
+ describe 'DataMapper::Validations::Fixtures::ProductCompany' do
39
+ before :all do
40
+ DataMapper::Validations::Fixtures::ProductCompany.auto_migrate!
41
+
42
+ @model = DataMapper::Validations::Fixtures::ProductCompany.new(:title => "Apple", :flagship_product => "Macintosh")
43
+ @model.valid?
44
+ end
45
+
46
+ it_should_behave_like "valid model"
47
+
48
+ describe "without title" do
49
+ before :all do
50
+ @model.title = nil
51
+ end
52
+
53
+ it_should_behave_like "invalid model"
54
+
55
+ it "has error message from the subclass itself" do
56
+ @model.errors.on(:title).should include('Product company must have a name')
57
+ end
58
+
59
+ # this may or may not be a desired behavior,
60
+ # but append vs. replace is a matter of opinion
61
+ # anyway
62
+ #
63
+ # TODO: there should be a way to clear validations for a field
64
+ # that subclasses can use
65
+ it "has error message from superclass" do
66
+ @model.errors.on(:title).should include('Company name is a required field')
67
+ end
68
+ end
69
+
70
+
71
+ describe "without flagship product" do
72
+ before :all do
73
+ @model.flagship_product = nil
74
+ end
75
+
76
+ it_should_behave_like "invalid model"
77
+
78
+ it "has a meaningful error message for own property" do
79
+ @model.errors.on(:flagship_product).should == [ 'Flagship product must not be blank' ]
80
+ end
81
+ end
82
+ end