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,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'integration/required_field_validator/spec_helper'
|
|
3
|
+
|
|
4
|
+
describe 'required_field_validator/plain_old_ruby_object_spec' do
|
|
5
|
+
|
|
6
|
+
describe "A plain old Ruby object (not a DM resource)" do
|
|
7
|
+
before do
|
|
8
|
+
class PlainClass
|
|
9
|
+
extend DataMapper::Validations::ClassMethods
|
|
10
|
+
include DataMapper::Validations
|
|
11
|
+
attr_accessor :accessor
|
|
12
|
+
validates_presence_of :here, :empty, :nil, :accessor
|
|
13
|
+
def here; "here" end
|
|
14
|
+
def empty; "" end
|
|
15
|
+
def nil; nil end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
@pc = PlainClass.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should fail validation with empty, nil, or blank fields" do
|
|
22
|
+
@pc.should_not be_valid
|
|
23
|
+
@pc.errors.on(:empty).should == [ 'Empty must not be blank' ]
|
|
24
|
+
@pc.errors.on(:nil).should == [ 'Nil must not be blank' ]
|
|
25
|
+
@pc.errors.on(:accessor).should == [ 'Accessor must not be blank' ]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "giving accessor a value should remove validation error" do
|
|
29
|
+
@pc.accessor = "full"
|
|
30
|
+
@pc.valid?
|
|
31
|
+
@pc.errors.on(:accessor).should be_nil
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
describe 'GitOperation' do
|
|
2
|
+
before do
|
|
3
|
+
GitOperation.auto_migrate!
|
|
4
|
+
|
|
5
|
+
@operation = GitOperation.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe "unnamed SCM operation", :shared => true do
|
|
9
|
+
before do
|
|
10
|
+
@operation.name = nil
|
|
11
|
+
@operation.valid?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "is not valid" do
|
|
15
|
+
@operation.should_not be_valid
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "is not valid in default validation context" do
|
|
19
|
+
@operation.should_not be_valid(:default)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "points to blank name in the error message" do
|
|
23
|
+
@operation.errors.on(:name).should == [ 'Name must not be blank' ]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'integration/required_field_validator/spec_helper'
|
|
3
|
+
|
|
4
|
+
describe 'required_field_validator/string_type_value_spec' do
|
|
5
|
+
|
|
6
|
+
# keep in mind any ScmOperation has a default value for brand property
|
|
7
|
+
# so it is used
|
|
8
|
+
describe 'GitOperation' do
|
|
9
|
+
before :all do
|
|
10
|
+
GitOperation.auto_migrate!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
@operation = GitOperation.new(:network_connection => true,
|
|
15
|
+
:clean_working_copy => true,
|
|
16
|
+
:message => "I did it! I did it!! Hell yeah!!!")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "without explicitly specified committer name" do
|
|
20
|
+
before do
|
|
21
|
+
# no specific actions for this case! yay!
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "is valid for committing (because default value jumps in)" do
|
|
25
|
+
@operation.should be_valid_for_committing
|
|
26
|
+
@operation.should be_valid(:committing)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "is not valid in default context" do
|
|
30
|
+
# context here is :default
|
|
31
|
+
@operation.should_not be_valid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "has default value set" do
|
|
35
|
+
# this is more of a sanity check since
|
|
36
|
+
# this sort of functionality clearly needs to be
|
|
37
|
+
# tested in
|
|
38
|
+
@operation.committer_name.should == "Just another Ruby hacker"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "WITH explicitly specified committer name" do
|
|
43
|
+
before do
|
|
44
|
+
@operation.committer_name = "Core Team Guy"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "is valid for committing" do
|
|
48
|
+
@operation.should be_valid_for_committing
|
|
49
|
+
@operation.should be_valid(:committing)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "is not valid in default context" do
|
|
53
|
+
@operation.should_not be_valid
|
|
54
|
+
@operation.should_not be_valid(:default)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "has value set" do
|
|
58
|
+
# this is more of a sanity check since
|
|
59
|
+
# this sort of functionality clearly needs to be
|
|
60
|
+
# tested in
|
|
61
|
+
@operation.committer_name.should == "Core Team Guy"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
describe "without explicitly specified author name" do
|
|
68
|
+
before do
|
|
69
|
+
# no specific actions for this case! yay!
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "is valid for committing (because default value jumps in)" do
|
|
73
|
+
@operation.should be_valid_for_committing
|
|
74
|
+
@operation.should be_valid(:committing)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "is not valid in default context" do
|
|
78
|
+
# context here is :default
|
|
79
|
+
@operation.should_not be_valid
|
|
80
|
+
@operation.should_not be_valid(:default)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "has default value set" do
|
|
84
|
+
@operation.author_name.should == "Just another Ruby hacker"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe "WITH explicitly specified author name" do
|
|
89
|
+
before do
|
|
90
|
+
@operation.author_name = "Random contributor"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "is valid for committing" do
|
|
94
|
+
@operation.should be_valid_for_committing
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "is not valid in default context" do
|
|
98
|
+
# context here is :default
|
|
99
|
+
@operation.should_not be_valid
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "has value set" do
|
|
103
|
+
@operation.author_name.should == "Random contributor"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
describe "with empty committer name" do
|
|
108
|
+
before do
|
|
109
|
+
@operation.committer_name = ""
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "is NOT valid for committing" do
|
|
113
|
+
# empty string is not considered present for
|
|
114
|
+
# a String value
|
|
115
|
+
@operation.should_not be_valid_for_committing
|
|
116
|
+
|
|
117
|
+
# sanity check since this empty vs blank vs nil
|
|
118
|
+
# thing is a shaky ground
|
|
119
|
+
@operation.committer_name = "l33t k0dr"
|
|
120
|
+
@operation.should be_valid_for_committing
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "IS valid for pushing" do
|
|
124
|
+
@operation.should be_valid_for_pushing
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "IS valid for pulling" do
|
|
128
|
+
@operation.should be_valid_for_pulling
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "is not valid in default context" do
|
|
132
|
+
@operation.should_not be_valid
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
describe "with empty author name" do
|
|
138
|
+
before do
|
|
139
|
+
@operation.author_name = ""
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "is NOT valid for committing" do
|
|
143
|
+
# empty string is not considered present for
|
|
144
|
+
# a String value
|
|
145
|
+
@operation.should_not be_valid_for_committing
|
|
146
|
+
|
|
147
|
+
# sanity check since this empty vs blank vs nil
|
|
148
|
+
# thing is a shaky ground
|
|
149
|
+
@operation.author_name = "l33t k0dr"
|
|
150
|
+
@operation.should be_valid_for_committing
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "IS valid for pushing" do
|
|
154
|
+
@operation.should be_valid_for_pushing
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "IS valid for pulling" do
|
|
158
|
+
@operation.should be_valid_for_pulling
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "is not valid in default context" do
|
|
162
|
+
@operation.should_not be_valid
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'integration/required_field_validator/spec_helper'
|
|
3
|
+
|
|
4
|
+
describe 'required_field_validator/text_type_value_spec' do
|
|
5
|
+
|
|
6
|
+
# keep in mind any ScmOperation has a default value for brand property
|
|
7
|
+
# so it is used
|
|
8
|
+
describe 'GitOperation' do
|
|
9
|
+
before :all do
|
|
10
|
+
GitOperation.auto_migrate!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
@operation = GitOperation.new(:network_connection => true,
|
|
15
|
+
:clean_working_copy => true,
|
|
16
|
+
:message => "I did it! I did it!! Hell yeah!!!")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "with empty message" do
|
|
20
|
+
before do
|
|
21
|
+
@operation.message = ""
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "is NOT valid for committing" do
|
|
25
|
+
# empty string is not considered present for
|
|
26
|
+
# a text value
|
|
27
|
+
@operation.should_not be_valid_for_committing
|
|
28
|
+
|
|
29
|
+
# sanity check since this empty vs blank vs nil
|
|
30
|
+
# thing is a shaky ground
|
|
31
|
+
@operation.message = "RUBY ON RAILS CAN SCALE NOW!!! w00t!!!"
|
|
32
|
+
@operation.should be_valid_for_committing
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "IS valid for pushing" do
|
|
36
|
+
@operation.should be_valid_for_pushing
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "IS valid for pulling" do
|
|
40
|
+
@operation.should be_valid_for_pulling
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "is not valid in default context" do
|
|
44
|
+
@operation.should_not be_valid
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
describe "object invalid in default context", :shared => true do
|
|
2
|
+
it "is not valid in default context" do
|
|
3
|
+
@model.should_not be_valid
|
|
4
|
+
@model.should_not be_valid(:default)
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe "object valid in default context", :shared => true do
|
|
9
|
+
it "is valid in default context" do
|
|
10
|
+
@model.should be_valid
|
|
11
|
+
@model.should be_valid(:default)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
describe "valid model", :shared => true do
|
|
2
|
+
before do
|
|
3
|
+
@model.valid?
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
it "is valid" do
|
|
7
|
+
@model.should be_valid
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "has no error messages" do
|
|
11
|
+
@model.errors.should be_empty
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "has empty list of full error messages" do
|
|
15
|
+
@model.errors.full_messages.should be_empty
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "invalid model", :shared => true do
|
|
20
|
+
before do
|
|
21
|
+
@model.valid?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "is NOT valid" do
|
|
25
|
+
@model.should_not be_valid
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "has error messages" do
|
|
29
|
+
@model.errors.should_not be_empty
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "has list of full error messages" do
|
|
33
|
+
@model.errors.full_messages.should_not be_empty
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'integration/uniqueness_validator/spec_helper'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
describe 'uniqueness_validator/uniqueness_validator_spec' do
|
|
6
|
+
|
|
7
|
+
describe 'DataMapper::Validations::Fixtures::Department' do
|
|
8
|
+
before :all do
|
|
9
|
+
DataMapper::Validations::Fixtures::Department.destroy!
|
|
10
|
+
|
|
11
|
+
DataMapper::Validations::Fixtures::Department.create(:name => "HR").should be_saved
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "with unique name" do
|
|
15
|
+
before do
|
|
16
|
+
@model = DataMapper::Validations::Fixtures::Department.new(:name => "R & D")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it_should_behave_like "valid model"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "with a duplicate name" do
|
|
23
|
+
before do
|
|
24
|
+
@model = DataMapper::Validations::Fixtures::Department.new(:name => "HR")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it_should_behave_like "invalid model"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'DataMapper::Validations::Fixtures::Organisation' do
|
|
32
|
+
before :all do
|
|
33
|
+
DataMapper::Validations::Fixtures::Organisation.destroy!
|
|
34
|
+
|
|
35
|
+
@model = DataMapper.repository do
|
|
36
|
+
DataMapper::Validations::Fixtures::Organisation.create(:name => 'Apple', :domain => 'apple.com')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "with missing domain" do
|
|
41
|
+
before do
|
|
42
|
+
@model.domain = nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it_should_behave_like "valid model"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "with a duplicate domain" do
|
|
49
|
+
before do
|
|
50
|
+
@model = DataMapper::Validations::Fixtures::Organisation.new(:name => 'Fake Apple', :domain => 'apple.com')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it_should_behave_like "invalid model"
|
|
54
|
+
|
|
55
|
+
it "has a meaningful error message" do
|
|
56
|
+
@model.valid?
|
|
57
|
+
@model.errors.on(:domain).should == [ 'Domain is already taken' ]
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "shouldn't fail on itself when checking for records with identical fields" do
|
|
62
|
+
@model.name = "Steve Job's Pony Express"
|
|
63
|
+
@model.should be_valid
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe 'DataMapper::Validations::Fixtures::User' do
|
|
68
|
+
before :all do
|
|
69
|
+
DataMapper::Validations::Fixtures::Organisation.destroy!
|
|
70
|
+
DataMapper::Validations::Fixtures::Department.destroy!
|
|
71
|
+
DataMapper::Validations::Fixtures::User.destroy!
|
|
72
|
+
|
|
73
|
+
DataMapper.repository do
|
|
74
|
+
@organization = DataMapper::Validations::Fixtures::Organisation.create(:name => 'Org 101', :domain => '101')
|
|
75
|
+
@dept = DataMapper::Validations::Fixtures::Department.create(:name => 'accounting')
|
|
76
|
+
@user = DataMapper::Validations::Fixtures::User.create(:organisation => @organization, :user_name => 'guy', :department => @dept)
|
|
77
|
+
|
|
78
|
+
@organization.should be_saved
|
|
79
|
+
@dept.should be_saved
|
|
80
|
+
@user.should be_saved
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe "with username not valid across the organization" do
|
|
85
|
+
before do
|
|
86
|
+
@model = DataMapper::Validations::Fixtures::User.new(:organisation => @organization, :user_name => 'guy')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "is not valid for signing up" do
|
|
90
|
+
@model.should_not be_valid_for_signing_up_for_organization_account
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "has a meaningful error message" do
|
|
94
|
+
@model.valid?(:signing_up_for_organization_account)
|
|
95
|
+
@model.errors.on(:user_name).should == [ 'User name is already taken' ]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
describe "with username not valid across the department" do
|
|
101
|
+
before do
|
|
102
|
+
@model = DataMapper::Validations::Fixtures::User.new(:user_name => 'guy', :department => @dept)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "is not valid for setting up the account" do
|
|
106
|
+
@model.should_not be_valid_for_signing_up_for_department_account
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "has a meaningful error message" do
|
|
110
|
+
@model.valid?(:signing_up_for_department_account)
|
|
111
|
+
@model.errors.on(:user_name).should == [ 'User name is already taken' ]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|