main
 1# frozen_string_literal: true
 2
 3RSpec.describe Saml::Kit::Builders::IdentityProviderMetadata 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(:email) { FFaker::Internet.email }
13  let(:org_name) { FFaker::Movie.title }
14  let(:url) { FFaker::Internet.uri('https') }
15  let(:entity_id) { FFaker::Movie.title }
16
17  it 'builds a proper metadata' do
18    subject.contact_email = email
19    subject.entity_id = entity_id
20    subject.organization_name = org_name
21    subject.organization_url = url
22    subject.name_id_formats = [
23      Saml::Kit::Namespaces::PERSISTENT,
24      Saml::Kit::Namespaces::TRANSIENT,
25      Saml::Kit::Namespaces::EMAIL_ADDRESS,
26    ]
27    subject.add_single_sign_on_service('https://www.example.com/login', binding: :http_redirect)
28    subject.add_single_logout_service('https://www.example.com/logout', binding: :http_post)
29    subject.attributes << 'id'
30
31    result = Hash.from_xml(subject.build.to_xml)
32
33    expect(result['EntityDescriptor']['ID']).to be_present
34    expect(result['EntityDescriptor']['entityID']).to eql(entity_id)
35    expect(result['EntityDescriptor']['IDPSSODescriptor']['protocolSupportEnumeration']).to eql(Saml::Kit::Namespaces::PROTOCOL)
36    expect(result['EntityDescriptor']['IDPSSODescriptor']['WantAuthnRequestsSigned']).to eql('true')
37    expect(result['EntityDescriptor']['IDPSSODescriptor']['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']['IDPSSODescriptor']['SingleSignOnService']['Binding']).to eql(Saml::Kit::Bindings::HTTP_REDIRECT)
43    expect(result['EntityDescriptor']['IDPSSODescriptor']['SingleSignOnService']['Location']).to eql('https://www.example.com/login')
44    expect(result['EntityDescriptor']['IDPSSODescriptor']['SingleLogoutService']['Binding']).to eql(Saml::Kit::Bindings::HTTP_POST)
45    expect(result['EntityDescriptor']['IDPSSODescriptor']['SingleLogoutService']['Location']).to eql('https://www.example.com/logout')
46    expect(result['EntityDescriptor']['IDPSSODescriptor']['Attribute']['Name']).to eql('id')
47    certificates = result['EntityDescriptor']['IDPSSODescriptor']['KeyDescriptor'].map { |x| x['KeyInfo']['X509Data']['X509Certificate'] }
48    expected_certificates = configuration.certificates.map(&:stripped)
49    expect(certificates).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