aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-11-17 06:17:46 +0100
committerRobert2017-11-17 06:35:51 +0100
commit85f7fe2a43fcd26278098ed6a2f4fa916f3c03be (patch)
treeae8e2b365de7aa0421a3ec5c40d7d560f4ba4068
parent4fa233cb131f586d310faec8c9fc3ed88805ae76 (diff)
downloadchouette-core-85f7fe2a43fcd26278098ed6a2f4fa916f3c03be.tar.bz2
Refs: #4800@0.8h; sketching our own hstore_accessor implementation
-rw-r--r--app/models/generic_attribute_control/min_max.rb48
-rw-r--r--spec/models/compliance_control_validations/genric_attribute_validation/min_max_validation_spec.rb43
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