main
  1# frozen_string_literal: true
  2
  3RSpec.describe Scim::Kit::V2::Schema do
  4  subject { described_class.new(id: id, name: name, location: location) }
  5
  6  let(:id) { 'Group' }
  7  let(:name) { 'Group' }
  8  let(:location) { FFaker::Internet.uri('https') }
  9  let(:description) { FFaker::Name.name }
 10  let(:result) { JSON.parse(subject.to_json, symbolize_names: true) }
 11
 12  specify { expect(result[:id]).to eql(id) }
 13  specify { expect(result[:name]).to eql(name) }
 14  specify { expect(result[:description]).to eql(name) }
 15  specify { expect(result[:meta][:resourceType]).to eql('Schema') }
 16  specify { expect(result[:meta][:location]).to eql(location) }
 17
 18  context 'with a description' do
 19    before do
 20      subject.description = description
 21    end
 22
 23    specify { expect(result[:description]).to eql(description) }
 24  end
 25
 26  context 'with a single simple attribute' do
 27    before do
 28      subject.add_attribute(name: 'displayName')
 29    end
 30
 31    specify { expect(result[:attributes][0][:name]).to eql('displayName') }
 32    specify { expect(result[:attributes][0][:type]).to eql('string') }
 33    specify { expect(result[:attributes][0][:multiValued]).to be(false) }
 34    specify { expect(result[:attributes][0][:description]).to eql('displayName') }
 35    specify { expect(result[:attributes][0][:required]).to be(false) }
 36    specify { expect(result[:attributes][0][:caseExact]).to be(false) }
 37    specify { expect(result[:attributes][0][:mutability]).to eql('readWrite') }
 38    specify { expect(result[:attributes][0][:returned]).to eql('default') }
 39    specify { expect(result[:attributes][0][:uniqueness]).to eql('none') }
 40
 41    context 'with a description' do
 42      before do
 43        subject.add_attribute(name: 'userName') do |x|
 44          x.description = 'my description'
 45        end
 46      end
 47
 48      specify { expect(result[:attributes][1][:description]).to eql('my description') }
 49    end
 50  end
 51
 52  context 'with a complex attribute' do
 53    before do
 54      subject.add_attribute(name: 'emails') do |x|
 55        x.multi_valued = true
 56        x.add_attribute(name: 'value')
 57        x.add_attribute(name: 'primary', type: 'boolean')
 58      end
 59    end
 60
 61    specify { expect(result[:attributes][0][:name]).to eql('emails') }
 62    specify { expect(result[:attributes][0][:type]).to eql('complex') }
 63    specify { expect(result[:attributes][0][:multiValued]).to be(true) }
 64    specify { expect(result[:attributes][0][:description]).to eql('emails') }
 65    specify { expect(result[:attributes][0][:required]).to be(false) }
 66    specify { expect(result[:attributes][0].key?(:caseExact)).to be(false) }
 67    specify { expect(result[:attributes][0][:mutability]).to eql('readWrite') }
 68    specify { expect(result[:attributes][0][:returned]).to eql('default') }
 69    specify { expect(result[:attributes][0][:uniqueness]).to eql('none') }
 70
 71    specify { expect(result[:attributes][0][:subAttributes][0][:name]).to eql('value') }
 72    specify { expect(result[:attributes][0][:subAttributes][0][:type]).to eql('string') }
 73    specify { expect(result[:attributes][0][:subAttributes][0][:multiValued]).to be(false) }
 74    specify { expect(result[:attributes][0][:subAttributes][0][:description]).to eql('value') }
 75    specify { expect(result[:attributes][0][:subAttributes][0][:required]).to be(false) }
 76    specify { expect(result[:attributes][0][:subAttributes][0][:caseExact]).to be(false) }
 77    specify { expect(result[:attributes][0][:subAttributes][0][:mutability]).to eql('readWrite') }
 78    specify { expect(result[:attributes][0][:subAttributes][0][:returned]).to eql('default') }
 79    specify { expect(result[:attributes][0][:subAttributes][0][:uniqueness]).to eql('none') }
 80
 81    specify { expect(result[:attributes][0][:subAttributes][1][:name]).to eql('primary') }
 82    specify { expect(result[:attributes][0][:subAttributes][1][:type]).to eql('boolean') }
 83    specify { expect(result[:attributes][0][:subAttributes][1][:multiValued]).to be(false) }
 84    specify { expect(result[:attributes][0][:subAttributes][1][:description]).to eql('primary') }
 85    specify { expect(result[:attributes][0][:subAttributes][1][:required]).to be(false) }
 86    specify { expect(result[:attributes][0][:subAttributes][1].key?(:caseExact)).to be(false) }
 87    specify { expect(result[:attributes][0][:subAttributes][1][:mutability]).to eql('readWrite') }
 88    specify { expect(result[:attributes][0][:subAttributes][1][:returned]).to eql('default') }
 89    specify { expect(result[:attributes][0][:subAttributes][1][:uniqueness]).to eql('none') }
 90  end
 91
 92  context 'with a reference attribute' do
 93    before do
 94      subject.add_attribute(name: '$ref', type: 'reference') do |x|
 95        x.reference_types = %w[User Group]
 96        x.mutability = :read_only
 97      end
 98    end
 99
100    specify { expect(result[:attributes][0][:name]).to eql('$ref') }
101    specify { expect(result[:attributes][0][:type]).to eql('reference') }
102    specify { expect(result[:attributes][0][:referenceTypes]).to match_array(%w[User Group]) }
103    specify { expect(result[:attributes][0][:multiValued]).to be(false) }
104    specify { expect(result[:attributes][0][:description]).to eql('$ref') }
105    specify { expect(result[:attributes][0][:required]).to be(false) }
106    specify { expect(result[:attributes][0][:caseExact]).to be(false) }
107    specify { expect(result[:attributes][0][:mutability]).to eql('readOnly') }
108    specify { expect(result[:attributes][0][:returned]).to eql('default') }
109    specify { expect(result[:attributes][0][:uniqueness]).to eql('none') }
110  end
111
112  describe '.build' do
113    subject do
114      described_class.build(id: id, name: name, location: location) do |x|
115        x.description = description
116      end
117    end
118
119    specify { expect(result[:id]).to eql(id) }
120    specify { expect(result[:name]).to eql(name) }
121    specify { expect(result[:description]).to eql(description) }
122    specify { expect(result[:meta][:resourceType]).to eql('Schema') }
123    specify { expect(result[:meta][:location]).to eql(location) }
124  end
125
126  describe '.parse' do
127    let(:result) { described_class.parse(subject.to_json) }
128
129    context 'with reference attribute type' do
130      before do
131        subject.add_attribute(name: :display_name) do |x|
132          x.multi_valued = true
133          x.required = true
134          x.case_exact = true
135          x.mutability = :read_only
136          x.returned = :never
137          x.uniqueness = :server
138          x.canonical_values = ['honerva']
139          x.reference_types = %w[User Group]
140        end
141      end
142
143      specify { expect(result.id).to eql(subject.id) }
144      specify { expect(result.name).to eql(subject.name) }
145      specify { expect(result.description).to eql(subject.description) }
146      specify { expect(result.meta.created).to eql(subject.meta.created) }
147      specify { expect(result.meta.last_modified).to eql(subject.meta.last_modified) }
148      specify { expect(result.meta.version).to eql(subject.meta.version) }
149      specify { expect(result.meta.location).to eql(subject.meta.location) }
150      specify { expect(result.meta.resource_type).to eql(subject.meta.resource_type) }
151      specify { expect(result.attributes.size).to be(1) }
152      specify { expect(result.attributes.first.to_h).to eql(subject.attributes.first.to_h) }
153      specify { expect(result.to_json).to eql(subject.to_json) }
154      specify { expect(result.to_h).to eql(subject.to_h) }
155    end
156
157    context 'with complex attribute type' do
158      before do
159        subject.add_attribute(name: :name) do |x|
160          x.add_attribute(name: :family_name)
161          x.add_attribute(name: :given_name)
162        end
163      end
164
165      specify { expect(result.id).to eql(subject.id) }
166      specify { expect(result.name).to eql(subject.name) }
167      specify { expect(result.description).to eql(subject.description) }
168      specify { expect(result.meta.created).to eql(subject.meta.created) }
169      specify { expect(result.meta.last_modified).to eql(subject.meta.last_modified) }
170      specify { expect(result.meta.version).to eql(subject.meta.version) }
171      specify { expect(result.meta.location).to eql(subject.meta.location) }
172      specify { expect(result.meta.resource_type).to eql(subject.meta.resource_type) }
173      specify { expect(result.attributes.size).to be(1) }
174      specify { expect(result.attributes.first.to_h).to eql(subject.attributes.first.to_h) }
175      specify { expect(result.to_json).to eql(subject.to_json) }
176      specify { expect(result.to_h).to eql(subject.to_h) }
177    end
178  end
179end