The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# $Id: 03info.t 42 2013-06-29 20:44:17Z stro $

use strict;
use warnings;
use Test::More;
use Cwd;
use File::Spec::Functions;
use File::Path;
use CPAN::DistnameInfo;
use FindBin;
use lib "$FindBin::Bin/lib";
use TestSQL qw($mods $auths $dists has_hash_data);
use CPAN::SQLite::Info;

plan tests => 2929;

my $cwd = getcwd;
my $CPAN = catdir $cwd, 't', 'cpan';
my $t_dir = catdir $cwd, 't';

my $db_name = 'cpandb.sql';
my $db_dir = $cwd;
unlink($db_name) if (-e $db_name);

ok (-d $CPAN);
use CPAN::SQLite::Info;
my $info = CPAN::SQLite::Info->new(CPAN => $CPAN, db_dir => $db_dir);
isa_ok($info, 'CPAN::SQLite::Info');

$info->fetch_info();
my $info_dists = $info->{dists};
my $info_mods = $info->{mods};
my $info_auths = $info->{auths};

ok(has_hash_data($info_dists));
ok(has_hash_data($info_mods));
ok(has_hash_data($info_auths));

foreach my $cpanid (keys %$auths) {
  ok(defined $info_auths->{$cpanid});
  foreach (qw(fullname email)) {
    next unless $auths->{$cpanid}->{$_};
    is($info_auths->{$cpanid}->{$_}, $auths->{$cpanid}->{$_});
  }
}

foreach my $dist_name (keys %$dists) {
  ok(defined $info_dists->{$dist_name});
  foreach (qw(dist_vers dist_file dist_abs dist_dslip cpanid)) {
    next unless $dists->{$dist_name}->{$_};
    is($info_dists->{$dist_name}->{$_}, $dists->{$dist_name}->{$_});
  }
  my $modules = $dists->{$dist_name}->{modules};
  if (has_hash_data($modules)) {
    foreach my $key(keys %$modules) {
      ok(exists $info_dists->{$dist_name}->{modules}->{$key});
      next unless $modules->{$key};
      is($info_dists->{$dist_name}->{modules}->{$key}, $modules->{$key});
    }
  }
  my $chapterid = $dists->{$dist_name}->{chapterid};
  if (has_hash_data($chapterid)) {
    foreach my $key(keys %$chapterid) {
      ok(exists $info_dists->{$dist_name}->{chapterid}->{$key});
      foreach my $subchapter (keys %{$chapterid->{$key}}) {
        is($info_dists->{$dist_name}->{chapterid}->{$key}->{$subchapter},
           $chapterid->{$key}->{$subchapter});
      }
    }
  }
}

foreach my $mod_name (keys %$mods) {
  ok(defined $info_mods->{$mod_name});
  foreach (qw(mod_abs chapterid dist_name dslip mod_vers)) {
    next unless $mods->{$mod_name}->{$_};
    is($info_mods->{$mod_name}->{$_}, $mods->{$mod_name}->{$_});
  }
}

ok(not defined $info->{auths}->{ZZZ});
ok(not defined $info->{mods}->{ZZZ});
ok(not defined $info->{dists}->{ZZZ});

my @tables = qw(dists mods auths info);
my $index;
my $package = 'CPAN::SQLite::Index';
foreach my $table(@tables) {
  my $class = $package . '::' . $table;
  my $this = {info => $info->{$table}};
  $index->{$table} = bless $this, $class;
}

use CPAN::SQLite::DBI qw($tables);
my $cdbi = CPAN::SQLite::DBI::Index->new(CPAN => $CPAN,
                                         db_name => $db_name,
                                         db_dir => $db_dir);
isa_ok($cdbi, 'CPAN::SQLite::DBI::Index');

use CPAN::SQLite::Populate;
my $pop = CPAN::SQLite::Populate->new(db_name => $db_name,
                                      db_dir => $db_dir,
                                      setup => 1,
                                      CPAN => $CPAN,
                                      index => $index);
isa_ok($pop, 'CPAN::SQLite::Populate');
$pop->populate();
ok(1);