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