The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 11;

use CPAN::Mini::Inject;
use File::Path;
use File::Copy;
use File::Basename;
use Compress::Zlib;

rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
copy(
  't/local/CPAN/modules/02packages.details.txt.gz.original',
  't/local/CPAN/modules/02packages.details.txt.gz'
);
chmod oct(666), 't/local/CPAN/modules/02packages.details.txt.gz';
chmod oct(666), "t/local/CPAN/authors/01mailrc.txt.gz" if -f "t/local/CPAN/authors/01mailrc.txt.gz";
rmtree( ['t/local/CPAN/authors'], 0, 1 );
mkdir( 't/local/CPAN/authors' );
copy(
  't/local/01mailrc.txt.gz.original',
  't/local/CPAN/authors/01mailrc.txt.gz'
);
chmod oct(666), 't/local/CPAN/authors/01mailrc.txt.gz';
mkdir( 't/local/MYCPAN' );

my $mcpi;
my $module = "S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz";

$mcpi = CPAN::Mini::Inject->new;

## add three modules (one that was already there, to make sure it isn't
## duplicated in the output)
$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg->readlist->add(
  module   => 'CPAN::Mini::Inject',
  authorid => 'SSORICHE',
  version  => '0.01',
  file     => 't/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz'
 )->add(
  module   => 'CPAN::Mini::Inject',
  authorid => 'SSORICHE',
  version  => '0.02',
  file     => 't/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz'
 )->add(
  module   => 'CPAN::Mini',
  authorid => 'RJBS',
  version  => '0.17',
  file     => 't/local/mymodules/CPAN-Mini-0.17.tar.gz',
 )->writelist;

ok( $mcpi->inject,                        'Copy modules' );
ok( -e "t/local/CPAN/authors/id/$module", 'Module file exists' );
ok( -e 't/local/CPAN/authors/id/S/SS/SSORICHE/CHECKSUMS',
  'Checksum created' );

SKIP: {
  skip "Not a UNIX system", 3 if ( $^O =~ /^MSWin/ );
  is( ( stat( "t/local/CPAN/authors/id/$module" ) )[2] & 07777,
    0664, 'Module file mode set' );
  is(
    ( stat( dirname( "t/local/CPAN/authors/id/$module" ) ) )[2] & 07777,
    0775,
    'Author directory mode set'
  );
  is(
    ( stat( 't/local/CPAN/authors/id/S/SS/SSORICHE/CHECKSUMS' ) )[2]
     & 07777,
    0664,
    'Checksum file mode set'
  );
}

my @goodfile = <DATA>;
ok( my $gzread
   = gzopen( 't/local/CPAN/modules/02packages.details.txt.gz', 'rb' ) );

my @packages;
my $package;
while ( $gzread->gzreadline( $package ) ) {
  if ( $package =~ /^Written-By:/ ) {
    push( @packages, "Written-By:\n" );
    next;
  }
  if ( $package =~ /^Last-Updated:/ ) {
    push( @packages, "Last-Updated:\n" );
    next;
  }
  push( @packages, $package );
}
$gzread->gzclose;

is_deeply( \@goodfile, \@packages );

ok( my $gzauthread
   = gzopen( 't/local/CPAN/authors/01mailrc.txt.gz', 'rb' ) );

my $author;
my $author_was_injected = 0;
while ( $gzauthread->gzreadline( $author ) ) {
  if ( $author =~ /SSORICHE/ ) {
    $author_was_injected++;
  }
}
$gzauthread->gzclose;
ok( $author_was_injected,      'author injected into 01mailrc.txt.gz' );
ok( $author_was_injected == 1, 'author injected exactly 1 time' );

unlink( 't/local/CPAN/authors/id/S/SS/SSORICHE/CHECKSUMS' );
unlink( "t/local/CPAN/authors/id/$module" );
unlink( 't/local/MYCPAN/modulelist' );
unlink( 't/local/CPAN/modules/02packages.details.txt.gz' );

rmtree( [ 't/local/CPAN/authors', 't/local/MYCPAN' ], 0, 1 );

__DATA__
File:         02packages.details.txt
URL:          http://www.perl.com/CPAN/modules/02packages.details.txt
Description:  Package names found in directory $CPAN/authors/id/
Columns:      package name, version, path
Intended-For: Automated fetch routines, namespace documentation.
Written-By:
Line-Count:   7
Last-Updated:

abbreviation                       0.02  M/MI/MIYAGAWA/abbreviation-0.02.tar.gz
Acme::Code::Police               2.1828  O/OV/OVID/Acme-Code-Police-2.1828.tar.gz
BFD                                0.31  R/RB/RBS/BFD-0.31.tar.gz
CPAN::Mini                         0.17  R/RJ/RJBS/CPAN-Mini-0.17.tar.gz
CPAN::Mini::Inject                 0.02  S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz
CPAN::Nox                          1.02  A/AN/ANDK/CPAN-1.76.tar.gz
CPANPLUS                          0.049  A/AU/AUTRIJUS/CPANPLUS-0.049.tar.gz