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.
- checksums.yaml +7 -0
- data/.gitignore +38 -0
- data/.rspec +1 -0
- data/.rubocop.yml +468 -0
- data/.travis.yml +51 -0
- data/Gemfile +60 -0
- data/LICENSE +21 -0
- data/README.rdoc +122 -0
- data/Rakefile +4 -0
- data/dm-validations.gemspec +20 -0
- data/lib/data_mapper/core.rb +1 -0
- data/lib/data_mapper/support/assertions.rb +1 -0
- data/lib/data_mapper/support/equalizer.rb +1 -0
- data/lib/data_mapper/support/ordered_set.rb +2 -0
- data/lib/data_mapper/validation/backward.rb +205 -0
- data/lib/data_mapper/validation/context.rb +57 -0
- data/lib/data_mapper/validation/contextual_rule_set.rb +210 -0
- data/lib/data_mapper/validation/exceptions.rb +7 -0
- data/lib/data_mapper/validation/inferred.rb +264 -0
- data/lib/data_mapper/validation/macros.rb +449 -0
- data/lib/data_mapper/validation/message_transformer.rb +111 -0
- data/lib/data_mapper/validation/model_extensions.rb +17 -0
- data/lib/data_mapper/validation/resource_extensions.rb +131 -0
- data/lib/data_mapper/validation/rule/absence.rb +31 -0
- data/lib/data_mapper/validation/rule/acceptance.rb +49 -0
- data/lib/data_mapper/validation/rule/block.rb +37 -0
- data/lib/data_mapper/validation/rule/confirmation.rb +47 -0
- data/lib/data_mapper/validation/rule/format/proc.rb +34 -0
- data/lib/data_mapper/validation/rule/format/regexp.rb +51 -0
- data/lib/data_mapper/validation/rule/format.rb +86 -0
- data/lib/data_mapper/validation/rule/formats/email.rb +54 -0
- data/lib/data_mapper/validation/rule/formats/url.rb +13 -0
- data/lib/data_mapper/validation/rule/length/equal.rb +48 -0
- data/lib/data_mapper/validation/rule/length/maximum.rb +50 -0
- data/lib/data_mapper/validation/rule/length/minimum.rb +50 -0
- data/lib/data_mapper/validation/rule/length/range.rb +50 -0
- data/lib/data_mapper/validation/rule/length.rb +96 -0
- data/lib/data_mapper/validation/rule/method.rb +42 -0
- data/lib/data_mapper/validation/rule/numericalness/equal.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/greater_than.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/greater_than_or_equal.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/integer.rb +41 -0
- data/lib/data_mapper/validation/rule/numericalness/less_than.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/less_than_or_equal.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/not_equal.rb +34 -0
- data/lib/data_mapper/validation/rule/numericalness/numeric.rb +68 -0
- data/lib/data_mapper/validation/rule/numericalness.rb +91 -0
- data/lib/data_mapper/validation/rule/presence.rb +52 -0
- data/lib/data_mapper/validation/rule/primitive_type.rb +32 -0
- data/lib/data_mapper/validation/rule/uniqueness.rb +64 -0
- data/lib/data_mapper/validation/rule/within/range/bounded.rb +29 -0
- data/lib/data_mapper/validation/rule/within/range/unbounded_begin.rb +29 -0
- data/lib/data_mapper/validation/rule/within/range/unbounded_end.rb +29 -0
- data/lib/data_mapper/validation/rule/within/range.rb +55 -0
- data/lib/data_mapper/validation/rule/within/set.rb +45 -0
- data/lib/data_mapper/validation/rule/within.rb +32 -0
- data/lib/data_mapper/validation/rule.rb +232 -0
- data/lib/data_mapper/validation/rule_set.rb +157 -0
- data/lib/data_mapper/validation/support/object.rb +19 -0
- data/lib/data_mapper/validation/support/ordered_hash.rb +434 -0
- data/lib/data_mapper/validation/version.rb +5 -0
- data/lib/data_mapper/validation/violation.rb +136 -0
- data/lib/data_mapper/validation/violation_set.rb +115 -0
- data/lib/data_mapper/validation.rb +105 -0
- data/lib/dm-validations.rb +24 -0
- data/spec/data_mapper/validation/resource_extensions/save_spec.rb +56 -0
- data/spec/data_mapper/validation/resource_extensions/validate_spec.rb +103 -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/integer_dumped_as_string_property.rb +24 -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 +35 -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 +48 -0
- data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +35 -0
- data/spec/integration/automatic_validation/spec_helper.rb +57 -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 +91 -0
- data/spec/integration/length_validator/default_value_spec.rb +14 -0
- data/spec/integration/length_validator/equality_spec.rb +83 -0
- data/spec/integration/length_validator/error_message_spec.rb +22 -0
- data/spec/integration/length_validator/maximum_spec.rb +47 -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 +243 -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 +36 -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 +112 -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 +69 -0
- data/spec/integration/required_field_validator/boolean_type_value_spec.rb +164 -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 +27 -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 +113 -0
- data/spec/spec_helper.rb +28 -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/validators/within_validator_spec.rb +23 -0
- data/spec/unit/violation_set/adding_spec.rb +54 -0
- data/spec/unit/violation_set/emptiness_spec.rb +38 -0
- data/spec/unit/violation_set/enumerable_spec.rb +32 -0
- data/spec/unit/violation_set/reading_spec.rb +35 -0
- data/spec/unit/violation_set/respond_to_spec.rb +15 -0
- data/tasks/spec.rake +21 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- 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
|
data/spec/spec_helper.rb
ADDED
|
@@ -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,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
|