#!/usr/bin/perl use strict; use warnings; use English qw(-no_match_vars); use File::Temp; use Test::More; use Test::Exception; use IdPAccountManager::SAMLMetadata; plan tests => 21; my $metadata; throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new(); } qr/^missing argument 'file'/, 'instanciation: no file argument'; throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => '/no/such/file', ); } qr/^non-existing file/, 'instanciation: non-existing file argument'; my $file1 = File::Temp->new(UNLINK => $ENV{TEST_DEBUG} ? 0 : 1); chmod 0000, $file1; throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => $file1->filename() ); } qr/^non-readable file/, 'instanciation: non-readable file'; chmod 0644, $file1; throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => $file1->filename() ); } qr/^Failed to parse file: \S+ parser error : Document is empty/, 'instanciation: empty file'; my $file2 = File::Temp->new(UNLINK => $ENV{TEST_DEBUG} ? 0 : 1); print $file2 <<EOF; foo EOF close($file2); throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => $file2->filename() ); } qr/^Failed to parse file: \S+ parser error : Start tag expected/, 'instanciation: non-xml file'; my $file3 = File::Temp->new(UNLINK => $ENV{TEST_DEBUG} ? 0 : 1); print $file3 <<EOF; <?xml version="1.0" encoding="UTF-8" ?> <root/> EOF close($file3); throws_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => $file3->filename() ); } qr/^incorrect root element type 'root'/, 'instanciation: incorrect xml file'; lives_ok { $metadata = IdPAccountManager::SAMLMetadata->new( file => 't/edugain.xml' ); } 'instanciation: edugain metadata'; my $all = $metadata->parse(); ok(defined $all, 'metadata extraction: defined result'); ok(ref $all eq 'ARRAY', 'metadata extraction: result type'); ok(scalar @$all == 4318, 'metadata extraction: result count'); my $sp = $metadata->parse(id => 'https://filesender.ipm.ir/'); ok(defined $sp, 'filtered metadata extraction: defined result'); ok(ref $sp eq 'ARRAY', 'filtered metadata extraction: result type'); ok(scalar @$sp == 1, 'filtered metadata extraction: result count'); is($sp->[0]->{entityid}, 'https://filesender.ipm.ir/', 'filtered entity has expected ID'); my $none = $metadata->parse(id => 'https://no.such.sp/'); ok(defined $none, 'filtered metadata extraction: defined result'); ok(ref $none eq 'ARRAY', 'filtered metadata extraction: result type'); ok(scalar @$none == 0, 'filtered metadata extraction: result count'); my $idp = $metadata->parse(type => 'idp'); ok(defined $idp, 'filtered metadata extraction: defined result'); ok(ref $idp eq 'ARRAY', 'filtered metadata extraction: result type'); ok(scalar @$idp == 2561, 'filtered metadata extraction: result count'); is($idp->[0]->{type}, 'idp', 'filtered entity has expected type');