aequitas 0.0.1

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 (216) hide show
  1. data/.gitignore +4 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +21 -0
  5. data/README.rdoc +125 -0
  6. data/Rakefile +25 -0
  7. data/VERSION +1 -0
  8. data/aequitas.gemspec +20 -0
  9. data/lib/aequitas.rb +80 -0
  10. data/lib/aequitas/class_methods.rb +26 -0
  11. data/lib/aequitas/context.rb +53 -0
  12. data/lib/aequitas/contextual_rule_set.rb +221 -0
  13. data/lib/aequitas/exceptions.rb +10 -0
  14. data/lib/aequitas/macros.rb +466 -0
  15. data/lib/aequitas/message_transformer.rb +127 -0
  16. data/lib/aequitas/rule.rb +153 -0
  17. data/lib/aequitas/rule/absence.rb +14 -0
  18. data/lib/aequitas/rule/absence/blank.rb +21 -0
  19. data/lib/aequitas/rule/absence/nil.rb +21 -0
  20. data/lib/aequitas/rule/acceptance.rb +36 -0
  21. data/lib/aequitas/rule/block.rb +33 -0
  22. data/lib/aequitas/rule/confirmation.rb +41 -0
  23. data/lib/aequitas/rule/format.rb +81 -0
  24. data/lib/aequitas/rule/format/proc.rb +28 -0
  25. data/lib/aequitas/rule/format/regexp.rb +44 -0
  26. data/lib/aequitas/rule/formats/email.rb +52 -0
  27. data/lib/aequitas/rule/formats/url.rb +14 -0
  28. data/lib/aequitas/rule/guard.rb +51 -0
  29. data/lib/aequitas/rule/length.rb +87 -0
  30. data/lib/aequitas/rule/length/equal.rb +46 -0
  31. data/lib/aequitas/rule/length/maximum.rb +46 -0
  32. data/lib/aequitas/rule/length/minimum.rb +46 -0
  33. data/lib/aequitas/rule/length/range.rb +46 -0
  34. data/lib/aequitas/rule/method.rb +31 -0
  35. data/lib/aequitas/rule/numericalness.rb +85 -0
  36. data/lib/aequitas/rule/numericalness/equal.rb +30 -0
  37. data/lib/aequitas/rule/numericalness/greater_than.rb +30 -0
  38. data/lib/aequitas/rule/numericalness/greater_than_or_equal.rb +30 -0
  39. data/lib/aequitas/rule/numericalness/integer.rb +37 -0
  40. data/lib/aequitas/rule/numericalness/less_than.rb +30 -0
  41. data/lib/aequitas/rule/numericalness/less_than_or_equal.rb +30 -0
  42. data/lib/aequitas/rule/numericalness/non_integer.rb +64 -0
  43. data/lib/aequitas/rule/numericalness/not_equal.rb +30 -0
  44. data/lib/aequitas/rule/presence.rb +14 -0
  45. data/lib/aequitas/rule/presence/not_blank.rb +21 -0
  46. data/lib/aequitas/rule/presence/not_nil.rb +21 -0
  47. data/lib/aequitas/rule/primitive_type.rb +28 -0
  48. data/lib/aequitas/rule/skip_condition.rb +104 -0
  49. data/lib/aequitas/rule/within.rb +28 -0
  50. data/lib/aequitas/rule/within/range.rb +53 -0
  51. data/lib/aequitas/rule/within/range/bounded.rb +25 -0
  52. data/lib/aequitas/rule/within/range/unbounded_begin.rb +25 -0
  53. data/lib/aequitas/rule/within/range/unbounded_end.rb +25 -0
  54. data/lib/aequitas/rule/within/set.rb +39 -0
  55. data/lib/aequitas/rule_set.rb +80 -0
  56. data/lib/aequitas/support/blank.rb +22 -0
  57. data/lib/aequitas/support/equalizable.rb +113 -0
  58. data/lib/aequitas/support/ordered_hash.rb +438 -0
  59. data/lib/aequitas/version.rb +5 -0
  60. data/lib/aequitas/violation.rb +116 -0
  61. data/lib/aequitas/violation_set.rb +123 -0
  62. data/lib/aequitas/virtus.rb +29 -0
  63. data/lib/aequitas/virtus/inline_attribute_rule_extractor.rb +41 -0
  64. data/lib/aequitas/virtus/inline_attribute_rule_extractor/boolean.rb +17 -0
  65. data/lib/aequitas/virtus/inline_attribute_rule_extractor/object.rb +25 -0
  66. data/lib/aequitas/virtus/inline_attribute_rule_extractor/string.rb +27 -0
  67. data/spec/integration/aequitas/macros/validates_absence_of_spec.rb +19 -0
  68. data/spec/integration/aequitas/macros/validates_acceptance_of_spec.rb +19 -0
  69. data/spec/integration/aequitas/macros/validates_confirmation_of_spec.rb +25 -0
  70. data/spec/integration/aequitas/macros/validates_format_of_spec.rb +87 -0
  71. data/spec/integration/aequitas/macros/validates_length_of.rb +77 -0
  72. data/spec/integration/aequitas/macros/validates_numericalness_of_spec.rb +221 -0
  73. data/spec/integration/aequitas/macros/validates_presence_of_spec.rb +19 -0
  74. data/spec/integration/aequitas/macros/validates_with_block.rb +23 -0
  75. data/spec/integration/aequitas/macros/validates_with_method.rb +19 -0
  76. data/spec/integration/aequitas/macros/validates_within.rb +87 -0
  77. data/spec/integration/shared/macros/integration_spec.rb +67 -0
  78. data/spec/integration/virtus/boolean/presence_spec.rb +49 -0
  79. data/spec/integration/virtus/string/format/email_address_spec.rb +55 -0
  80. data/spec/integration/virtus/string/format/regexp_spec.rb +55 -0
  81. data/spec/integration/virtus/string/format/url_spec.rb +55 -0
  82. data/spec/integration/virtus/string/length/equal_spec.rb +49 -0
  83. data/spec/integration/virtus/string/length/range_spec.rb +49 -0
  84. data/spec/integration/virtus/string/presence_spec.rb +49 -0
  85. data/spec/rcov.opts +6 -0
  86. data/spec/spec_helper.rb +5 -0
  87. data/spec/suite.rb +5 -0
  88. data/spec/unit/aequitas/rule/absence/blank_spec.rb +45 -0
  89. data/spec/unit/aequitas/rule/acceptance_spec.rb +71 -0
  90. data/spec/unit/aequitas/rule/confirmation_spec.rb +80 -0
  91. data/spec/unit/aequitas/rule/guard_spec.rb +120 -0
  92. data/spec/unit/aequitas/rule/skip_condition_spec.rb +170 -0
  93. data/spec/unit/aequitas/rule_spec.rb +40 -0
  94. data/spec/unit/aequitas/support/blank_spec.rb +83 -0
  95. data/spec/unit/aequitas/support/equalizable/equalizer_spec.rb +21 -0
  96. data/spec/unit/aequitas/support/equalizable_spec.rb +67 -0
  97. data/spec/unit/aequitas/violation_set_spec.rb +154 -0
  98. data/spec_legacy/fixtures/barcode.rb +40 -0
  99. data/spec_legacy/fixtures/basketball_court.rb +58 -0
  100. data/spec_legacy/fixtures/basketball_player.rb +34 -0
  101. data/spec_legacy/fixtures/beta_tester_account.rb +33 -0
  102. data/spec_legacy/fixtures/bill_of_landing.rb +47 -0
  103. data/spec_legacy/fixtures/boat_dock.rb +26 -0
  104. data/spec_legacy/fixtures/city.rb +24 -0
  105. data/spec_legacy/fixtures/company.rb +93 -0
  106. data/spec_legacy/fixtures/corporate_world.rb +39 -0
  107. data/spec_legacy/fixtures/country.rb +24 -0
  108. data/spec_legacy/fixtures/ethernet_frame.rb +56 -0
  109. data/spec_legacy/fixtures/event.rb +44 -0
  110. data/spec_legacy/fixtures/g3_concert.rb +57 -0
  111. data/spec_legacy/fixtures/jabberwock.rb +27 -0
  112. data/spec_legacy/fixtures/kayak.rb +28 -0
  113. data/spec_legacy/fixtures/lernean_hydra.rb +39 -0
  114. data/spec_legacy/fixtures/llama_spaceship.rb +15 -0
  115. data/spec_legacy/fixtures/mathematical_function.rb +34 -0
  116. data/spec_legacy/fixtures/memory_object.rb +30 -0
  117. data/spec_legacy/fixtures/mittelschnauzer.rb +39 -0
  118. data/spec_legacy/fixtures/motor_launch.rb +21 -0
  119. data/spec_legacy/fixtures/multibyte.rb +16 -0
  120. data/spec_legacy/fixtures/page.rb +32 -0
  121. data/spec_legacy/fixtures/phone_number.rb +28 -0
  122. data/spec_legacy/fixtures/pirogue.rb +28 -0
  123. data/spec_legacy/fixtures/programming_language.rb +83 -0
  124. data/spec_legacy/fixtures/reservation.rb +38 -0
  125. data/spec_legacy/fixtures/scm_operation.rb +56 -0
  126. data/spec_legacy/fixtures/sms_message.rb +22 -0
  127. data/spec_legacy/fixtures/udp_packet.rb +49 -0
  128. data/spec_legacy/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  129. data/spec_legacy/integration/absent_field_validator/spec_helper.rb +7 -0
  130. data/spec_legacy/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  131. data/spec_legacy/integration/acceptance_validator/spec_helper.rb +7 -0
  132. data/spec_legacy/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  133. data/spec_legacy/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  134. data/spec_legacy/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  135. data/spec_legacy/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  136. data/spec_legacy/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  137. data/spec_legacy/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  138. data/spec_legacy/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  139. data/spec_legacy/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  140. data/spec_legacy/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  141. data/spec_legacy/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +48 -0
  142. data/spec_legacy/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
  143. data/spec_legacy/integration/automatic_validation/spec_helper.rb +57 -0
  144. data/spec_legacy/integration/block_validator/block_validator_spec.rb +32 -0
  145. data/spec_legacy/integration/block_validator/spec_helper.rb +5 -0
  146. data/spec_legacy/integration/conditional_validation/if_condition_spec.rb +63 -0
  147. data/spec_legacy/integration/conditional_validation/spec_helper.rb +5 -0
  148. data/spec_legacy/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  149. data/spec_legacy/integration/confirmation_validator/spec_helper.rb +5 -0
  150. data/spec_legacy/integration/datamapper_models/association_validation_spec.rb +29 -0
  151. data/spec_legacy/integration/datamapper_models/inheritance_spec.rb +82 -0
  152. data/spec_legacy/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  153. data/spec_legacy/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  154. data/spec_legacy/integration/duplicated_validations/spec_helper.rb +5 -0
  155. data/spec_legacy/integration/format_validator/email_format_validator_spec.rb +139 -0
  156. data/spec_legacy/integration/format_validator/format_validator_spec.rb +64 -0
  157. data/spec_legacy/integration/format_validator/regexp_validator_spec.rb +33 -0
  158. data/spec_legacy/integration/format_validator/spec_helper.rb +5 -0
  159. data/spec_legacy/integration/format_validator/url_format_validator_spec.rb +93 -0
  160. data/spec_legacy/integration/length_validator/default_value_spec.rb +14 -0
  161. data/spec_legacy/integration/length_validator/equality_spec.rb +87 -0
  162. data/spec_legacy/integration/length_validator/error_message_spec.rb +22 -0
  163. data/spec_legacy/integration/length_validator/maximum_spec.rb +49 -0
  164. data/spec_legacy/integration/length_validator/minimum_spec.rb +54 -0
  165. data/spec_legacy/integration/length_validator/range_spec.rb +87 -0
  166. data/spec_legacy/integration/length_validator/spec_helper.rb +7 -0
  167. data/spec_legacy/integration/method_validator/method_validator_spec.rb +242 -0
  168. data/spec_legacy/integration/method_validator/spec_helper.rb +5 -0
  169. data/spec_legacy/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  170. data/spec_legacy/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  171. data/spec_legacy/integration/numeric_validator/float_type_spec.rb +90 -0
  172. data/spec_legacy/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  173. data/spec_legacy/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  174. data/spec_legacy/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  175. data/spec_legacy/integration/numeric_validator/integer_type_spec.rb +86 -0
  176. data/spec_legacy/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  177. data/spec_legacy/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  178. data/spec_legacy/integration/numeric_validator/spec_helper.rb +5 -0
  179. data/spec_legacy/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  180. data/spec_legacy/integration/primitive_validator/spec_helper.rb +5 -0
  181. data/spec_legacy/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  182. data/spec_legacy/integration/required_field_validator/association_spec.rb +69 -0
  183. data/spec_legacy/integration/required_field_validator/boolean_type_value_spec.rb +164 -0
  184. data/spec_legacy/integration/required_field_validator/date_type_value_spec.rb +127 -0
  185. data/spec_legacy/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  186. data/spec_legacy/integration/required_field_validator/float_type_value_spec.rb +131 -0
  187. data/spec_legacy/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  188. data/spec_legacy/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  189. data/spec_legacy/integration/required_field_validator/shared_examples.rb +26 -0
  190. data/spec_legacy/integration/required_field_validator/spec_helper.rb +7 -0
  191. data/spec_legacy/integration/required_field_validator/string_type_value_spec.rb +167 -0
  192. data/spec_legacy/integration/required_field_validator/text_type_value_spec.rb +49 -0
  193. data/spec_legacy/integration/shared/default_validation_context.rb +13 -0
  194. data/spec_legacy/integration/shared/valid_and_invalid_model.rb +35 -0
  195. data/spec_legacy/integration/uniqueness_validator/spec_helper.rb +5 -0
  196. data/spec_legacy/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  197. data/spec_legacy/integration/within_validator/spec_helper.rb +5 -0
  198. data/spec_legacy/integration/within_validator/within_validator_spec.rb +168 -0
  199. data/spec_legacy/public/resource_spec.rb +105 -0
  200. data/spec_legacy/spec.opts +4 -0
  201. data/spec_legacy/spec_helper.rb +29 -0
  202. data/spec_legacy/unit/contextual_validators/emptiness_spec.rb +50 -0
  203. data/spec_legacy/unit/contextual_validators/execution_spec.rb +48 -0
  204. data/spec_legacy/unit/contextual_validators/spec_helper.rb +37 -0
  205. data/spec_legacy/unit/generic_validator/equality_operator_spec.rb +26 -0
  206. data/spec_legacy/unit/generic_validator/optional_spec.rb +54 -0
  207. data/spec_legacy/unit/validators/within_validator_spec.rb +23 -0
  208. data/spec_legacy/unit/violation_set/adding_spec.rb +54 -0
  209. data/spec_legacy/unit/violation_set/emptiness_spec.rb +38 -0
  210. data/spec_legacy/unit/violation_set/enumerable_spec.rb +32 -0
  211. data/spec_legacy/unit/violation_set/reading_spec.rb +35 -0
  212. data/spec_legacy/unit/violation_set/respond_to_spec.rb +15 -0
  213. data/tasks/spec.rake +38 -0
  214. data/tasks/yard.rake +9 -0
  215. data/tasks/yardstick.rake +19 -0
  216. metadata +302 -0
@@ -0,0 +1,40 @@
1
+ require_relative '../../spec_helper'
2
+ require 'aequitas/rule'
3
+
4
+ module Aequitas
5
+ describe Rule do
6
+ let(:rule) { Rule.new(attribute_name, options) }
7
+ let(:attribute_name) { :foo }
8
+ let(:options) { Hash.new }
9
+
10
+ describe '#initialize' do
11
+ it 'sets #attribute_name to the first arg' do
12
+ attribute_name = :foo
13
+ assert_same attribute_name, Rule.new(attribute_name).attribute_name
14
+ end
15
+
16
+ it 'sets #custom_message to the :message option' do
17
+ message = 'foo'
18
+ assert_same message, Rule.new(:bar, message: message).custom_message
19
+ end
20
+
21
+ it 'initializes #guard with the :if and :unless options' do
22
+ expected_guard = Rule::Guard.new(if: :a, unless: :b)
23
+ assert_equal expected_guard, Rule.new(:bar, if: :a, unless: :b).guard
24
+ end
25
+ end
26
+
27
+ describe '#validate' do
28
+
29
+ end
30
+
31
+ describe '#execute?' do
32
+
33
+ end
34
+
35
+ describe '#skip?' do
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,83 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'aequitas/support/blank'
3
+
4
+ module Aequitas
5
+ describe '.blank?' do
6
+ it 'returns true when testing nil' do
7
+ assert_operator Aequitas, :blank?, nil
8
+ end
9
+
10
+ it 'returns true when testing false' do
11
+ assert_operator Aequitas, :blank?, false
12
+ end
13
+
14
+ it 'returns false when testing a Numeric' do
15
+ refute_operator Aequitas, :blank?, 1
16
+ end
17
+
18
+ it 'returns false when testing true' do
19
+ refute_operator Aequitas, :blank?, true
20
+ end
21
+
22
+ it 'returns true when testing an empty Hash' do
23
+ assert_operator Aequitas, :blank?, {}
24
+ end
25
+
26
+ it 'returns true when testing an empty Array' do
27
+ assert_operator Aequitas, :blank?, []
28
+ end
29
+
30
+ it 'returns false when testing an non-empty Hash' do
31
+ refute_operator Aequitas, :blank?, { foo: :bar }
32
+ end
33
+
34
+ it 'returns false when testing an non-empty Array' do
35
+ refute_operator Aequitas, :blank?, [:foo]
36
+ end
37
+
38
+ it 'returns true when testing an empty String' do
39
+ assert_operator Aequitas, :blank?, ''
40
+ end
41
+
42
+ it 'returns true when testing a String with only whitespace' do
43
+ assert_operator Aequitas, :blank?, "\n"
44
+ end
45
+
46
+ it 'returns false when testing a non-empty String' do
47
+ refute_operator Aequitas, :blank?, 'target'
48
+ end
49
+
50
+ it 'returns true when #nil? is true for the argument' do
51
+ target = MiniTest::Mock.new
52
+ target.expect(:nil?, true)
53
+ assert_operator Aequitas, :blank?, target
54
+ end
55
+
56
+ it 'returns false when #nil? is false for the argument' do
57
+ target = MiniTest::Mock.new
58
+ target.expect(:nil?, false)
59
+ refute_operator Aequitas, :blank?, target
60
+ end
61
+
62
+ it 'returns false when #nil? is false and the argument does not respond to #empty?' do
63
+ target = MiniTest::Mock.new
64
+ target.expect(:nil?, false)
65
+ refute_operator Aequitas, :blank?, target
66
+ end
67
+
68
+ it 'returns false when #nil? is false and the argument is not empty' do
69
+ target = MiniTest::Mock.new
70
+ target.expect(:nil?, false)
71
+ target.expect(:empty?, false)
72
+ refute_operator Aequitas, :blank?, target
73
+ end
74
+
75
+ it 'returns true when #nil? is false and the argument is empty' do
76
+ target = MiniTest::Mock.new
77
+ target.expect(:nil?, false)
78
+ target.expect(:empty?, true)
79
+ assert_operator Aequitas, :blank?, target
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../../../../spec_helper'
2
+ require 'aequitas/support/equalizable'
3
+
4
+ module Aequitas
5
+ describe Equalizable::Equalizer do
6
+ let(:equalizer) { Equalizable::Equalizer.new(keys) }
7
+ let(:keys) { [:a, :b, :c] }
8
+
9
+ describe '#initialize' do
10
+ it "doesn't raise" do
11
+ assert_kind_of Equalizable::Equalizer, equalizer
12
+ end
13
+ end
14
+
15
+ describe '#keys' do
16
+ it 'returns the values that the Equalizer was initialized with' do
17
+ assert_equal [:a, :b, :c], equalizer.keys
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'aequitas/support/equalizable'
3
+
4
+ module Aequitas
5
+ describe Equalizable do
6
+ let(:equalizable_test_class) do
7
+ Class.new do
8
+ extend Equalizable
9
+
10
+ equalize_on :foo, :bar
11
+
12
+ attr_reader :foo, :bar, :baz
13
+
14
+ def initialize(foo, bar, baz)
15
+ @foo, @bar, @baz = foo, bar, baz
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '.equalizer' do
21
+ it 'returns the Equalizer module for the class' do
22
+ assert_instance_of Equalizable::Equalizer,
23
+ equalizable_test_class.equalizer
24
+ end
25
+ end
26
+
27
+ describe '.equalizer.keys' do
28
+ it 'returns the keys that the class is equalized on' do
29
+ assert_equal [:foo, :bar], equalizable_test_class.equalizer.keys
30
+ end
31
+ end
32
+
33
+ describe 'when all equalized attributes are the same' do
34
+ let(:first) { equalizable_test_class.new(:a, :b, :c) }
35
+ let(:second) { equalizable_test_class.new(:a, :b, :d) }
36
+
37
+ describe '#eql?' do
38
+ it 'returns true' do
39
+ assert first.eql?(second), 'expected first.eql?(second) to be true'
40
+ end
41
+ end
42
+
43
+ describe '#==' do
44
+ it 'returns true' do
45
+ assert_equal first, second
46
+ end
47
+ end
48
+ end
49
+
50
+ describe 'when an equalized attribute is different' do
51
+ let(:first) { equalizable_test_class.new(:a, :b, :c) }
52
+ let(:second) { equalizable_test_class.new(:a, :c, :d) }
53
+
54
+ describe '#eql?' do
55
+ it 'returns false' do
56
+ refute first.eql?(second), 'expected first.eql?(second) to be false'
57
+ end
58
+ end
59
+
60
+ describe '#==' do
61
+ it 'returns false' do
62
+ refute_equal first, second
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,154 @@
1
+ require_relative '../../spec_helper'
2
+ require 'aequitas/violation_set'
3
+
4
+ module Aequitas
5
+ describe ViolationSet do
6
+ let(:object) { Object.new }
7
+ let(:violation_set) { ViolationSet.new(object) }
8
+
9
+ describe '#initialize' do
10
+ it 'does not raise any errors' do
11
+ # TODO: implement JUnit-style #assert_that and matchers:
12
+ # assert_that violation_set, is(:kind_of?, ViolationSet)
13
+ assert_kind_of ViolationSet, violation_set
14
+ end
15
+ end
16
+
17
+ describe '#on' do
18
+ let(:violation) { Violation.new(object, 'message', nil, :attribute) }
19
+
20
+ it 'returns nil when no error is present on the requested attribute' do
21
+ assert_nil violation_set.on(:foo)
22
+ end
23
+
24
+ describe 'after adding a message via a symbol attribute name' do
25
+ it 'returns the message that was added (as a Violation)' do
26
+ violation_set.add(:attribute, 'message')
27
+
28
+ assert_equal [violation], violation_set.on(:attribute)
29
+ end
30
+ end
31
+
32
+ describe 'after adding a message via a string attribute name' do
33
+ it 'returns the message that was added when accessed via symbol' do
34
+ skip 'convert to handling attribute names as strings'
35
+ violation_set.add('attribute', 'message')
36
+
37
+ assert_equal [violation], violation_set.on('attribute')
38
+ # assert_equal [violation], violation_set.on(:attribute)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '#add' do
44
+ let(:violation_1) { Violation.new(object, 'message 1', nil, :attribute) }
45
+ let(:violation_2) { Violation.new(object, 'message 2', nil, :attribute) }
46
+
47
+ it 'returns the receiver' do
48
+ # assert_that violation_set.add(:foo, 'message'), is(:equal?, violation_set)
49
+ assert_same violation_set, violation_set.add(:foo, 'message')
50
+ end
51
+
52
+ describe 'after adding a single message' do
53
+ it 'is is accessible via #on' do
54
+ violation_set.add(violation_1.attribute_name, violation_1.custom_message)
55
+
56
+ assert_equal [violation_1], violation_set.on(violation_1.attribute_name)
57
+ end
58
+ end
59
+
60
+ describe 'after adding a single Violation' do
61
+ it 'is is accessible via #on' do
62
+ violation_set.add(violation_1)
63
+
64
+ assert_equal [violation_1], violation_set.on(:attribute)
65
+ end
66
+ end
67
+
68
+ describe 'after adding a second message' do
69
+ it 'returns the violations via #on in the order they were added' do
70
+ violation_set.add(violation_1.attribute_name, violation_1.custom_message)
71
+ violation_set.add(violation_2.attribute_name, violation_2.custom_message)
72
+
73
+ assert_equal [violation_1, violation_2], violation_set.on(:attribute)
74
+ end
75
+ end
76
+
77
+ describe 'after adding the same message twice' do
78
+ it 'returns a single instance of that message via #on' do
79
+ violation_set.add(:attribute, 'message')
80
+ violation_set.add(:attribute, 'message')
81
+
82
+ assert_equal violation_set.on(:attribute), ['message']
83
+ end
84
+ end
85
+
86
+ describe 'after adding a second Violation' do
87
+ it 'returns the violations via #on in the order they were added' do
88
+ violation_set.add(violation_1)
89
+ violation_set.add(violation_2)
90
+
91
+ assert_equal [violation_1, violation_2], violation_set.on(:attribute)
92
+ end
93
+ end
94
+
95
+ describe 'after adding an equivalent Violation twice' do
96
+ let(:violation_1) { Violation.new(object, 'message', nil, :attribute) }
97
+ let(:violation_2) { Violation.new(object, 'message', nil, :attribute) }
98
+
99
+ it 'returns a single instance of that message via #on' do
100
+ violation_set.add(violation_1)
101
+ violation_set.add(violation_2)
102
+
103
+ assert_equal [violation_1], violation_set.on(:attribute)
104
+ end
105
+ end
106
+ end
107
+
108
+ describe '#empty?' do
109
+ it 'is initially true' do
110
+ # TODO: implement JUnit-style #assert_that and matchers
111
+ # assert_that violation_set, is(:empty?)
112
+ assert_predicate violation_set, :empty?
113
+ end
114
+
115
+ describe 'after calling #on' do
116
+ it 'is true' do
117
+ violation_set.on(:attribute)
118
+ assert_predicate violation_set, :empty?
119
+ end
120
+ end
121
+
122
+ describe 'after adding a message' do
123
+ it 'is false' do
124
+ violation_set.add(:attribute, 'message')
125
+ refute_predicate violation_set, :empty?
126
+ end
127
+ end
128
+
129
+ describe 'after adding a Violation' do
130
+ let(:violation) { Violation.new(object, 'message', nil, :attribute) }
131
+
132
+ it 'is false' do
133
+ violation_set.add(violation)
134
+ refute_predicate violation_set, :empty?
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#each' do
140
+ let(:violation_1) { Violation.new(object, 'message 1', nil, :attribute) }
141
+ let(:violation_2) { Violation.new(object, 'message 2', nil, :attribute) }
142
+ let(:violation_3) { Violation.new(object, 'another message', nil, :foo) }
143
+
144
+ it 'iterates over properties and yields error message arrays' do
145
+ violation_set.add(violation_1)
146
+ violation_set.add(violation_2)
147
+ violation_set.add(violation_3)
148
+
149
+ expected = [[violation_1, violation_2], [violation_3]]
150
+ assert_equal expected, violation_set.inject([]) { |mem, var| mem << var }
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,40 @@
1
+ module DataMapper
2
+ module Validation
3
+ module Fixtures
4
+ class Barcode
5
+ attr_accessor :valid_hook_call_count
6
+
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ without_auto_validations do
18
+ property :code, String, :key => true
19
+ end
20
+
21
+ #
22
+ # Validations
23
+ #
24
+
25
+ validates_length_of :code, :max => 10
26
+
27
+ def self.valid_instance
28
+ new(:code => "3600029145")
29
+ end
30
+
31
+ # measure the number of times #valid? is executed
32
+ before :valid? do
33
+ @valid_hook_call_count ||= 0
34
+ @valid_hook_call_count += 1
35
+ end
36
+
37
+ end # Barcode
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validation
5
+ module Fixtures
6
+ class BasketballCourt
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+
19
+ without_auto_validations do
20
+ property :name, String
21
+
22
+ property :length, Float
23
+ property :width, Float
24
+
25
+ property :three_point_line_distance, Float
26
+ property :free_throw_line_distance, Float
27
+ property :rim_height, Float
28
+ end
29
+
30
+ #
31
+ # Validations
32
+ #
33
+
34
+ # obviously these are all metrics
35
+ validates_numericality_of :length, :gte => 15.0, :lte => 15.24
36
+ validates_numericality_of :width, :gte => 25.28, :lte => 28.65
37
+
38
+ # 3 pt line distance may use :gte and :lte, but for
39
+ # sake of spec example we make it up a little
40
+ validates_numericality_of :three_point_line_distance, :gt => 6.7, :lt => 7.24
41
+ validates_numericality_of :free_throw_line_distance, :equals => 4.57
42
+ validates_numericality_of :rim_height, :eq => 3.05
43
+
44
+ def self.valid_instance(overrides = {})
45
+ defaults = {
46
+ :length => 15.24,
47
+ :width => 28.65,
48
+ :free_throw_line_distance => 4.57,
49
+ :rim_height => 3.05,
50
+ :three_point_line_distance => 6.9
51
+ }
52
+
53
+ new(defaults.merge(overrides))
54
+ end
55
+ end
56
+ end # Fixtures
57
+ end # Validations
58
+ end # DataMapper