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