ardm-validations 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +51 -0
  5. data/LICENSE +21 -0
  6. data/README.rdoc +122 -0
  7. data/Rakefile +4 -0
  8. data/ardm-validations.gemspec +28 -0
  9. data/lib/ardm-validations.rb +1 -0
  10. data/lib/dm-validations.rb +169 -0
  11. data/lib/dm-validations/auto_validate.rb +252 -0
  12. data/lib/dm-validations/context.rb +66 -0
  13. data/lib/dm-validations/contextual_validators.rb +220 -0
  14. data/lib/dm-validations/exceptions.rb +5 -0
  15. data/lib/dm-validations/formats/email.rb +65 -0
  16. data/lib/dm-validations/formats/url.rb +27 -0
  17. data/lib/dm-validations/support/object.rb +18 -0
  18. data/lib/dm-validations/support/ordered_hash.rb +434 -0
  19. data/lib/dm-validations/validation_errors.rb +137 -0
  20. data/lib/dm-validations/validators/absent_field_validator.rb +58 -0
  21. data/lib/dm-validations/validators/acceptance_validator.rb +79 -0
  22. data/lib/dm-validations/validators/block_validator.rb +61 -0
  23. data/lib/dm-validations/validators/confirmation_validator.rb +92 -0
  24. data/lib/dm-validations/validators/format_validator.rb +124 -0
  25. data/lib/dm-validations/validators/generic_validator.rb +184 -0
  26. data/lib/dm-validations/validators/length_validator.rb +249 -0
  27. data/lib/dm-validations/validators/method_validator.rb +64 -0
  28. data/lib/dm-validations/validators/numeric_validator.rb +182 -0
  29. data/lib/dm-validations/validators/primitive_validator.rb +58 -0
  30. data/lib/dm-validations/validators/required_field_validator.rb +83 -0
  31. data/lib/dm-validations/validators/uniqueness_validator.rb +67 -0
  32. data/lib/dm-validations/validators/within_validator.rb +74 -0
  33. data/lib/dm-validations/version.rb +5 -0
  34. data/spec/fixtures/barcode.rb +40 -0
  35. data/spec/fixtures/basketball_court.rb +58 -0
  36. data/spec/fixtures/basketball_player.rb +34 -0
  37. data/spec/fixtures/beta_tester_account.rb +33 -0
  38. data/spec/fixtures/bill_of_landing.rb +47 -0
  39. data/spec/fixtures/boat_dock.rb +26 -0
  40. data/spec/fixtures/city.rb +24 -0
  41. data/spec/fixtures/company.rb +93 -0
  42. data/spec/fixtures/corporate_world.rb +39 -0
  43. data/spec/fixtures/country.rb +24 -0
  44. data/spec/fixtures/ethernet_frame.rb +56 -0
  45. data/spec/fixtures/event.rb +44 -0
  46. data/spec/fixtures/g3_concert.rb +57 -0
  47. data/spec/fixtures/jabberwock.rb +27 -0
  48. data/spec/fixtures/kayak.rb +28 -0
  49. data/spec/fixtures/lernean_hydra.rb +39 -0
  50. data/spec/fixtures/llama_spaceship.rb +15 -0
  51. data/spec/fixtures/mathematical_function.rb +34 -0
  52. data/spec/fixtures/memory_object.rb +30 -0
  53. data/spec/fixtures/mittelschnauzer.rb +39 -0
  54. data/spec/fixtures/motor_launch.rb +21 -0
  55. data/spec/fixtures/multibyte.rb +16 -0
  56. data/spec/fixtures/page.rb +32 -0
  57. data/spec/fixtures/phone_number.rb +28 -0
  58. data/spec/fixtures/pirogue.rb +28 -0
  59. data/spec/fixtures/programming_language.rb +83 -0
  60. data/spec/fixtures/reservation.rb +38 -0
  61. data/spec/fixtures/scm_operation.rb +56 -0
  62. data/spec/fixtures/sms_message.rb +22 -0
  63. data/spec/fixtures/udp_packet.rb +49 -0
  64. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  65. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  66. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  67. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  68. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  69. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  70. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  71. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  72. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  73. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  74. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  75. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  76. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  77. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +52 -0
  78. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +39 -0
  79. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  80. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  81. data/spec/integration/block_validator/spec_helper.rb +5 -0
  82. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  83. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  84. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  85. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  86. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  87. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  88. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  89. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  90. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  91. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  92. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  93. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  94. data/spec/integration/format_validator/spec_helper.rb +5 -0
  95. data/spec/integration/format_validator/url_format_validator_spec.rb +93 -0
  96. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  97. data/spec/integration/length_validator/equality_spec.rb +87 -0
  98. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  99. data/spec/integration/length_validator/maximum_spec.rb +49 -0
  100. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  101. data/spec/integration/length_validator/range_spec.rb +87 -0
  102. data/spec/integration/length_validator/spec_helper.rb +7 -0
  103. data/spec/integration/method_validator/method_validator_spec.rb +241 -0
  104. data/spec/integration/method_validator/spec_helper.rb +5 -0
  105. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  106. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  107. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  108. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  109. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  110. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  111. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  112. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  113. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  114. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  115. data/spec/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  116. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  117. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  118. data/spec/integration/required_field_validator/association_spec.rb +72 -0
  119. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +155 -0
  120. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  121. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  122. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  123. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  124. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  125. data/spec/integration/required_field_validator/shared_examples.rb +26 -0
  126. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  127. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  128. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  129. data/spec/integration/shared/default_validation_context.rb +13 -0
  130. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  131. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  132. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  133. data/spec/integration/within_validator/spec_helper.rb +5 -0
  134. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  135. data/spec/public/resource_spec.rb +105 -0
  136. data/spec/rcov.opts +6 -0
  137. data/spec/spec.opts +4 -0
  138. data/spec/spec_helper.rb +29 -0
  139. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  140. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  141. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  142. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  143. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  144. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  145. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  146. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  147. data/spec/unit/validation_errors/reading_spec.rb +35 -0
  148. data/spec/unit/validation_errors/respond_to_spec.rb +15 -0
  149. data/spec/unit/validators/within_validator_spec.rb +23 -0
  150. data/tasks/spec.rake +38 -0
  151. data/tasks/yard.rake +9 -0
  152. data/tasks/yardstick.rake +19 -0
  153. metadata +256 -0
@@ -0,0 +1,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,7 @@
1
+ # make sure you check out spec/fixtures to see fixture models
2
+ # already written
3
+ #
4
+ # DataMapper developers feels strongly against foobars in the spec
5
+ # suite
6
+
7
+ require 'integration/required_field_validator/shared_examples'
@@ -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,5 @@
1
+ # make sure you check out spec/fixtures to see fixture models
2
+ # already written
3
+ #
4
+ # DataMapper developers feels strongly against foobars in the spec
5
+ # suite
@@ -0,0 +1,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