sbf-dm-validations 1.3.0.beta

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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +38 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +468 -0
  5. data/.travis.yml +51 -0
  6. data/Gemfile +60 -0
  7. data/LICENSE +21 -0
  8. data/README.rdoc +122 -0
  9. data/Rakefile +4 -0
  10. data/dm-validations.gemspec +20 -0
  11. data/lib/data_mapper/core.rb +1 -0
  12. data/lib/data_mapper/support/assertions.rb +1 -0
  13. data/lib/data_mapper/support/equalizer.rb +1 -0
  14. data/lib/data_mapper/support/ordered_set.rb +2 -0
  15. data/lib/data_mapper/validation/backward.rb +205 -0
  16. data/lib/data_mapper/validation/context.rb +57 -0
  17. data/lib/data_mapper/validation/contextual_rule_set.rb +210 -0
  18. data/lib/data_mapper/validation/exceptions.rb +7 -0
  19. data/lib/data_mapper/validation/inferred.rb +264 -0
  20. data/lib/data_mapper/validation/macros.rb +449 -0
  21. data/lib/data_mapper/validation/message_transformer.rb +111 -0
  22. data/lib/data_mapper/validation/model_extensions.rb +17 -0
  23. data/lib/data_mapper/validation/resource_extensions.rb +131 -0
  24. data/lib/data_mapper/validation/rule/absence.rb +31 -0
  25. data/lib/data_mapper/validation/rule/acceptance.rb +49 -0
  26. data/lib/data_mapper/validation/rule/block.rb +37 -0
  27. data/lib/data_mapper/validation/rule/confirmation.rb +47 -0
  28. data/lib/data_mapper/validation/rule/format/proc.rb +34 -0
  29. data/lib/data_mapper/validation/rule/format/regexp.rb +51 -0
  30. data/lib/data_mapper/validation/rule/format.rb +86 -0
  31. data/lib/data_mapper/validation/rule/formats/email.rb +54 -0
  32. data/lib/data_mapper/validation/rule/formats/url.rb +13 -0
  33. data/lib/data_mapper/validation/rule/length/equal.rb +48 -0
  34. data/lib/data_mapper/validation/rule/length/maximum.rb +50 -0
  35. data/lib/data_mapper/validation/rule/length/minimum.rb +50 -0
  36. data/lib/data_mapper/validation/rule/length/range.rb +50 -0
  37. data/lib/data_mapper/validation/rule/length.rb +96 -0
  38. data/lib/data_mapper/validation/rule/method.rb +42 -0
  39. data/lib/data_mapper/validation/rule/numericalness/equal.rb +34 -0
  40. data/lib/data_mapper/validation/rule/numericalness/greater_than.rb +34 -0
  41. data/lib/data_mapper/validation/rule/numericalness/greater_than_or_equal.rb +34 -0
  42. data/lib/data_mapper/validation/rule/numericalness/integer.rb +41 -0
  43. data/lib/data_mapper/validation/rule/numericalness/less_than.rb +34 -0
  44. data/lib/data_mapper/validation/rule/numericalness/less_than_or_equal.rb +34 -0
  45. data/lib/data_mapper/validation/rule/numericalness/not_equal.rb +34 -0
  46. data/lib/data_mapper/validation/rule/numericalness/numeric.rb +68 -0
  47. data/lib/data_mapper/validation/rule/numericalness.rb +91 -0
  48. data/lib/data_mapper/validation/rule/presence.rb +52 -0
  49. data/lib/data_mapper/validation/rule/primitive_type.rb +32 -0
  50. data/lib/data_mapper/validation/rule/uniqueness.rb +64 -0
  51. data/lib/data_mapper/validation/rule/within/range/bounded.rb +29 -0
  52. data/lib/data_mapper/validation/rule/within/range/unbounded_begin.rb +29 -0
  53. data/lib/data_mapper/validation/rule/within/range/unbounded_end.rb +29 -0
  54. data/lib/data_mapper/validation/rule/within/range.rb +55 -0
  55. data/lib/data_mapper/validation/rule/within/set.rb +45 -0
  56. data/lib/data_mapper/validation/rule/within.rb +32 -0
  57. data/lib/data_mapper/validation/rule.rb +232 -0
  58. data/lib/data_mapper/validation/rule_set.rb +157 -0
  59. data/lib/data_mapper/validation/support/object.rb +19 -0
  60. data/lib/data_mapper/validation/support/ordered_hash.rb +434 -0
  61. data/lib/data_mapper/validation/version.rb +5 -0
  62. data/lib/data_mapper/validation/violation.rb +136 -0
  63. data/lib/data_mapper/validation/violation_set.rb +115 -0
  64. data/lib/data_mapper/validation.rb +105 -0
  65. data/lib/dm-validations.rb +24 -0
  66. data/spec/data_mapper/validation/resource_extensions/save_spec.rb +56 -0
  67. data/spec/data_mapper/validation/resource_extensions/validate_spec.rb +103 -0
  68. data/spec/fixtures/barcode.rb +40 -0
  69. data/spec/fixtures/basketball_court.rb +58 -0
  70. data/spec/fixtures/basketball_player.rb +34 -0
  71. data/spec/fixtures/beta_tester_account.rb +33 -0
  72. data/spec/fixtures/bill_of_landing.rb +47 -0
  73. data/spec/fixtures/boat_dock.rb +26 -0
  74. data/spec/fixtures/city.rb +24 -0
  75. data/spec/fixtures/company.rb +93 -0
  76. data/spec/fixtures/corporate_world.rb +39 -0
  77. data/spec/fixtures/country.rb +24 -0
  78. data/spec/fixtures/ethernet_frame.rb +56 -0
  79. data/spec/fixtures/event.rb +44 -0
  80. data/spec/fixtures/g3_concert.rb +57 -0
  81. data/spec/fixtures/integer_dumped_as_string_property.rb +24 -0
  82. data/spec/fixtures/jabberwock.rb +27 -0
  83. data/spec/fixtures/kayak.rb +28 -0
  84. data/spec/fixtures/lernean_hydra.rb +39 -0
  85. data/spec/fixtures/llama_spaceship.rb +15 -0
  86. data/spec/fixtures/mathematical_function.rb +34 -0
  87. data/spec/fixtures/memory_object.rb +35 -0
  88. data/spec/fixtures/mittelschnauzer.rb +39 -0
  89. data/spec/fixtures/motor_launch.rb +21 -0
  90. data/spec/fixtures/multibyte.rb +16 -0
  91. data/spec/fixtures/page.rb +32 -0
  92. data/spec/fixtures/phone_number.rb +28 -0
  93. data/spec/fixtures/pirogue.rb +28 -0
  94. data/spec/fixtures/programming_language.rb +83 -0
  95. data/spec/fixtures/reservation.rb +38 -0
  96. data/spec/fixtures/scm_operation.rb +56 -0
  97. data/spec/fixtures/sms_message.rb +22 -0
  98. data/spec/fixtures/udp_packet.rb +49 -0
  99. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  100. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  101. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  102. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  103. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  104. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  105. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  106. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  107. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  108. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  109. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  110. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  111. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  112. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
  113. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
  114. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  115. data/spec/integration/block_validator/spec_helper.rb +5 -0
  116. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  117. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  118. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  119. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  120. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  121. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  122. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  123. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  124. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  125. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  126. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  127. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  128. data/spec/integration/format_validator/spec_helper.rb +5 -0
  129. data/spec/integration/format_validator/url_format_validator_spec.rb +91 -0
  130. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  131. data/spec/integration/length_validator/equality_spec.rb +83 -0
  132. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  133. data/spec/integration/length_validator/maximum_spec.rb +47 -0
  134. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  135. data/spec/integration/length_validator/range_spec.rb +87 -0
  136. data/spec/integration/length_validator/spec_helper.rb +7 -0
  137. data/spec/integration/method_validator/method_validator_spec.rb +243 -0
  138. data/spec/integration/method_validator/spec_helper.rb +5 -0
  139. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  140. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  141. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  142. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  143. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +36 -0
  144. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  145. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  146. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  147. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  148. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  149. data/spec/integration/primitive_validator/primitive_validator_spec.rb +112 -0
  150. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  151. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  152. data/spec/integration/required_field_validator/association_spec.rb +69 -0
  153. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
  154. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  155. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  156. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  157. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  158. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  159. data/spec/integration/required_field_validator/shared_examples.rb +27 -0
  160. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  161. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  162. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  163. data/spec/integration/shared/default_validation_context.rb +13 -0
  164. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  165. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  166. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  167. data/spec/integration/within_validator/spec_helper.rb +5 -0
  168. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  169. data/spec/public/resource_spec.rb +113 -0
  170. data/spec/spec_helper.rb +28 -0
  171. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  172. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  173. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  174. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  175. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  176. data/spec/unit/validators/within_validator_spec.rb +23 -0
  177. data/spec/unit/violation_set/adding_spec.rb +54 -0
  178. data/spec/unit/violation_set/emptiness_spec.rb +38 -0
  179. data/spec/unit/violation_set/enumerable_spec.rb +32 -0
  180. data/spec/unit/violation_set/reading_spec.rb +35 -0
  181. data/spec/unit/violation_set/respond_to_spec.rb +15 -0
  182. data/tasks/spec.rake +21 -0
  183. data/tasks/yard.rake +9 -0
  184. data/tasks/yardstick.rake +19 -0
  185. metadata +245 -0
@@ -0,0 +1,113 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe 'DataMapper::Resource' do
4
+ before :all do
5
+ DataMapper::Validations::Fixtures::Barcode.destroy!
6
+
7
+ @resource = DataMapper::Validations::Fixtures::Barcode.new
8
+ end
9
+
10
+ describe '#update' do
11
+ describe 'when provided valid attributes' do
12
+ before :all do
13
+ @response = @resource.update(:code => 'a' * 10)
14
+ end
15
+
16
+ it 'returns true' do
17
+ expect(@response).to be(true)
18
+ end
19
+ end
20
+
21
+ describe 'when provided invalid attributes' do
22
+ before :all do
23
+ @response = @resource.update(:code => 'a' * 11)
24
+ end
25
+
26
+ it 'returns false' do
27
+ expect(@response).to be(false)
28
+ end
29
+
30
+ it 'sets errors' do
31
+ expect(@resource.errors.to_a).to eq [ [ 'Code must be at most 10 characters long' ] ]
32
+ end
33
+ end
34
+
35
+ describe 'when provided invalid attributes and a context' do
36
+ before :all do
37
+ DataMapper::Validations::Fixtures::Organisation.destroy!
38
+ DataMapper::Validations::Fixtures::Department.destroy!
39
+ DataMapper::Validations::Fixtures::User.destroy!
40
+
41
+ organization = DataMapper::Validations::Fixtures::Organisation.create(:name => 'Org 101', :domain => '101')
42
+ dept = DataMapper::Validations::Fixtures::Department.create(:name => 'accounting')
43
+
44
+ attributes = {
45
+ :organisation => organization,
46
+ :user_name => 'guy',
47
+ :department => dept,
48
+ }
49
+
50
+ # create a record that will be a dupe when User#update is executed below
51
+ expect(DataMapper::Validations::Fixtures::User.create(attributes)).to be_saved
52
+
53
+ @resource = DataMapper::Validations::Fixtures::User.create(attributes.merge(:user_name => 'other'))
54
+
55
+ @response = @resource.update(attributes, :signing_up_for_department_account)
56
+ end
57
+
58
+ it 'returns false' do
59
+ expect(@response).to be(false)
60
+ end
61
+
62
+ it 'sets errors' do
63
+ expect(@resource.errors.to_a).to eq [ [ 'User name is already taken' ] ]
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '#save' do
69
+ before :all do
70
+ @resource.code = 'a' * 10
71
+ @resource.save
72
+ end
73
+
74
+ describe 'on a new, non-dirty resource' do
75
+ it 'calls valid? once' do
76
+ blank = DataMapper::Validations::Fixtures::Barcode.new
77
+ blank.save
78
+ expect(blank.valid_hook_call_count).to eq 1
79
+ end
80
+ end
81
+
82
+ describe 'on a new, dirty resource' do
83
+ it 'calls valid? once' do
84
+ expect(@resource.valid_hook_call_count).to eq 1
85
+ end
86
+ end
87
+
88
+ describe 'on a saved, non-dirty resource' do
89
+ before :all do
90
+ # reload the resource
91
+ @resource = @resource.model.get(*@resource.key)
92
+ @resource.save
93
+ end
94
+
95
+ it 'does not call valid?' do
96
+ expect(@resource.valid_hook_call_count.to_i).to eq 0
97
+ end
98
+ end
99
+
100
+ describe 'on a saved, dirty resource' do
101
+ before :all do
102
+ # reload the resource
103
+ @resource = @resource.model.get(*@resource.key)
104
+ @resource.code = 'b' * 10
105
+ @resource.save
106
+ end
107
+
108
+ it 'calls valid? once' do
109
+ expect(@resource.valid_hook_call_count).to eq 1
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,28 @@
1
+ require 'dm-core/spec/setup'
2
+ require 'dm-core/spec/lib/adapter_helpers'
3
+
4
+ require 'dm-validations'
5
+ require 'dm-types'
6
+ require 'dm-migrations'
7
+
8
+ class Hash
9
+ def except(*keys)
10
+ hash = dup
11
+ keys.each { |key| hash.delete(key) }
12
+ hash
13
+ end
14
+ end
15
+
16
+ Dir["#{File.realpath(File.dirname(__FILE__))}/fixtures/**/*.rb"].sort.each { |file| require file }
17
+ Dir["#{File.realpath(File.dirname(__FILE__))}/integration/shared/**/*.rb"].sort.each { |file| require file }
18
+
19
+ DataMapper::Spec.setup
20
+ DataMapper.finalize
21
+
22
+ RSpec.configure do |config|
23
+ config.extend(DataMapper::Spec::Adapters::Helpers)
24
+
25
+ config.before :suite do
26
+ DataMapper.finalize.auto_migrate!
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+ require_relative 'spec_helper'
4
+
5
+ describe 'DataMapper::Validations::ContextualRuleSet' do
6
+ before :all do
7
+ @validators = DataMapper::Validations::ContextualRuleSet.new
8
+ end
9
+
10
+ describe "initially" do
11
+ it "is empty" do
12
+ expect(@validators).to be_empty
13
+ end
14
+ end
15
+
16
+
17
+ describe "after first reference to context" do
18
+ before :all do
19
+ @validators.context(:create)
20
+ end
21
+
22
+ it "initializes list of validators for referred context" do
23
+ expect(@validators.context(:create)).to be_empty
24
+ end
25
+ end
26
+
27
+
28
+ describe "after a context being added" do
29
+ before :all do
30
+ @validators.context(:default) << DataMapper::Validations::Rule::Presence.new(:toc, :when => [:publishing])
31
+ end
32
+
33
+ it "is no longer empty" do
34
+ expect(@validators).not_to be_empty
35
+ end
36
+ end
37
+
38
+
39
+ describe "when cleared" do
40
+ before :all do
41
+ @validators.context(:default) << DataMapper::Validations::Rule::Presence.new(:toc, :when => [:publishing])
42
+ expect(@validators).not_to be_empty
43
+ @validators.clear
44
+ end
45
+
46
+ it "becomes empty again" do
47
+ expect(@validators).to be_empty
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+ require_relative 'spec_helper'
4
+
5
+ describe 'DataMapper::Validations::ContextualRuleSet' do
6
+ before :all do
7
+ @validators = DataMapper::Validations::ContextualRuleSet.new
8
+ end
9
+
10
+ describe "#execute(name, target)" do
11
+ before do
12
+ @validator_one = DataMapper::Validations::Rule::Presence.new(:name)
13
+ @validator_two = DataMapper::Validations::Rule::Within.new(:operating_system, :set => ["Mac OS X", "Linux", "FreeBSD", "Solaris"])
14
+
15
+ @validators.context(:default) << @validator_one << @validator_two
16
+ end
17
+
18
+
19
+ describe "when target satisfies all validators" do
20
+ before do
21
+ @target = DataMapper::Validations::Fixtures::PieceOfSoftware.new(:name => 'gcc', :operating_system => "Mac OS X")
22
+ expect(@validator_one.call(@target)).to be(true)
23
+ expect(@validator_two.call(@target)).to be(true)
24
+
25
+ @result = @validators.execute(:default, @target)
26
+ end
27
+
28
+ it "returns true" do
29
+ expect(@result).to be(true)
30
+ end
31
+ end
32
+
33
+
34
+ describe "when target does not satisfy all validators" do
35
+ before do
36
+ @target = DataMapper::Validations::Fixtures::PieceOfSoftware.new(:name => 'Skitch', :operating_system => "Haiku")
37
+ expect(@validator_one.call(@target)).to be(true)
38
+ expect(@validator_two.call(@target)).to be(false)
39
+
40
+ @result = @validators.execute(:default, @target)
41
+ end
42
+
43
+ it "returns false" do
44
+ expect(@result).to be(false)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validation
5
+ module Fixtures
6
+
7
+ class PieceOfSoftware
8
+ #
9
+ # Behaviors
10
+ #
11
+
12
+ include DataMapper::Validations
13
+
14
+ #
15
+ # Attributes
16
+ #
17
+
18
+ attr_accessor :name, :operating_system
19
+
20
+ #
21
+ # Validations
22
+ #
23
+
24
+ #
25
+ # API
26
+ #
27
+
28
+ def initialize(attributes = {})
29
+ attributes.each do |key, value|
30
+ self.send("#{key}=", value)
31
+ end
32
+ end
33
+ end
34
+
35
+ end # Fixtures
36
+ end # Validations
37
+ end # DataMapper
@@ -0,0 +1,26 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Rule' do
4
+ describe "when types and fields are equal" do
5
+ it "returns true" do
6
+ DataMapper::Validations::Rule::Presence.new(:name).
7
+ is_expected.to eq DataMapper::Validations::Rule::Presence.new(:name)
8
+ end
9
+ end
10
+
11
+
12
+ describe "when types differ" do
13
+ it "returns false" do
14
+ DataMapper::Validations::Rule::Presence.new(:name).
15
+ is_expected.not_to eq DataMapper::Validations::Rule::Uniqueness.new(:name)
16
+ end
17
+ end
18
+
19
+
20
+ describe "when property names differ" do
21
+ it "returns false" do
22
+ DataMapper::Validations::Rule::Presence.new(:first_name).
23
+ is_expected.not_to eq DataMapper::Validations::Rule::Presence.new(:last_name)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Rule::Generic', '#optional?' do
4
+ def validator(opts = {})
5
+ DataMapper::Validations::Rule::Length.new(:name, opts)
6
+ end
7
+
8
+ describe 'allowing blank' do
9
+ subject do
10
+ validator(
11
+ :allow_blank => true
12
+ )
13
+ end
14
+
15
+ it { expect(subject.optional?("" )).to be }
16
+ it { expect(subject.optional?(nil)).to be }
17
+ end
18
+
19
+ describe 'allowing nil' do
20
+ subject do
21
+ validator(
22
+ :allow_nil => true
23
+ )
24
+ end
25
+
26
+ it { expect(subject.optional?("" )).not_to be }
27
+ it { expect(subject.optional?(nil)).to be }
28
+ end
29
+
30
+ describe 'allowing blank, but now allowing nil' do
31
+ subject do
32
+ validator(
33
+ :allow_blank => true,
34
+ :allow_nil => false
35
+ )
36
+ end
37
+
38
+ it { expect(subject.optional?("" )).to be }
39
+ it { expect(subject.optional?(nil)).not_to be }
40
+ end
41
+
42
+ describe 'allowing nil, but now allowing blank' do
43
+ subject do
44
+ validator(
45
+ :allow_blank => false,
46
+ :allow_nil => true
47
+ )
48
+ end
49
+
50
+ it { expect(subject.optional?("" )).not_to be }
51
+ it { expect(subject.optional?(nil)).to be }
52
+ end
53
+
54
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Rule::Within' do
4
+ it 'allows Sets to be passed to the :set option' do
5
+ types = Set.new(%w(home mobile business))
6
+
7
+ @model = Class.new do
8
+ include DataMapper::Resource
9
+
10
+ def self.name
11
+ 'WithinValidatorClass'
12
+ end
13
+
14
+ property :id, DataMapper::Property::Serial
15
+ property :name, String, :auto_validation => false
16
+ end.new
17
+
18
+ validator = DataMapper::Validations::Rule::Within.new(:name, :set => types)
19
+ validator.call(@model)
20
+
21
+ expect(@model.errors).not_to be_empty
22
+ end
23
+ end
@@ -0,0 +1,54 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+
4
+ describe 'DataMapper::Validations::ViolationSet' do
5
+ before :all do
6
+ @model = DataMapper::Validations::ViolationSet.new(Object.new)
7
+ end
8
+
9
+ describe "after first error being added" do
10
+ before :all do
11
+ @model.add(:property, "can't be valid, no way")
12
+ end
13
+
14
+ it "is no longer empty" do
15
+ expect(@model).not_to be_empty
16
+ end
17
+
18
+ it "adds error message to list of errors for given property name" do
19
+ expect(@model.on(:property)).to eq ["can't be valid, no way"]
20
+ end
21
+ end
22
+
23
+
24
+ describe "after second error being added" do
25
+ before :all do
26
+ @model.add(:property, "can't be valid, no way")
27
+ @model.add(:property, "something else is wrong")
28
+ end
29
+
30
+ it "is no longer empty" do
31
+ expect(@model).not_to be_empty
32
+ end
33
+
34
+ it "appends error message to list of errors for given property name" do
35
+ expect(@model.on(:property)).to eq ["can't be valid, no way", "something else is wrong"]
36
+ end
37
+ end
38
+
39
+
40
+ describe "when duplicate error being added" do
41
+ before :all do
42
+ @model.add(:property, "can't be valid, no way")
43
+ @model.add(:property, "can't be valid, no way")
44
+ end
45
+
46
+ it "is no longer empty" do
47
+ expect(@model).not_to be_empty
48
+ end
49
+
50
+ it "DOES NOT allow duplication" do
51
+ expect(@model.on(:property)).to eq ["can't be valid, no way"]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+
4
+ describe 'DataMapper::Validations::ViolationSet' do
5
+ before :all do
6
+ @model = DataMapper::Validations::ViolationSet.new(Object.new)
7
+ end
8
+
9
+ describe "initially" do
10
+ it "is empty" do
11
+ expect(@model).to be_empty
12
+ end
13
+ end
14
+
15
+ # Not sure if this is worth having at all,
16
+ # just keeping old spec suite bits in place
17
+ # if they make no harm — MK
18
+ describe "after enquiry" do
19
+ before :all do
20
+ @model.on(:property)
21
+ end
22
+
23
+ it "is still empty" do
24
+ expect(@model).to be_empty
25
+ end
26
+ end
27
+
28
+
29
+ describe "after errors being added" do
30
+ before :all do
31
+ @model.add(:property, "can't be valid, no way")
32
+ end
33
+
34
+ it "is no longer empty" do
35
+ expect(@model).not_to be_empty
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+
4
+ describe 'DataMapper::Validations::ViolationSet' do
5
+ before :all do
6
+ @model = DataMapper::Validations::ViolationSet.new(Object.new)
7
+ @model.add(:ip_address, "must have valid format")
8
+ @model.add(:full_name, "can't be blank")
9
+ end
10
+
11
+ describe "#each" do
12
+ it "iterates over properties and yields error message arrays" do
13
+ params = []
14
+ @model.each do |param|
15
+ params << param
16
+ end
17
+
18
+ expect(params).to eq [ [ 'must have valid format' ], [ "can't be blank" ] ]
19
+ end
20
+ end
21
+
22
+
23
+ describe "#map" do
24
+ before :all do
25
+ @model.add(:ip_address, "must belong to a local subnet")
26
+ end
27
+ it "maps error message arrays using provided block" do
28
+ projection = @model.map { |ary| ary }
29
+ expect(projection).to eq [ [ 'must have valid format', 'must belong to a local subnet' ], [ "can't be blank" ] ]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative '../../spec_helper'
3
+
4
+ shared_examples 'a validation error reader' do
5
+ context 'and that property has no associated errors' do
6
+ it 'returns an empty array' do
7
+ expect(@errors[@property]).to eq []
8
+ end
9
+ end
10
+ context 'and that property has associated error(s)' do
11
+ it 'returns a non empty array' do
12
+ @errors.add(@property.to_sym, 'invalid')
13
+ expect(@errors[@property]).not_to be_empty
14
+ end
15
+ end
16
+ end
17
+
18
+ describe 'DataMapper::Validations::ViolationSet' do
19
+ describe '[]' do
20
+ describe 'when passing the argument as a String' do
21
+ before(:each) do
22
+ @errors = DataMapper::Validations::ViolationSet.new(Object.new)
23
+ @property = 'name'
24
+ end
25
+ it_behaves_like 'a validation error reader'
26
+ end
27
+ describe 'when passing the argument as a Symbol' do
28
+ before(:each) do
29
+ @errors = DataMapper::Validations::ViolationSet.new(Object.new)
30
+ @property = :name
31
+ end
32
+ it_behaves_like 'a validation error reader'
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'DataMapper::Validations::ViolationSet#respond_to?' do
4
+
5
+ subject { DataMapper::Validations::ViolationSet.new(Object.new) }
6
+
7
+ it 'looks for the method in self' do
8
+ expect(subject).to respond_to(:full_messages)
9
+ end
10
+
11
+ it 'delegates lookup to the underlying errors hash' do
12
+ expect(subject).to respond_to(:size)
13
+ end
14
+
15
+ end
data/tasks/spec.rake ADDED
@@ -0,0 +1,21 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ begin
4
+ task(:default).clear
5
+ task(:spec).clear
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = 'spec/**/*_spec.rb'
9
+
10
+ require 'simplecov'
11
+ SimpleCov.start do
12
+ minimum_coverage 100
13
+ end
14
+ end
15
+ rescue LoadError
16
+ task :spec do
17
+ abort 'rspec is not available. In order to run spec, you must: gem install rspec'
18
+ end
19
+ end
20
+
21
+ task default: :spec
data/tasks/yard.rake ADDED
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'yard'
3
+
4
+ YARD::Rake::YardocTask.new
5
+ rescue LoadError
6
+ task :yard do
7
+ abort 'YARD is not available. In order to run yard, you must: gem install yard'
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ begin
2
+ require 'pathname'
3
+ require 'yardstick/rake/measurement'
4
+ require 'yardstick/rake/verify'
5
+
6
+ # yardstick_measure task
7
+ Yardstick::Rake::Measurement.new
8
+
9
+ # verify_measurements task
10
+ Yardstick::Rake::Verify.new do |verify|
11
+ verify.threshold = 100
12
+ end
13
+ rescue LoadError
14
+ %w[ yardstick_measure verify_measurements ].each do |name|
15
+ task name.to_s do
16
+ abort "Yardstick is not available. In order to run #{name}, you must: gem install yardstick"
17
+ end
18
+ end
19
+ end