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