Commit bdca426

mokha <mokha@cisco.com>
2019-02-02 18:16:34
improve multi valued complex validation
1 parent 5005569
Changed files (2)
lib
scim
spec
lib/scim/kit/v2/attribute.rb
@@ -3,6 +3,24 @@
 module Scim
   module Kit
     module V2
+      class UnknownAttribute
+        include ::ActiveModel::Validations
+        validate :unknown
+        attr_reader :name
+
+        def initialize(name)
+          @name = name
+        end
+
+        def _assign(*args)
+          valid?
+        end
+
+        def unknown
+          errors.add(name, I18n.t('errors.messages.invalid'))
+        end
+      end
+
       # Represents a SCIM Attribute
       class Attribute
         include ::ActiveModel::Validations
@@ -75,11 +93,27 @@ module Scim
         end
 
         def validate_complex
-          each do |attribute|
-            errors.copy!(attribute.errors) unless attribute.valid?
+          if _type.multi_valued
+            each_value do |hash|
+              hash.each do |key, value|
+                attribute = attribute_for(key) || UnknownAttribute.new(key)
+                attribute._assign(value)
+                errors.copy!(attribute.errors) unless attribute.valid?
+              end
+            end
+          else
+            each do |attribute|
+              errors.copy!(attribute.errors) unless attribute.valid?
+            end
           end
         end
 
+        def each_value(&block)
+          return unless _type.multi_valued
+
+          _value.each(&block)
+        end
+
         def validate_multiple
           return unless _value.respond_to?(:to_a)
 
spec/scim/kit/v2/attribute_spec.rb
@@ -270,6 +270,7 @@ RSpec.describe Scim::Kit::V2::Attribute do
       end
 
       specify { expect(subject).not_to be_valid }
+      specify { expect(subject.errors[:blah]).to be_present }
       specify { expect(subject.errors[:emails]).to be_present }
     end
   end