diff options
| author | Robert | 2017-11-17 06:17:46 +0100 |
|---|---|---|
| committer | Robert | 2017-11-17 06:35:51 +0100 |
| commit | 85f7fe2a43fcd26278098ed6a2f4fa916f3c03be (patch) | |
| tree | ae8e2b365de7aa0421a3ec5c40d7d560f4ba4068 | |
| parent | 4fa233cb131f586d310faec8c9fc3ed88805ae76 (diff) | |
| download | chouette-core-85f7fe2a43fcd26278098ed6a2f4fa916f3c03be.tar.bz2 | |
Refs: #4800@0.8h; sketching our own hstore_accessor implementation
| -rw-r--r-- | app/models/generic_attribute_control/min_max.rb | 48 | ||||
| -rw-r--r-- | spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb | 43 |
2 files changed, 61 insertions, 30 deletions
diff --git a/app/models/generic_attribute_control/min_max.rb b/app/models/generic_attribute_control/min_max.rb index 246b90085..83be35825 100644 --- a/app/models/generic_attribute_control/min_max.rb +++ b/app/models/generic_attribute_control/min_max.rb @@ -6,45 +6,41 @@ module GenericAttributeControl def default_code; "3-Generic-2" end end - hstore_accessor :control_attributes, minimum: :integer, maximum: :integer, target: :string + hstore_accessor :control_attributes, maximum: :integer, target: :string - validate def numericality - validate_numericality_of :minimum - end - validates :minimum, numericality: true, allow_nil: true validates :maximum, numericality: true, allow_nil: true validates :target, presence: true include MinMaxValuesValidation - def minimum= new_value - case new_value - when String - control_attributes['minimum'] = cast_to_int(:minimum, new_value) - else - super() + # BEGIN: Sketching out our own hstore_accessor implementation + validate def numericality_of_minimum + _get_minimum.tap do |stored_value| + return true unless stored_value # allow_nil: true + return true if %r{\A\s*[-+]?\d+\s*\z} === stored_value + errors.add(:minimum, 'NaN') end end - + def minimum= new_value + stored_value = cast_value(new_value) + control_attributes['minimum'] = stored_value + end + def minimum + _get_minimum.to_i + end + private - - def cast_to_int(field, value) - return Integer(value) - rescue ArgumentError - value - end - def validate_numericality_of *atts - atts.each(&method(:validate_numericality_of_attribute)) + def _get_minimum + control_attributes.try(:[], 'minimum') end - - def validate_numericality_of_attribute attr - send(attr).tap do | value | - return true if %r{^\a\s*[-+]?\d+\s*\z} === value - errors.add(attr, "NaN") - end + + def cast_value(value) + return nil unless value # Allow for nil in storage, we must not anticipate validation + value.to_s end + # END: Sketching our own hstore_accessor implementation end end diff --git a/spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb b/spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb index acd9e3f0a..3a50841f1 100644 --- a/spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb +++ b/spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb @@ -6,9 +6,30 @@ RSpec.describe GenericAttributeControl::MinMax do it_behaves_like 'has min_max_values' context "numerical validation" do - it "is valid" do - subject.minimum = 42 - expect_it.to be_valid + context "valid" do + it "on assignment" do + subject.minimum = 42 + expect_it.to be_valid + end + it "on FactoryGirl build" do + instance = build factory, minimum: "41" + expect(instance).to be_valid + end + + it "on new" do + instance = described_class.new(target: "target", minimum: "40") + expect(instance).not_to be_valid + end + + it "on update" do + subject.update minimum: '39' + expect(subject).to be_valid + end + + it 'on assign_attributes' do + subject.assign_attributes minimum: 38 + expect(subject).to be_valid + end end context "invalid" do @@ -17,11 +38,25 @@ RSpec.describe GenericAttributeControl::MinMax do expect_it.not_to be_valid end - it "on creation" do + it "on FactoryGirl build" do instance = build factory, minimum: "41s" expect(instance).not_to be_valid end + + it "on new" do + instance = described_class.new(target: "target", minimum: "40s") + expect(instance).not_to be_valid + end + it "on update" do + subject.update minimum: '39s' + expect(subject).not_to be_valid + end + + it 'on assign_attributes' do + subject.assign_attributes minimum: 'x38' + expect(subject).not_to be_valid + end end end end |
