main
1# frozen_string_literal: true
2
3RSpec.describe Scim::Kit::V2::ServiceProviderConfiguration do
4 subject { described_class.new(location: location) }
5
6 let(:location) { FFaker::Internet.uri('https') }
7 let(:now) { Time.now }
8
9 describe '#to_json' do
10 let(:result) { JSON.parse(subject.to_json, symbolize_names: true) }
11
12 specify { expect(result[:schemas]).to match_array(['urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig']) }
13 specify { expect(result[:documentationUri]).to be_blank }
14 specify { expect(result[:patch][:supported]).to be(false) }
15 specify { expect(result[:bulk][:supported]).to be(false) }
16 specify { expect(result[:filter][:supported]).to be(false) }
17 specify { expect(result[:changePassword][:supported]).to be(false) }
18 specify { expect(result[:sort][:supported]).to be(false) }
19 specify { expect(result[:etag][:supported]).to be(false) }
20 specify { expect(result[:authenticationSchemes]).to be_empty }
21 specify { expect(result[:meta][:location]).to eql(location) }
22 specify { expect(result[:meta][:resourceType]).to eql('ServiceProviderConfig') }
23 specify { expect(result[:meta][:created]).to eql(now.iso8601) }
24 specify { expect(result[:meta][:lastModified]).to eql(now.iso8601) }
25 specify { expect(result[:meta][:version]).not_to be_nil }
26
27 context 'with documentation uri' do
28 before do
29 subject.documentation_uri = FFaker::Internet.uri('https')
30 end
31
32 specify { expect(result[:documentationUri]).to eql(subject.documentation_uri) }
33 end
34
35 context 'with OAuth Bearer Token' do
36 before { subject.add_authentication(:oauthbearertoken) }
37
38 specify { expect(result[:authenticationSchemes][0][:name]).to eql('OAuth Bearer Token') }
39 specify { expect(result[:authenticationSchemes][0][:description]).to eql('Authentication scheme using the OAuth Bearer Token Standard') }
40 specify { expect(result[:authenticationSchemes][0][:specUri]).to eql('http://www.rfc-editor.org/info/rfc6750') }
41 specify { expect(result[:authenticationSchemes][0][:documentationUri]).to eql('http://example.com/help/oauth.html') }
42 specify { expect(result[:authenticationSchemes][0][:type]).to eql('oauthbearertoken') }
43 end
44
45 context 'with http basic' do
46 before { subject.add_authentication(:httpbasic) }
47
48 specify { expect(result[:authenticationSchemes][0][:name]).to eql('HTTP Basic') }
49 specify { expect(result[:authenticationSchemes][0][:description]).to eql('Authentication scheme using the HTTP Basic Standard') }
50 specify { expect(result[:authenticationSchemes][0][:specUri]).to eql('http://www.rfc-editor.org/info/rfc2617') }
51 specify { expect(result[:authenticationSchemes][0][:documentationUri]).to eql('http://example.com/help/httpBasic.html') }
52 specify { expect(result[:authenticationSchemes][0][:type]).to eql('httpbasic') }
53 end
54
55 context 'with multiple schemes' do
56 before do
57 subject.add_authentication(:oauthbearertoken, primary: true)
58 subject.add_authentication(:httpbasic)
59 end
60
61 specify { expect(result[:authenticationSchemes][0][:name]).to eql('OAuth Bearer Token') }
62 specify { expect(result[:authenticationSchemes][0][:description]).to eql('Authentication scheme using the OAuth Bearer Token Standard') }
63 specify { expect(result[:authenticationSchemes][0][:specUri]).to eql('http://www.rfc-editor.org/info/rfc6750') }
64 specify { expect(result[:authenticationSchemes][0][:documentationUri]).to eql('http://example.com/help/oauth.html') }
65 specify { expect(result[:authenticationSchemes][0][:type]).to eql('oauthbearertoken') }
66 specify { expect(result[:authenticationSchemes][0][:primary]).to be(true) }
67
68 specify { expect(result[:authenticationSchemes][1][:name]).to eql('HTTP Basic') }
69 specify { expect(result[:authenticationSchemes][1][:description]).to eql('Authentication scheme using the HTTP Basic Standard') }
70 specify { expect(result[:authenticationSchemes][1][:specUri]).to eql('http://www.rfc-editor.org/info/rfc2617') }
71 specify { expect(result[:authenticationSchemes][1][:documentationUri]).to eql('http://example.com/help/httpBasic.html') }
72 specify { expect(result[:authenticationSchemes][1][:type]).to eql('httpbasic') }
73 end
74
75 context 'with custom scheme' do
76 before do
77 subject.add_authentication(:custom) do |x|
78 x.name = 'custom'
79 x.description = 'custom'
80 x.spec_uri = 'http://www.rfc-editor.org/info/rfcXXXX'
81 x.documentation_uri = 'http://example.com/help/custom.html'
82 end
83 end
84
85 specify { expect(result[:authenticationSchemes][0][:name]).to eql('custom') }
86 specify { expect(result[:authenticationSchemes][0][:description]).to eql('custom') }
87 specify { expect(result[:authenticationSchemes][0][:specUri]).to eql('http://www.rfc-editor.org/info/rfcXXXX') }
88 specify { expect(result[:authenticationSchemes][0][:documentationUri]).to eql('http://example.com/help/custom.html') }
89 specify { expect(result[:authenticationSchemes][0][:type]).to eql('custom') }
90 end
91
92 context 'with etag support' do
93 before { subject.etag.supported = true }
94
95 specify { expect(result[:etag][:supported]).to be(true) }
96 end
97
98 context 'with sort support' do
99 before { subject.sort.supported = true }
100
101 specify { expect(result[:sort][:supported]).to be(true) }
102 end
103
104 context 'with change_password support' do
105 before { subject.change_password.supported = true }
106
107 specify { expect(result[:changePassword][:supported]).to be(true) }
108 end
109
110 context 'with patch support' do
111 before { subject.patch.supported = true }
112
113 specify { expect(result[:patch][:supported]).to be(true) }
114 end
115
116 context 'with bulk support' do
117 before do
118 subject.bulk.supported = true
119 subject.bulk.max_operations = 1000
120 subject.bulk.max_payload_size = 1_048_576
121 end
122
123 specify { expect(result[:bulk][:supported]).to be(true) }
124 specify { expect(result[:bulk][:maxOperations]).to be(1000) }
125 specify { expect(result[:bulk][:maxPayloadSize]).to be(1_048_576) }
126 end
127
128 context 'with filter support' do
129 before do
130 subject.filter.supported = true
131 subject.filter.max_results = 200
132 end
133
134 specify { expect(result[:filter][:supported]).to be(true) }
135 specify { expect(result[:filter][:maxResults]).to be(200) }
136 end
137 end
138
139 describe '.parse' do
140 let(:result) { described_class.parse(subject.to_json) }
141
142 before do
143 subject.add_authentication(:oauthbearertoken)
144 subject.bulk.max_operations = 1000
145 subject.bulk.max_payload_size = 1_048_576
146 subject.bulk.supported = true
147 subject.change_password.supported = true
148 subject.documentation_uri = FFaker::Internet.uri('https')
149 subject.etag.supported = true
150 subject.filter.max_results = 200
151 subject.filter.supported = true
152 subject.patch.supported = true
153 subject.sort.supported = true
154 end
155
156 specify { expect(result.meta.created.to_i).to eql(subject.meta.created.to_i) }
157 specify { expect(result.meta.last_modified.to_i).to eql(subject.meta.last_modified.to_i) }
158 specify { expect(result.meta.version).to eql(subject.meta.version) }
159 specify { expect(result.meta.location).to eql(subject.meta.location) }
160 specify { expect(result.meta.resource_type).to eql(subject.meta.resource_type) }
161 specify { expect(result.to_json).to eql(subject.to_json) }
162 specify { expect(result.to_h).to eql(subject.to_h) }
163 end
164end