main
 1# frozen_string_literal: true
 2
 3RSpec.describe Saml::Kit::Builders::ServiceProviderMetadata do
 4  subject { described_class.new(configuration: configuration) }
 5
 6  let(:configuration) do
 7    Saml::Kit::Configuration.new do |config|
 8      config.generate_key_pair_for(use: :signing)
 9      config.generate_key_pair_for(use: :encryption)
10    end
11  end
12  let(:assertion_consumer_service_url) { FFaker::Internet.http_url }
13  let(:email) { FFaker::Internet.email }
14  let(:org_name) { FFaker::Movie.title }
15  let(:url) { FFaker::Internet.uri('https') }
16  let(:entity_id) { FFaker::Internet.uri('https') }
17
18  it 'builds the service provider metadata' do
19    subject.contact_email = email
20    subject.entity_id = entity_id
21    subject.organization_name = org_name
22    subject.organization_url = url
23    subject.add_assertion_consumer_service(assertion_consumer_service_url, binding: :http_post)
24    subject.name_id_formats = [
25      Saml::Kit::Namespaces::PERSISTENT,
26      Saml::Kit::Namespaces::TRANSIENT,
27      Saml::Kit::Namespaces::EMAIL_ADDRESS,
28    ]
29    result = Hash.from_xml(subject.build.to_xml)
30
31    expect(result['EntityDescriptor']['xmlns']).to eql('urn:oasis:names:tc:SAML:2.0:metadata')
32    expect(result['EntityDescriptor']['ID']).to be_present
33    expect(result['EntityDescriptor']['entityID']).to eql(entity_id)
34    expect(result['EntityDescriptor']['SPSSODescriptor']['AuthnRequestsSigned']).to eql('true')
35    expect(result['EntityDescriptor']['SPSSODescriptor']['WantAssertionsSigned']).to eql('true')
36    expect(result['EntityDescriptor']['SPSSODescriptor']['protocolSupportEnumeration']).to eql('urn:oasis:names:tc:SAML:2.0:protocol')
37    expect(result['EntityDescriptor']['SPSSODescriptor']['NameIDFormat']).to match_array([
38      Saml::Kit::Namespaces::PERSISTENT,
39      Saml::Kit::Namespaces::TRANSIENT,
40      Saml::Kit::Namespaces::EMAIL_ADDRESS,
41    ])
42    expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Binding']).to eql('urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST')
43    expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Location']).to eql(assertion_consumer_service_url)
44    expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['isDefault']).to eql('true')
45    expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['index']).to eql('0')
46    expect(result['EntityDescriptor']['Signature']).to be_present
47    expect(result['EntityDescriptor']['SPSSODescriptor']['KeyDescriptor'].map { |x| x['use'] }).to match_array(%w[signing encryption])
48    expected_certificates = configuration.certificates.map(&:stripped)
49    expect(result['EntityDescriptor']['SPSSODescriptor']['KeyDescriptor'].map { |x| x['KeyInfo']['X509Data']['X509Certificate'] }).to match_array(expected_certificates)
50    expect(result['EntityDescriptor']['Organization']['OrganizationName']).to eql(org_name)
51    expect(result['EntityDescriptor']['Organization']['OrganizationDisplayName']).to eql(org_name)
52    expect(result['EntityDescriptor']['Organization']['OrganizationURL']).to eql(url)
53    expect(result['EntityDescriptor']['ContactPerson']['contactType']).to eql('technical')
54    expect(result['EntityDescriptor']['ContactPerson']['Company']).to eql("mailto:#{email}")
55  end
56end