# $Id: 05meta_update.t 31 2011-06-12 22:56:18Z stro $
use strict;
use warnings;
use Test::More;
use File::Spec;
use Cwd;
use File::Copy;
use File::Path;
use Config;
use FindBin;
use CPAN::DistnameInfo;
use CPAN::SQLite::Util qw(download);
use lib "$FindBin::Bin/lib";
use TestSQL qw($mods $auths $dists has_hash_data vcmp);
my $cwd = cwd;
my $path_sep = $Config{path_sep} || ':';
$ENV{PERL5LIB} = join $path_sep,
(File::Spec->catdir($cwd, qw(t dot-cpan)),
map {File::Spec->catdir($cwd, 'blib', $_)} qw(arch lib) ), $ENV{PERL5LIB};
# so that a real $HOME/.cpan isn't used
$ENV{HOME} = File::Spec->catdir($cwd, qw(t dot-cpan));
# hack to get tests to pass on Darwin, as File::HomeDir
# doesn't use HOME or PERL5LIB to specify where CPAN::MyConfig lives
$ENV{CPAN_SQLITE_TESTING} = 1;
unshift @INC, File::Spec->catdir($cwd, qw(t dot-cpan));
eval { require CPAN::MyConfig;
require CPAN;
require CPAN::HandleConfig;
require CPAN::Version; };
my $min_cpan_v = '1.88_64';
my $actual_cpan_v = $CPAN::VERSION;
# older CPAN::Version's seem to have problems with underscores
$min_cpan_v =~ s/_//g;
$actual_cpan_v =~ s/_//g if $actual_cpan_v;
if ($@ or CPAN::Version->vcmp($actual_cpan_v, $min_cpan_v) < 0) {
plan skip_all => qq{Need CPAN.pm version $min_cpan_v or higher};
}
else {
plan tests => 2768;
}
# verify that we loaded the right CPAN::Config
is($CPAN::Config->{QAZWSX}, 'PLMOKN');
my $home = $CPAN::Config->{cpan_home};
my $db = File::Spec->catfile($home, 'cpandb.sql');
my $sources = $CPAN::Config->{keep_source_where};
is(-e $db, 1, "$db exists");
is(-s $db > 0, 1, "$db has non-zero size");
for my $mod_search (qw(net ^uri::.*da)) {
for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) {
my $mod_name = $mod->id;
is(defined $mods->{$mod_name}, 1, $mod_name);
like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
}
for my $mod_search (qw(CPAN MP)) {
for my $bundle (CPAN::Shell->expand("Bundle", "/$mod_search/")) {
my $mod_name = $bundle->id;
is(defined $mods->{$mod_name}, 1, $mod_name);
like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
}
for my $dist_search(qw(apache test.*perl)) {
for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) {
my $id = $dist->id;
my $pathname = "authors/id/$id";
my $d = CPAN::DistnameInfo->new($pathname);
my $dist_name = $d->dist;
is(defined $dists->{$dist_name}, 1, $dist_name);
my $cpanid = $dist->author->id;
my $download = download($cpanid, $dists->{$dist_name}->{dist_file});
is($id, $download, $download);
is($cpanid, $dists->{$dist_name}->{cpanid},
$dists->{$dist_name}->{cpanid});
my %mods = map {$_ => 1 } $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
}
for my $auth_search (qw(G G\w+A)) {
for my $auth (CPAN::Shell->expand("Author", "/$auth_search/")) {
my $id = $auth->id;
is(defined $auths->{$id}, 1, $id);
foreach (qw(fullname email)) {
next unless $auths->{$id}->{$_};
is($auth->$_, $auths->{$id}->{$_}, $auths->{$id}->{$_});
}
}
}
{
my $mod_name = q{Date::Language};
my $mod = CPAN::Shell->expand("Module", $mod_name);
is($mod->id, $mod_name);
like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
{
my $dist_file = q{TimeDate-1.16.tar.gz};
my $dist_name = q{TimeDate};
my $cpanid = q{GBARR};
my $query = "$cpanid/$dist_file";
my $dist = CPAN::Shell->expand("Distribution", $query);
my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file});
is($dist->id, $dist_id);
is($dist->author->id, $cpanid);
my %mods = map {$_ => 1 } $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
for my $mod_search (qw(Apache::)) {
for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) {
my $mod_name = $mod->id;
is(defined $mods->{$mod_name}, 1, $mod_name);
like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
}
{
my $dist_file = q{Apache-GzipChain-1.14.tar.gz};
my $dist_name = q{Apache-GzipChain};
my $cpanid = q{ANDK};
my $query = "$cpanid/$dist_file";
my $dist = CPAN::Shell->expand("Distribution", $query);
my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file});
is($dist->id, $dist_id);
is($dist->author->id, $cpanid);
my %mods = map {$_ => 1 } $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
for my $dist_search(qw(CPAN-Test)) {
for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) {
my $id = $dist->id;
my $pathname = "authors/id/$id";
my $d = CPAN::DistnameInfo->new($pathname);
my $dist_name = $d->dist;
is(defined $dists->{$dist_name}, 1, $dist_name);
my $cpanid = $dist->author->id;
my $download = download($cpanid, $dists->{$dist_name}->{dist_file});
is($id, $download, $download);
is($cpanid, $dists->{$dist_name}->{cpanid},
$dists->{$dist_name}->{cpanid});
my %mods = map {$_ => 1 } $dist->containsmods;
my $mods = $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
}
{
my $dist_file = q{CPAN-Test-Dummy-Perl5-Make-1.05.tar.gz};
my $dist_name = q{CPAN-Test-Dummy-Perl5-Make};
my $cpanid = q{ANDK};
my $query = "$cpanid/$dist_file";
my $dist = CPAN::Shell->expand("Distribution", $query);
my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file});
is($dist->id, $dist_id);
is($dist->author->id, $cpanid);
my %mods = map {$_ => 1 } $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
foreach my $cpanid (keys %$auths) {
my $auth = CPAN::Shell->expand("Author", $cpanid);
is($auth->id, $cpanid, "verify '$cpanid'");
foreach (qw(fullname email)) {
next unless $auths->{$cpanid}->{$_};
is($auth->$_, $auths->{$cpanid}->{$_});
}
}
foreach my $mod_name (keys %$mods) {
next if $mod_name =~ /^Bundle/;
my $mod = CPAN::Shell->expand("Module", $mod_name);
is($mod->id, $mod_name);
like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
foreach my $mod_name (keys %$mods) {
next unless ($mod_name =~ /^Bundle::/);
my $bundle = CPAN::Shell->expand("Bundle", $mod_name);
is($bundle->id, $mod_name);
like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/,
$mods->{$mod_name}->{dist_name});
next unless $mods->{$mod_name}->{mod_vers};
is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0,
"version $mods->{$mod_name}->{mod_vers} for '$mod_name'");
}
for my $dist_name(keys %$dists) {
my $dist_file = $dists->{$dist_name}->{dist_file};
my $cpanid = $dists->{$dist_name}->{cpanid};
my $query = "$cpanid/$dist_file";
my $dist = CPAN::Shell->expand("Distribution", $query);
my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file});
is($dist->id, $dist_id);
is($dist->author->id, $cpanid);
my %mods = map {$_ => 1 } $dist->containsmods;
foreach my $mod(keys %{$dists->{$dist_name}->{modules}}) {
is($mods{$mod}, 1, $mod);
}
}
my $no_such = 'ZZZ';
foreach my $type(qw(Author Distribution Module)) {
my $query = ($type eq 'Distribution') ? "/$no_such/" : $no_such;
my $item = CPAN::Shell->expand($type, $query);
is($item, undef, "no such $type");
next if $type eq 'Distribution';
$item = CPAN::Shell->expand($type, "/$no_such/");
is($item, undef, "no such $type");
}
rmtree($sources) if -d $sources;
unlink($db) if -e $db;
# Local Variables:
# mode: cperl
# cperl-indent-level: 2
# End: