dm-validations 0.9.11 → 0.10.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.
- data/{History.txt → History.rdoc} +10 -3
- data/LICENSE +1 -0
- data/Manifest.txt +103 -33
- data/README.rdoc +172 -0
- data/Rakefile +4 -5
- data/lib/dm-validations.rb +73 -75
- data/lib/dm-validations/auto_validate.rb +98 -56
- data/lib/dm-validations/contextual_validators.rb +37 -14
- data/lib/dm-validations/exceptions.rb +3 -0
- data/lib/dm-validations/formats/url.rb +3 -1
- data/lib/dm-validations/support/context.rb +54 -0
- data/lib/dm-validations/validation_errors.rb +51 -27
- data/lib/dm-validations/{absent_field_validator.rb → validators/absent_field_validator.rb} +2 -8
- data/lib/dm-validations/{acceptance_validator.rb → validators/acceptance_validator.rb} +7 -7
- data/lib/dm-validations/{block_validator.rb → validators/block_validator.rb} +0 -0
- data/lib/dm-validations/{confirmation_validator.rb → validators/confirmation_validator.rb} +7 -7
- data/lib/dm-validations/{format_validator.rb → validators/format_validator.rb} +10 -16
- data/lib/dm-validations/{generic_validator.rb → validators/generic_validator.rb} +28 -6
- data/lib/dm-validations/validators/length_validator.rb +214 -0
- data/lib/dm-validations/validators/method_validator.rb +68 -0
- data/lib/dm-validations/validators/numeric_validator.rb +171 -0
- data/lib/dm-validations/{primitive_validator.rb → validators/primitive_validator.rb} +2 -7
- data/lib/dm-validations/{required_field_validator.rb → validators/required_field_validator.rb} +0 -6
- data/lib/dm-validations/{uniqueness_validator.rb → validators/uniqueness_validator.rb} +9 -20
- data/lib/dm-validations/{within_validator.rb → validators/within_validator.rb} +4 -4
- data/lib/dm-validations/version.rb +1 -1
- data/spec/fixtures/barcode.rb +32 -0
- data/spec/fixtures/basketball_court.rb +58 -0
- data/spec/fixtures/basketball_player.rb +37 -0
- data/spec/fixtures/beta_tester_account.rb +33 -0
- data/spec/fixtures/bill_of_landing.rb +42 -0
- data/spec/fixtures/boat_dock.rb +26 -0
- data/spec/fixtures/city.rb +25 -0
- data/spec/fixtures/company.rb +95 -0
- data/spec/fixtures/corporate_world.rb +47 -0
- data/spec/fixtures/country.rb +25 -0
- data/spec/fixtures/currency.rb +42 -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/mathematical_function.rb +34 -0
- data/spec/fixtures/memory_object.rb +30 -0
- data/spec/fixtures/mittelschnauzer.rb +35 -0
- data/spec/fixtures/motor_launch.rb +21 -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 +67 -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 +86 -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 +47 -0
- data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +41 -0
- data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +104 -0
- data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +35 -0
- data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +33 -0
- data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +73 -0
- data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +121 -0
- data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +41 -0
- data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +20 -0
- data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +33 -0
- data/spec/integration/automatic_validation/spec_helper.rb +74 -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 +61 -0
- data/spec/integration/conditional_validation/spec_helper.rb +5 -0
- data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +74 -0
- data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
- data/spec/integration/datamapper_models/association_validation_spec.rb +23 -0
- data/spec/integration/datamapper_models/inheritance_spec.rb +78 -0
- data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +22 -0
- data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
- data/spec/integration/format_validator/email_format_validator_spec.rb +113 -0
- data/spec/integration/format_validator/format_validator_spec.rb +60 -0
- data/spec/integration/format_validator/regexp_validator_spec.rb +29 -0
- data/spec/integration/format_validator/spec_helper.rb +5 -0
- data/spec/integration/format_validator/url_format_validator_spec.rb +63 -0
- data/spec/integration/length_validator/default_value_spec.rb +12 -0
- data/spec/integration/length_validator/equality_spec.rb +79 -0
- data/spec/integration/length_validator/error_message_spec.rb +15 -18
- data/spec/integration/length_validator/maximum_spec.rb +40 -24
- data/spec/integration/length_validator/minimum_spec.rb +32 -21
- data/spec/integration/length_validator/range_spec.rb +50 -60
- data/spec/integration/length_validator/spec_helper.rb +7 -12
- data/spec/integration/method_validator/method_validator_spec.rb +239 -0
- data/spec/integration/method_validator/spec_helper.rb +5 -0
- data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +61 -0
- data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +37 -0
- data/spec/integration/numeric_validator/float_type_spec.rb +42 -56
- data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +35 -0
- data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +35 -0
- data/spec/integration/numeric_validator/integer_only_true_spec.rb +3 -6
- data/spec/integration/numeric_validator/integer_type_spec.rb +8 -24
- data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +35 -0
- data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +35 -0
- data/spec/integration/numeric_validator/spec_helper.rb +5 -77
- data/spec/integration/primitive_validator/primitive_validator_spec.rb +90 -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 +5 -8
- data/spec/integration/required_field_validator/boolean_type_value_spec.rb +4 -7
- data/spec/integration/required_field_validator/date_type_value_spec.rb +3 -6
- data/spec/integration/required_field_validator/datetime_type_value_spec.rb +3 -6
- data/spec/integration/required_field_validator/float_type_value_spec.rb +3 -6
- data/spec/integration/required_field_validator/integer_type_value_spec.rb +2 -5
- data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +5 -8
- data/spec/integration/required_field_validator/shared_examples.rb +1 -1
- data/spec/integration/required_field_validator/spec_helper.rb +6 -67
- data/spec/integration/required_field_validator/string_type_value_spec.rb +2 -5
- data/spec/integration/required_field_validator/text_type_value_spec.rb +2 -5
- data/spec/integration/shared/default_validation_context.rb +13 -0
- data/spec/integration/shared/valid_and_invalid_model.rb +27 -0
- data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
- data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +114 -0
- data/spec/integration/within_validator/spec_helper.rb +5 -0
- data/spec/integration/within_validator/within_validator_spec.rb +164 -0
- data/spec/public/resource_spec.rb +68 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +12 -4
- data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
- data/spec/unit/contextual_validators/execution_spec.rb +55 -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/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/tasks/install.rb +1 -1
- data/tasks/spec.rb +4 -4
- metadata +118 -55
- data/README.txt +0 -72
- data/lib/dm-validations/custom_validator.rb +0 -72
- data/lib/dm-validations/length_validator.rb +0 -113
- data/lib/dm-validations/method_validator.rb +0 -68
- data/lib/dm-validations/numeric_validator.rb +0 -83
- data/spec/integration/absent_field_validator_spec.rb +0 -36
- data/spec/integration/acceptance_validator_spec.rb +0 -87
- data/spec/integration/auto_validate_spec.rb +0 -342
- data/spec/integration/block_validator_spec.rb +0 -30
- data/spec/integration/confirmation_validator_spec.rb +0 -105
- data/spec/integration/contextual_validators_spec.rb +0 -27
- data/spec/integration/custom_validator_spec.rb +0 -9
- data/spec/integration/format_validator_spec.rb +0 -193
- data/spec/integration/generic_validator_spec.rb +0 -17
- data/spec/integration/length_validator/valid_objects_spec.rb +0 -13
- data/spec/integration/method_validator_spec.rb +0 -58
- data/spec/integration/numeric_validator_spec.rb +0 -253
- data/spec/integration/primitive_validator_spec.rb +0 -30
- data/spec/integration/uniqueness_validator_spec.rb +0 -97
- data/spec/integration/validation_errors_spec.rb +0 -18
- data/spec/integration/validation_spec.rb +0 -404
- data/spec/integration/within_validator_spec.rb +0 -79
@@ -0,0 +1,74 @@
|
|
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
|
+
module TypecastBypassSetter
|
14
|
+
# Bypass typecasting so we can set values for specs
|
15
|
+
def set(attributes)
|
16
|
+
attributes.each do |k, v|
|
17
|
+
instance_variable_set("@#{k}", v)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class SailBoat
|
23
|
+
include DataMapper::Resource
|
24
|
+
|
25
|
+
# this one is not Serial intentionally
|
26
|
+
# use Serial in real world apps
|
27
|
+
property :id, Integer, :key => true, :min => 1, :max => 10
|
28
|
+
|
29
|
+
property :name, String, :nullable => false, :validates => :presence_test
|
30
|
+
property :description, String, :length => 10, :validates => :length_test_1
|
31
|
+
property :notes, String, :length => 2..10, :validates => :length_test_2
|
32
|
+
property :no_validation, String, :auto_validation => false
|
33
|
+
property :salesman, String, :nullable => false, :validates => [:multi_context_1, :multi_context_2]
|
34
|
+
property :code, String, :format => Proc.new { |code| code =~ /A\d{4}\z/ }, :validates => :format_test
|
35
|
+
property :allow_nil, String, :length => 5..10, :nullable => true, :validates => :nil_test
|
36
|
+
property :build_date, Date, :validates => :primitive_test
|
37
|
+
property :float, Float, :precision => 2, :scale => 1
|
38
|
+
property :big_decimal, BigDecimal, :precision => 2, :scale => 1
|
39
|
+
|
40
|
+
include TypecastBypassSetter
|
41
|
+
end
|
42
|
+
|
43
|
+
class HasNullableBoolean
|
44
|
+
include DataMapper::Resource
|
45
|
+
|
46
|
+
# this one is not Serial intentionally
|
47
|
+
# use Serial in real world apps
|
48
|
+
property :id, Integer, :key => true
|
49
|
+
property :bool, Boolean # :nullable => true by default
|
50
|
+
|
51
|
+
include TypecastBypassSetter
|
52
|
+
end
|
53
|
+
|
54
|
+
class HasNotNullableBoolean
|
55
|
+
include DataMapper::Resource
|
56
|
+
|
57
|
+
# this one is not Serial intentionally
|
58
|
+
# use Serial in real world apps
|
59
|
+
property :id, Integer, :key => true
|
60
|
+
property :bool, Boolean, :nullable => false
|
61
|
+
|
62
|
+
include TypecastBypassSetter
|
63
|
+
end
|
64
|
+
|
65
|
+
class HasNotNullableParanoidBoolean
|
66
|
+
include DataMapper::Resource
|
67
|
+
|
68
|
+
# this one is not Serial intentionally
|
69
|
+
# use Serial in real world apps
|
70
|
+
property :id, Integer, :key => true
|
71
|
+
property :bool, ParanoidBoolean, :nullable => false
|
72
|
+
|
73
|
+
include TypecastBypassSetter
|
74
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/block_validator/spec_helper'
|
3
|
+
|
4
|
+
describe DataMapper::Validate::Fixtures::G3Concert do
|
5
|
+
before :all do
|
6
|
+
@model = DataMapper::Validate::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,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/conditional_validation/spec_helper'
|
3
|
+
|
4
|
+
describe DataMapper::Validate::Fixtures::UDPPacket do
|
5
|
+
before :all do
|
6
|
+
@model = DataMapper::Validate::Fixtures::UDPPacket.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "that is transported encapsulated into IPv4 packet" do
|
10
|
+
before :all do
|
11
|
+
@model.underlying_ip_version = 4
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "and has no checksum" do
|
15
|
+
before :all do
|
16
|
+
@model.checksum = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it_should_behave_like "valid model"
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "and has no checksum algorithm" do
|
23
|
+
before :all do
|
24
|
+
@model.checksum_algorithm = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it_should_behave_like "valid model"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
describe "that is transported encapsulated into IPv6 packet" do
|
33
|
+
before :all do
|
34
|
+
@model.underlying_ip_version = 6
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "and has no checksum" do
|
38
|
+
before :all do
|
39
|
+
@model.checksum = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it_should_behave_like "invalid model"
|
43
|
+
|
44
|
+
it "has a meaningful error message" do
|
45
|
+
@model.errors.on(:checksum).should == [ 'Checksum is mandatory when used with IPv6' ]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "and has no checksum algorithm" do
|
50
|
+
before :all do
|
51
|
+
@model.checksum_algorithm = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it_should_behave_like "invalid model"
|
55
|
+
|
56
|
+
it "has a meaningful error message" do
|
57
|
+
@model.errors.on(:checksum_algorithm).should == [ 'Checksum is mandatory when used with IPv6' ]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,74 @@
|
|
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::Validate::Fixtures::Reservation do
|
19
|
+
before :all do
|
20
|
+
@model = DataMapper::Validate::Fixtures::Reservation.new(:person_name => "Tyler Durden",
|
21
|
+
:person_name_confirmation => "Tyler Durden",
|
22
|
+
:number_of_seats => 2,
|
23
|
+
:seats_confirmation => 2)
|
24
|
+
@model.should be_valid
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "with matching person name and confirmation" do
|
28
|
+
before :all do
|
29
|
+
@model.person_name = "mismatch"
|
30
|
+
end
|
31
|
+
|
32
|
+
it_should_behave_like "invalid model"
|
33
|
+
it_should_behave_like "reservation with mismatched person name"
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
describe "with a blank person name and confirmation" do
|
38
|
+
before :all do
|
39
|
+
@model.person_name = ""
|
40
|
+
end
|
41
|
+
|
42
|
+
it_should_behave_like "invalid model"
|
43
|
+
it_should_behave_like "reservation with mismatched person name"
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
describe "with a missing person name and confirmation" do
|
48
|
+
before :all do
|
49
|
+
@model.person_name = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it_should_behave_like "invalid model"
|
53
|
+
it_should_behave_like "reservation with mismatched person name"
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
describe "with mismatching number of seats and confirmation" do
|
58
|
+
before :all do
|
59
|
+
@model.number_of_seats = -1
|
60
|
+
end
|
61
|
+
|
62
|
+
it_should_behave_like "invalid model"
|
63
|
+
it_should_behave_like "reservation with mismatched seats number"
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
describe "with a blank number of seats and confirmation" do
|
68
|
+
before :all do
|
69
|
+
@model.number_of_seats = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it_should_behave_like "valid model"
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataMapper::Validate::Fixtures::Product do
|
4
|
+
before :all do
|
5
|
+
@parent = DataMapper::Validate::Fixtures::ProductCompany.create(:title => "Apple", :flagship_product => "Macintosh")
|
6
|
+
@parent.should be_valid
|
7
|
+
|
8
|
+
@model = DataMapper::Validate::Fixtures::Product.new(:name => "MacBook Pro", :company => @parent)
|
9
|
+
@model.should be_valid
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "without company" do
|
13
|
+
before :all do
|
14
|
+
@model.company = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it_should_behave_like "invalid model"
|
18
|
+
|
19
|
+
it "has a meaningful error message" do
|
20
|
+
@model.errors.on(:company).should == [ 'Company must not be blank' ]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataMapper::Validate::Fixtures::ServiceCompany do
|
4
|
+
before :all do
|
5
|
+
@model = DataMapper::Validate::Fixtures::ServiceCompany.new(:title => "Monsters, Inc.", :area_of_expertise => "Little children's nightmares")
|
6
|
+
@model.valid?
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "without title" do
|
10
|
+
before :all do
|
11
|
+
@model.title = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it_should_behave_like "invalid model"
|
15
|
+
|
16
|
+
it "has a meaningful error message for inherited property" do
|
17
|
+
@model.errors.on(:title).should == [ 'Company name is a required field' ]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "without area of expertise" do
|
22
|
+
before :all do
|
23
|
+
@model.area_of_expertise = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it_should_behave_like "invalid model"
|
27
|
+
|
28
|
+
it "has a meaningful error message for own property" do
|
29
|
+
@model.errors.on(:area_of_expertise).should == [ 'Area of expertise must not be blank' ]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
describe DataMapper::Validate::Fixtures::ProductCompany do
|
37
|
+
before :all do
|
38
|
+
@model = DataMapper::Validate::Fixtures::ProductCompany.new(:title => "Apple", :flagship_product => "Macintosh")
|
39
|
+
@model.valid?
|
40
|
+
end
|
41
|
+
|
42
|
+
it_should_behave_like "valid model"
|
43
|
+
|
44
|
+
describe "without title" do
|
45
|
+
before :all do
|
46
|
+
@model.title = nil
|
47
|
+
end
|
48
|
+
|
49
|
+
it_should_behave_like "invalid model"
|
50
|
+
|
51
|
+
it "has error message from the subclass itself" do
|
52
|
+
@model.errors.on(:title).should include('Product company must have a name')
|
53
|
+
end
|
54
|
+
|
55
|
+
# this may or may not be a desired behavior,
|
56
|
+
# but append vs. replace is a matter of opinion
|
57
|
+
# anyway
|
58
|
+
#
|
59
|
+
# TODO: there should be a way to clear validations for a field
|
60
|
+
# that subclasses can use
|
61
|
+
it "has error message from superclass" do
|
62
|
+
@model.errors.on(:title).should include('Company name is a required field')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
describe "without flagship product" do
|
68
|
+
before :all do
|
69
|
+
@model.flagship_product = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it_should_behave_like "invalid model"
|
73
|
+
|
74
|
+
it "has a meaningful error message for own property" do
|
75
|
+
@model.errors.on(:flagship_product).should == [ 'Flagship product must not be blank' ]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'integration/duplicated_validations/spec_helper'
|
5
|
+
|
6
|
+
describe DataMapper::Validate::Fixtures::Page do
|
7
|
+
before :all do
|
8
|
+
@model = DataMapper::Validate::Fixtures::Page.new(:id => 1024)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "without body" do
|
12
|
+
before :all do
|
13
|
+
@model.body = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it_should_behave_like "invalid model"
|
17
|
+
|
18
|
+
it "does not have duplicated error messages" do
|
19
|
+
@model.errors.on(:body).should == ["Body must not be blank"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'integration/format_validator/spec_helper'
|
3
|
+
|
4
|
+
describe DataMapper::Validate::Fixtures::BillOfLading do
|
5
|
+
def valid_attributes
|
6
|
+
{ :id => 1, :doc_no => 'A1234', :email => 'user@example.com', :url => 'http://example.com' }
|
7
|
+
end
|
8
|
+
|
9
|
+
@valid_email_addresses = [
|
10
|
+
'+1~1+@example.com',
|
11
|
+
'{_dave_}@example.com',
|
12
|
+
'"[[ dave ]]"@example.com',
|
13
|
+
'dave."dave"@example.com',
|
14
|
+
'test@localhost',
|
15
|
+
'test@example.com',
|
16
|
+
'test@example.co.uk',
|
17
|
+
'test@example.com.br',
|
18
|
+
'"J. P. \'s-Gravezande, a.k.a. The Hacker!"@example.com',
|
19
|
+
'me@[187.223.45.119]',
|
20
|
+
'someone@123.com',
|
21
|
+
'simon&garfunkel@songs.com'].each do |email|
|
22
|
+
|
23
|
+
describe "with email value of #{email} (RFC2822 compliant)" do
|
24
|
+
before :all do
|
25
|
+
@model = DataMapper::Validate::Fixtures::BillOfLading.new(valid_attributes.merge(:email => email))
|
26
|
+
end
|
27
|
+
|
28
|
+
it_should_behave_like "valid model"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
@invalid_email_addresses = [
|
34
|
+
'-- dave --@example.com',
|
35
|
+
'[dave]@example.com',
|
36
|
+
'.dave@example.com',
|
37
|
+
'Max@Job 3:14',
|
38
|
+
'Job@Book of Job',
|
39
|
+
'J. P. \'s-Gravezande, a.k.a. The Hacker!@example.com'].each do |email|
|
40
|
+
describe "with email value of #{email} (non RFC2822 compliant)" do
|
41
|
+
before :all do
|
42
|
+
@model = DataMapper::Validate::Fixtures::BillOfLading.new(valid_attributes.merge(:email => email))
|
43
|
+
end
|
44
|
+
|
45
|
+
it_should_behave_like "invalid model"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it 'should have a pre-defined URL format' do
|
51
|
+
bad = [ 'http:// example.com',
|
52
|
+
'ftp://example.com',
|
53
|
+
'http://.com',
|
54
|
+
'http://',
|
55
|
+
'test',
|
56
|
+
'...'
|
57
|
+
]
|
58
|
+
|
59
|
+
good = [
|
60
|
+
'http://example.com',
|
61
|
+
'http://www.example.com',
|
62
|
+
]
|
63
|
+
|
64
|
+
bol = DataMapper::Validate::Fixtures::BillOfLading.new(valid_attributes.except(:url))
|
65
|
+
bol.should_not be_valid
|
66
|
+
bol.errors.on(:url).should == [ 'Url has an invalid format' ]
|
67
|
+
|
68
|
+
bad.map do |e|
|
69
|
+
bol.url = e
|
70
|
+
bol.valid?
|
71
|
+
bol.errors.on(:url).should == [ 'Url has an invalid format' ]
|
72
|
+
end
|
73
|
+
|
74
|
+
good.map do |e|
|
75
|
+
bol.url = e
|
76
|
+
bol.valid?
|
77
|
+
bol.errors.on(:url).should be_nil
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'with a regexp' do
|
83
|
+
before do
|
84
|
+
@bol = DataMapper::Validate::Fixtures::BillOfLading.new(valid_attributes)
|
85
|
+
@bol.should be_valid
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'if matched' do
|
89
|
+
before do
|
90
|
+
@bol.username = 'a12345'
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should validate' do
|
94
|
+
@bol.should be_valid
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'if not matched' do
|
99
|
+
before do
|
100
|
+
@bol.username = '12345'
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should not validate' do
|
104
|
+
@bol.should_not be_valid
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should set an error message' do
|
108
|
+
@bol.valid?
|
109
|
+
@bol.errors.on(:username).should == [ 'Username must have at least one letter' ]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|