#!/usr/bin/perl
use warnings;
use strict;
# CPAN-Site-Index.t - unit tests for CPAN::Site::Index
#-------------------------------------------------------------------------------
use strict;
use warnings;
use FindBin qw($Bin);
use Test::More tests => 53;
use_ok('CPAN::Site::Index')
|| BAIL_OUT('Failed to compiled module CPAN::Site::Index');
test_inspect_entry_for_distro_with_strange_data();
test_inspect_entry_for_distro_with_packages_that_should_not_be_registered();
exit;
#-------------------------------------------------------------------------------
sub test_inspect_entry_for_distro_with_strange_data {
my $distro_to_test = 'Text-PDF-0.29a.tar.gz';
my %want_packages = (
'Text::PDF::Array' => undef,
'Text::PDF::Bool' => undef,
'Text::PDF::Dict' => undef,
'Text::PDF::File' => '0.27',
'Text::PDF::Filter' => undef,
'Text::PDF::ASCII85Decode' => undef,
'Text::PDF::RunLengthDecode' => undef,
'Text::PDF::ASCIIHexDecode' => undef,
'Text::PDF::FlateDecode' => undef,
'Text::PDF::LZWDecode' => undef,
'Text::PDF::Name' => undef,
'Text::PDF::Null' => undef,
'Text::PDF::Number' => undef,
'Text::PDF::Objind' => undef,
'Text::PDF::Page' => undef,
'Text::PDF::Pages' => undef,
'Text::PDF::SFont' => undef,
'Text::PDF::String' => undef,
'Text::PDF::TTFont' => undef,
'Text::PDF::TTIOString' => undef,
'Text::PDF::TTFont0' => undef,
'Text::PDF::Utils' => undef,
'Text::PDF' => '0.29',
);
_test_inspect_entry_for_distro( $distro_to_test, \%want_packages );
}
sub test_inspect_entry_for_distro_with_packages_that_should_not_be_registered {
my $distro_to_test = 'Distro-With-Packages-Outside-lib.tar.gz';
my %want_packages = (
'TopOfDistro' => '0.01',
'InsideLib' => '0.01',
);
_test_inspect_entry_for_distro( $distro_to_test, \%want_packages );
}
sub _test_inspect_entry_for_distro {
my $distro = shift;
my $want_packages = shift;
# inspect_entry() relies upon a global variable $topdir which
# we is declared with 'our' in Index.pm so we can set it here for testing.
$CPAN::Site::Index::topdir = "$Bin/test_data";
# inspect_entry is called in Index.pm using File::Find
# find { wanted => \&inspect_entry, no_chdir => 1 }, $topdir;
# so we set two variables that File::Find normally sets:
$File::Find::name = "$CPAN::Site::Index::topdir/$distro";
$File::Find::dir = $CPAN::Site::Index::topdir;
note("Checking $File::Find::name in $File::Find::dir");
$CPAN::Site::Index::findpkgs = {};
CPAN::Site::Index::inspect_entry();
my @missing_pkgs = ();
foreach my $want_pkg ( sort keys %{$want_packages} ) {
my $have_package = exists $CPAN::Site::Index::findpkgs->{$want_pkg};
ok( $have_package, "Found package '$want_pkg' in tarball." )
|| push @missing_pkgs, $want_pkg;
SKIP: {
skip( "Didn't find '$want_pkg', no point in testing VERSION", 1 )
unless $have_package;
my $have_version = $CPAN::Site::Index::findpkgs->{$want_pkg}->[0];
my $want_version = $want_packages->{$want_pkg};
is( $have_version, $want_version,
"Got expected version of $want_pkg" );
}
}
if (@missing_pkgs) {
diag(
"Missing packages: @missing_pkgs\n\n",
'Packages found: ',
explain($CPAN::Site::Index::findpkgs)
);
}
my @unexpected_packages = ();
foreach my $got_package ( sort keys %{$CPAN::Site::Index::findpkgs} ) {
if ( not exists $want_packages->{$got_package} ) {
push @unexpected_packages, $got_package;
}
}
is( scalar @unexpected_packages,
0, "No unexpected packages found in $distro" )
|| diag(
"Got unexpected packages in distro '$distro':\n\t",
join( "\n\t", @unexpected_packages ),
);
#diag Test::More::explain($CPAN::Site::Index::findpkgs);
}