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,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,52 @@
1
+ require 'spec_helper'
2
+ require 'integration/automatic_validation/spec_helper'
3
+
4
+ describe 'uniqueness' do
5
+ describe 'single column' do
6
+ before :all do
7
+ @klass = Class.new do
8
+ include DataMapper::Resource
9
+
10
+ def self.name
11
+ 'UniqueEventsSingle'
12
+ end
13
+
14
+ property :id, Integer, :key => true
15
+ property :start_year, Integer, :unique => true
16
+ end
17
+ @klass.auto_migrate!
18
+
19
+ @existing = @klass.create(:id => 1, :start_year => 2008)
20
+ @new = @klass.new(:id => 2, :start_year => 2008)
21
+ end
22
+
23
+ it 'validates' do
24
+ @new.should_not be_valid
25
+ end
26
+ end
27
+
28
+ describe 'multiple columns' do
29
+ before :all do
30
+ @klass = Class.new do
31
+ include DataMapper::Resource
32
+
33
+ def self.name
34
+ 'UniqueEventsMultiple'
35
+ end
36
+
37
+ property :id, Integer, :key => true
38
+ property :start_year, Integer, :unique => :years
39
+ property :stop_year, Integer, :unique => :years
40
+ end
41
+ @klass.auto_migrate!
42
+
43
+ @new = @klass.new(:id => 1, :start_year => 2008, :stop_year => 2009)
44
+ end
45
+
46
+ it 'validates uniquness' do
47
+ lambda {
48
+ @new.should_not be_valid
49
+ }.should raise_error(ArgumentError)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
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
+ DataMapper.finalize
13
+
14
+ if DataMapper.respond_to?(:auto_migrate!)
15
+ DataMapper.auto_migrate!
16
+ end
17
+ end
18
+
19
+ describe "without value on that property" do
20
+ before :all do
21
+ @model = LimitedBoat.new
22
+ end
23
+
24
+ # default value is respected
25
+ it_should_behave_like "valid model"
26
+ end
27
+
28
+ describe "without value on that property that is not in allowed range/set" do
29
+ before :all do
30
+ @model = LimitedBoat.new(:limited => "blah")
31
+ end
32
+
33
+ it_should_behave_like "invalid model"
34
+
35
+ it "has a meaningful error message" do
36
+ @model.errors.on(:limited).should == [ 'Limited must be one of foo, bar, bang' ]
37
+ end
38
+ end
39
+ 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