Commit db6b085

mo <mo.khan@gmail.com>
2018-12-24 22:56:11
add sub attribute
1 parent 9b79e10
Changed files (3)
lib
spec
scim
lib/scim/kit/v2/attribute_type.rb
@@ -5,6 +5,15 @@ module Scim
     module V2
       # Represents a scim Attribute type
       class AttributeType
+        VALID = {
+          string: 'string',
+          boolean: 'boolean',
+          decimal: 'decimal',
+          integer: 'integer',
+          datetime: 'dateTime',
+          reference: 'reference',
+          complex: 'complex'
+        }.freeze
         attr_reader :name, :type
         attr_accessor :multi_valued
         attr_accessor :required
@@ -24,6 +33,7 @@ module Scim
           @mutability = Mutability::READ_WRITE
           @returned = Returned::DEFAULT
           @uniqueness = Uniqueness::NONE
+          @attributes = []
         end
 
         def mutability=(value)
@@ -38,17 +48,48 @@ module Scim
           @uniqueness = Uniqueness.find(value)
         end
 
+        def add_attribute(name:, type: :string)
+          @type = :complex
+          attribute = AttributeType.new(name: name, type: type)
+          yield attribute if block_given?
+          @attributes << attribute
+        end
+
         def to_h
-          {
-            name: name, type: type.to_s,
-            description: description,
-            multiValued: multi_valued,
-            required: required,
-            caseExact: case_exact,
-            mutability: mutability,
-            returned: returned,
-            uniqueness: uniqueness
-          }
+          if complex?
+            {
+              name: name, type: type.to_s,
+              description: description,
+              multiValued: multi_valued,
+              required: required,
+              mutability: mutability,
+              returned: returned,
+              uniqueness: uniqueness,
+              subAttributes: @attributes.map(&:to_h)
+            }
+          else
+            x = {
+              name: name, type: type.to_s,
+              description: description,
+              multiValued: multi_valued,
+              required: required,
+              mutability: mutability,
+              returned: returned,
+              uniqueness: uniqueness
+            }
+            x[:caseExact] = case_exact if string?
+            x
+          end
+        end
+
+        private
+
+        def complex?
+          type.to_sym == :complex
+        end
+
+        def string?
+          type.to_sym == :string
         end
       end
     end
lib/scim/kit/v2/schema.rb
@@ -20,8 +20,8 @@ module Scim
           @attributes = []
         end
 
-        def add_attribute(name:)
-          attribute = AttributeType.new(name: name)
+        def add_attribute(name:, type: :string)
+          attribute = AttributeType.new(name: name, type: type)
           yield attribute if block_given?
           @attributes << attribute
         end
spec/scim/kit/v2/schema_spec.rb
@@ -44,4 +44,44 @@ RSpec.describe Scim::Kit::V2::Schema do
       specify { expect(result[:attributes][1][:description]).to eql('my description') }
     end
   end
+
+  context 'with a complex attribute' do
+    before do
+      subject.add_attribute(name: 'emails') do |x|
+        x.multi_valued = true
+        x.add_attribute(name: 'value')
+        x.add_attribute(name: 'primary', type: 'boolean')
+      end
+    end
+
+    specify { expect(result[:attributes][0][:name]).to eql('emails') }
+    specify { expect(result[:attributes][0][:type]).to eql('complex') }
+    specify { expect(result[:attributes][0][:multiValued]).to be(true) }
+    specify { expect(result[:attributes][0][:description]).to eql('') }
+    specify { expect(result[:attributes][0][:required]).to be(false) }
+    specify { expect(result[:attributes][0].key?(:caseExact)).to be(false) }
+    specify { expect(result[:attributes][0][:mutability]).to eql('readWrite') }
+    specify { expect(result[:attributes][0][:returned]).to eql('default') }
+    specify { expect(result[:attributes][0][:uniqueness]).to eql('none') }
+
+    specify { expect(result[:attributes][0][:subAttributes][0][:name]).to eql('value') }
+    specify { expect(result[:attributes][0][:subAttributes][0][:type]).to eql('string') }
+    specify { expect(result[:attributes][0][:subAttributes][0][:multiValued]).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][0][:description]).to eql('') }
+    specify { expect(result[:attributes][0][:subAttributes][0][:required]).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][0][:caseExact]).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][0][:mutability]).to eql('readWrite') }
+    specify { expect(result[:attributes][0][:subAttributes][0][:returned]).to eql('default') }
+    specify { expect(result[:attributes][0][:subAttributes][0][:uniqueness]).to eql('none') }
+
+    specify { expect(result[:attributes][0][:subAttributes][1][:name]).to eql('primary') }
+    specify { expect(result[:attributes][0][:subAttributes][1][:type]).to eql('boolean') }
+    specify { expect(result[:attributes][0][:subAttributes][1][:multiValued]).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][1][:description]).to eql('') }
+    specify { expect(result[:attributes][0][:subAttributes][1][:required]).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][1].key?(:caseExact)).to be(false) }
+    specify { expect(result[:attributes][0][:subAttributes][1][:mutability]).to eql('readWrite') }
+    specify { expect(result[:attributes][0][:subAttributes][1][:returned]).to eql('default') }
+    specify { expect(result[:attributes][0][:subAttributes][1][:uniqueness]).to eql('none') }
+  end
 end