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.
- data/.gitignore +4 -0
- data/.rvmrc +1 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.rdoc +125 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/aequitas.gemspec +20 -0
- data/lib/aequitas.rb +80 -0
- data/lib/aequitas/class_methods.rb +26 -0
- data/lib/aequitas/context.rb +53 -0
- data/lib/aequitas/contextual_rule_set.rb +221 -0
- data/lib/aequitas/exceptions.rb +10 -0
- data/lib/aequitas/macros.rb +466 -0
- data/lib/aequitas/message_transformer.rb +127 -0
- data/lib/aequitas/rule.rb +153 -0
- data/lib/aequitas/rule/absence.rb +14 -0
- data/lib/aequitas/rule/absence/blank.rb +21 -0
- data/lib/aequitas/rule/absence/nil.rb +21 -0
- data/lib/aequitas/rule/acceptance.rb +36 -0
- data/lib/aequitas/rule/block.rb +33 -0
- data/lib/aequitas/rule/confirmation.rb +41 -0
- data/lib/aequitas/rule/format.rb +81 -0
- data/lib/aequitas/rule/format/proc.rb +28 -0
- data/lib/aequitas/rule/format/regexp.rb +44 -0
- data/lib/aequitas/rule/formats/email.rb +52 -0
- data/lib/aequitas/rule/formats/url.rb +14 -0
- data/lib/aequitas/rule/guard.rb +51 -0
- data/lib/aequitas/rule/length.rb +87 -0
- data/lib/aequitas/rule/length/equal.rb +46 -0
- data/lib/aequitas/rule/length/maximum.rb +46 -0
- data/lib/aequitas/rule/length/minimum.rb +46 -0
- data/lib/aequitas/rule/length/range.rb +46 -0
- data/lib/aequitas/rule/method.rb +31 -0
- data/lib/aequitas/rule/numericalness.rb +85 -0
- data/lib/aequitas/rule/numericalness/equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/greater_than.rb +30 -0
- data/lib/aequitas/rule/numericalness/greater_than_or_equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/integer.rb +37 -0
- data/lib/aequitas/rule/numericalness/less_than.rb +30 -0
- data/lib/aequitas/rule/numericalness/less_than_or_equal.rb +30 -0
- data/lib/aequitas/rule/numericalness/non_integer.rb +64 -0
- data/lib/aequitas/rule/numericalness/not_equal.rb +30 -0
- data/lib/aequitas/rule/presence.rb +14 -0
- data/lib/aequitas/rule/presence/not_blank.rb +21 -0
- data/lib/aequitas/rule/presence/not_nil.rb +21 -0
- data/lib/aequitas/rule/primitive_type.rb +28 -0
- data/lib/aequitas/rule/skip_condition.rb +104 -0
- data/lib/aequitas/rule/within.rb +28 -0
- data/lib/aequitas/rule/within/range.rb +53 -0
- data/lib/aequitas/rule/within/range/bounded.rb +25 -0
- data/lib/aequitas/rule/within/range/unbounded_begin.rb +25 -0
- data/lib/aequitas/rule/within/range/unbounded_end.rb +25 -0
- data/lib/aequitas/rule/within/set.rb +39 -0
- data/lib/aequitas/rule_set.rb +80 -0
- data/lib/aequitas/support/blank.rb +22 -0
- data/lib/aequitas/support/equalizable.rb +113 -0
- data/lib/aequitas/support/ordered_hash.rb +438 -0
- data/lib/aequitas/version.rb +5 -0
- data/lib/aequitas/violation.rb +116 -0
- data/lib/aequitas/violation_set.rb +123 -0
- data/lib/aequitas/virtus.rb +29 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor.rb +41 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/boolean.rb +17 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/object.rb +25 -0
- data/lib/aequitas/virtus/inline_attribute_rule_extractor/string.rb +27 -0
- data/spec/integration/aequitas/macros/validates_absence_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_acceptance_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_confirmation_of_spec.rb +25 -0
- data/spec/integration/aequitas/macros/validates_format_of_spec.rb +87 -0
- data/spec/integration/aequitas/macros/validates_length_of.rb +77 -0
- data/spec/integration/aequitas/macros/validates_numericalness_of_spec.rb +221 -0
- data/spec/integration/aequitas/macros/validates_presence_of_spec.rb +19 -0
- data/spec/integration/aequitas/macros/validates_with_block.rb +23 -0
- data/spec/integration/aequitas/macros/validates_with_method.rb +19 -0
- data/spec/integration/aequitas/macros/validates_within.rb +87 -0
- data/spec/integration/shared/macros/integration_spec.rb +67 -0
- data/spec/integration/virtus/boolean/presence_spec.rb +49 -0
- data/spec/integration/virtus/string/format/email_address_spec.rb +55 -0
- data/spec/integration/virtus/string/format/regexp_spec.rb +55 -0
- data/spec/integration/virtus/string/format/url_spec.rb +55 -0
- data/spec/integration/virtus/string/length/equal_spec.rb +49 -0
- data/spec/integration/virtus/string/length/range_spec.rb +49 -0
- data/spec/integration/virtus/string/presence_spec.rb +49 -0
- data/spec/rcov.opts +6 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/suite.rb +5 -0
- data/spec/unit/aequitas/rule/absence/blank_spec.rb +45 -0
- data/spec/unit/aequitas/rule/acceptance_spec.rb +71 -0
- data/spec/unit/aequitas/rule/confirmation_spec.rb +80 -0
- data/spec/unit/aequitas/rule/guard_spec.rb +120 -0
- data/spec/unit/aequitas/rule/skip_condition_spec.rb +170 -0
- data/spec/unit/aequitas/rule_spec.rb +40 -0
- data/spec/unit/aequitas/support/blank_spec.rb +83 -0
- data/spec/unit/aequitas/support/equalizable/equalizer_spec.rb +21 -0
- data/spec/unit/aequitas/support/equalizable_spec.rb +67 -0
- data/spec/unit/aequitas/violation_set_spec.rb +154 -0
- data/spec_legacy/fixtures/barcode.rb +40 -0
- data/spec_legacy/fixtures/basketball_court.rb +58 -0
- data/spec_legacy/fixtures/basketball_player.rb +34 -0
- data/spec_legacy/fixtures/beta_tester_account.rb +33 -0
- data/spec_legacy/fixtures/bill_of_landing.rb +47 -0
- data/spec_legacy/fixtures/boat_dock.rb +26 -0
- data/spec_legacy/fixtures/city.rb +24 -0
- data/spec_legacy/fixtures/company.rb +93 -0
- data/spec_legacy/fixtures/corporate_world.rb +39 -0
- data/spec_legacy/fixtures/country.rb +24 -0
- data/spec_legacy/fixtures/ethernet_frame.rb +56 -0
- data/spec_legacy/fixtures/event.rb +44 -0
- data/spec_legacy/fixtures/g3_concert.rb +57 -0
- data/spec_legacy/fixtures/jabberwock.rb +27 -0
- data/spec_legacy/fixtures/kayak.rb +28 -0
- data/spec_legacy/fixtures/lernean_hydra.rb +39 -0
- data/spec_legacy/fixtures/llama_spaceship.rb +15 -0
- data/spec_legacy/fixtures/mathematical_function.rb +34 -0
- data/spec_legacy/fixtures/memory_object.rb +30 -0
- data/spec_legacy/fixtures/mittelschnauzer.rb +39 -0
- data/spec_legacy/fixtures/motor_launch.rb +21 -0
- data/spec_legacy/fixtures/multibyte.rb +16 -0
- data/spec_legacy/fixtures/page.rb +32 -0
- data/spec_legacy/fixtures/phone_number.rb +28 -0
- data/spec_legacy/fixtures/pirogue.rb +28 -0
- data/spec_legacy/fixtures/programming_language.rb +83 -0
- data/spec_legacy/fixtures/reservation.rb +38 -0
- data/spec_legacy/fixtures/scm_operation.rb +56 -0
- data/spec_legacy/fixtures/sms_message.rb +22 -0
- data/spec_legacy/fixtures/udp_packet.rb +49 -0
- data/spec_legacy/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
- data/spec_legacy/integration/absent_field_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
- data/spec_legacy/integration/acceptance_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
- data/spec_legacy/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
- data/spec_legacy/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
- data/spec_legacy/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
- data/spec_legacy/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
- data/spec_legacy/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
- data/spec_legacy/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
- data/spec_legacy/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
- data/spec_legacy/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
- data/spec_legacy/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
- data/spec_legacy/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
- data/spec_legacy/integration/automatic_validation/spec_helper.rb +57 -0
- data/spec_legacy/integration/block_validator/block_validator_spec.rb +32 -0
- data/spec_legacy/integration/block_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/conditional_validation/if_condition_spec.rb +63 -0
- data/spec_legacy/integration/conditional_validation/spec_helper.rb +5 -0
- data/spec_legacy/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
- data/spec_legacy/integration/confirmation_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/datamapper_models/association_validation_spec.rb +29 -0
- data/spec_legacy/integration/datamapper_models/inheritance_spec.rb +82 -0
- data/spec_legacy/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
- data/spec_legacy/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
- data/spec_legacy/integration/duplicated_validations/spec_helper.rb +5 -0
- data/spec_legacy/integration/format_validator/email_format_validator_spec.rb +139 -0
- data/spec_legacy/integration/format_validator/format_validator_spec.rb +64 -0
- data/spec_legacy/integration/format_validator/regexp_validator_spec.rb +33 -0
- data/spec_legacy/integration/format_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/format_validator/url_format_validator_spec.rb +93 -0
- data/spec_legacy/integration/length_validator/default_value_spec.rb +14 -0
- data/spec_legacy/integration/length_validator/equality_spec.rb +87 -0
- data/spec_legacy/integration/length_validator/error_message_spec.rb +22 -0
- data/spec_legacy/integration/length_validator/maximum_spec.rb +49 -0
- data/spec_legacy/integration/length_validator/minimum_spec.rb +54 -0
- data/spec_legacy/integration/length_validator/range_spec.rb +87 -0
- data/spec_legacy/integration/length_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/method_validator/method_validator_spec.rb +242 -0
- data/spec_legacy/integration/method_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
- data/spec_legacy/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
- data/spec_legacy/integration/numeric_validator/float_type_spec.rb +90 -0
- data/spec_legacy/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/integer_only_true_spec.rb +91 -0
- data/spec_legacy/integration/numeric_validator/integer_type_spec.rb +86 -0
- data/spec_legacy/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
- data/spec_legacy/integration/numeric_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/primitive_validator/primitive_validator_spec.rb +92 -0
- data/spec_legacy/integration/primitive_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
- data/spec_legacy/integration/required_field_validator/association_spec.rb +69 -0
- data/spec_legacy/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
- data/spec_legacy/integration/required_field_validator/date_type_value_spec.rb +127 -0
- data/spec_legacy/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
- data/spec_legacy/integration/required_field_validator/float_type_value_spec.rb +131 -0
- data/spec_legacy/integration/required_field_validator/integer_type_value_spec.rb +99 -0
- data/spec_legacy/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
- data/spec_legacy/integration/required_field_validator/shared_examples.rb +26 -0
- data/spec_legacy/integration/required_field_validator/spec_helper.rb +7 -0
- data/spec_legacy/integration/required_field_validator/string_type_value_spec.rb +167 -0
- data/spec_legacy/integration/required_field_validator/text_type_value_spec.rb +49 -0
- data/spec_legacy/integration/shared/default_validation_context.rb +13 -0
- data/spec_legacy/integration/shared/valid_and_invalid_model.rb +35 -0
- data/spec_legacy/integration/uniqueness_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
- data/spec_legacy/integration/within_validator/spec_helper.rb +5 -0
- data/spec_legacy/integration/within_validator/within_validator_spec.rb +168 -0
- data/spec_legacy/public/resource_spec.rb +105 -0
- data/spec_legacy/spec.opts +4 -0
- data/spec_legacy/spec_helper.rb +29 -0
- data/spec_legacy/unit/contextual_validators/emptiness_spec.rb +50 -0
- data/spec_legacy/unit/contextual_validators/execution_spec.rb +48 -0
- data/spec_legacy/unit/contextual_validators/spec_helper.rb +37 -0
- data/spec_legacy/unit/generic_validator/equality_operator_spec.rb +26 -0
- data/spec_legacy/unit/generic_validator/optional_spec.rb +54 -0
- data/spec_legacy/unit/validators/within_validator_spec.rb +23 -0
- data/spec_legacy/unit/violation_set/adding_spec.rb +54 -0
- data/spec_legacy/unit/violation_set/emptiness_spec.rb +38 -0
- data/spec_legacy/unit/violation_set/enumerable_spec.rb +32 -0
- data/spec_legacy/unit/violation_set/reading_spec.rb +35 -0
- data/spec_legacy/unit/violation_set/respond_to_spec.rb +15 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- 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,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,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,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
|