summaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
Diffstat (limited to 't')
-rw-r--r--t/.mcpani/config5
-rw-r--r--t/.mcpani/config_bad5
-rw-r--r--t/.mcpani/config_badremote5
-rw-r--r--t/.mcpani/config_mcpi3
-rw-r--r--t/.mcpani/config_noread3
-rw-r--r--t/.mcpani/config_norepo2
-rw-r--r--t/.mcpani/config_nowrite3
-rw-r--r--t/.mcpani/config_with_whitespaces6
-rw-r--r--t/00.load.t19
-rw-r--r--t/add-multiple.t72
-rw-r--r--t/add.t55
-rw-r--r--t/html/01mailrc.txt.gzbin0 -> 49 bytes
-rw-r--r--t/html/02packages.details.txt.gzbin0 -> 356 bytes
-rw-r--r--t/html/03modlist.data.gzbin0 -> 53 bytes
-rw-r--r--t/html/CHECKSUMS1
-rw-r--r--t/html/CPAN-Mini-2.1828.tar.gz1
-rw-r--r--t/html/CPAN-Mini-Inject-1.01.tar.gz1
-rw-r--r--t/html/index.html5
-rw-r--r--t/inject.t128
-rw-r--r--t/lib/CPANServer.pm46
-rw-r--r--t/lib/filenames.pl46
-rw-r--r--t/loadcfg.t40
-rw-r--r--t/local/01mailrc.txt.gz.originalbin0 -> 166 bytes
-rw-r--r--t/local/CPAN/modules/02packages.details.txt.gz.originalbin0 -> 429 bytes
-rw-r--r--t/local/mymodules/CPAN-Mini-0.17.tar.gz0
-rw-r--r--t/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz0
-rw-r--r--t/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gzbin0 -> 878 bytes
-rw-r--r--t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gzbin0 -> 513 bytes
-rw-r--r--t/local/mymodules/not-discoverable.tar.gz0
-rw-r--r--t/new.t6
-rw-r--r--t/parsecfg.t25
-rw-r--r--t/pod-coverage.t6
-rw-r--r--t/pod.t4
-rw-r--r--t/private.t34
-rw-r--r--t/read/MYCPAN/modulelist3
-rw-r--r--t/read/MYCPAN/test-0.01.tar.gz0
-rw-r--r--t/read/authors/01mailrc.txt.gz1
-rw-r--r--t/readlist.t35
-rw-r--r--t/testremote.t44
-rw-r--r--t/update_mirror.t63
-rw-r--r--t/writelist.t32
-rw-r--r--t/zz.exceptions.t172
42 files changed, 871 insertions, 0 deletions
diff --git a/t/.mcpani/config b/t/.mcpani/config
new file mode 100644
index 0000000..40403b6
--- /dev/null
+++ b/t/.mcpani/config
@@ -0,0 +1,5 @@
+local: t/local/CPAN
+remote : http://localhost:11027
+repository: t/local/MYCPAN
+dirmode: 0775
+passive: yes
diff --git a/t/.mcpani/config_bad b/t/.mcpani/config_bad
new file mode 100644
index 0000000..9c345d3
--- /dev/null
+++ b/t/.mcpani/config_bad
@@ -0,0 +1,5 @@
+# This file is missing a local setting.
+remote : http://www.cpan.org
+repository: t/local/MYCPAN
+passive: yes
+This line will be ignored
diff --git a/t/.mcpani/config_badremote b/t/.mcpani/config_badremote
new file mode 100644
index 0000000..8cab746
--- /dev/null
+++ b/t/.mcpani/config_badremote
@@ -0,0 +1,5 @@
+local: t/local/CPAN
+remote : http://blahblah http://localhost:11027
+repository: t/local/MYCPAN
+dirmode: 0775
+passive: yes
diff --git a/t/.mcpani/config_mcpi b/t/.mcpani/config_mcpi
new file mode 100644
index 0000000..b06d530
--- /dev/null
+++ b/t/.mcpani/config_mcpi
@@ -0,0 +1,3 @@
+remote: http://www.cpan.org http://localhost
+local: t/local/CPAN
+repository: t/read/MYCPAN
diff --git a/t/.mcpani/config_noread b/t/.mcpani/config_noread
new file mode 100644
index 0000000..c970925
--- /dev/null
+++ b/t/.mcpani/config_noread
@@ -0,0 +1,3 @@
+local: t/local/CPAN
+remote : http://www.cpan.org
+repository: t/local/WRITEREPO
diff --git a/t/.mcpani/config_norepo b/t/.mcpani/config_norepo
new file mode 100644
index 0000000..dbb8e8a
--- /dev/null
+++ b/t/.mcpani/config_norepo
@@ -0,0 +1,2 @@
+local: t/local/CPAN
+remote : http://www.cpan.org
diff --git a/t/.mcpani/config_nowrite b/t/.mcpani/config_nowrite
new file mode 100644
index 0000000..ffb6f18
--- /dev/null
+++ b/t/.mcpani/config_nowrite
@@ -0,0 +1,3 @@
+local: t/read/CPAN
+remote : http://www.cpan.org
+repository: t/read/MYCPAN
diff --git a/t/.mcpani/config_with_whitespaces b/t/.mcpani/config_with_whitespaces
new file mode 100644
index 0000000..cd86168
--- /dev/null
+++ b/t/.mcpani/config_with_whitespaces
@@ -0,0 +1,6 @@
+ # all config lines with trailing whitespaces
+ local : t/local/CPAN
+ remote : http://localhost:11027
+ repository : t/local/MYCPAN
+ dirmode : 0775
+ passive : yes
diff --git a/t/00.load.t b/t/00.load.t
new file mode 100644
index 0000000..35ba62b
--- /dev/null
+++ b/t/00.load.t
@@ -0,0 +1,19 @@
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok( 'CPAN::Mini::Inject' );
+}
+
+diag( "Testing CPAN::Mini::Inject $CPAN::Mini::Inject::VERSION" );
+
+# Setup for other tests
+
+mkdir( 't/local/WRITEREPO' );
+open( WRITEFILE, '>', 't/local/WRITEREPO/modulelist' );
+close( WRITEFILE );
+chmod( 0222, 't/local/WRITEREPO/modulelist' );
+
+chmod( 0555, 't/read/MYCPAN' );
+chmod( 0444, 't/read/MYCPAN/modulelist' );
+chmod( 0444, 't/read/MYCPAN/test-0.01.tar.gz' );
+
diff --git a/t/add-multiple.t b/t/add-multiple.t
new file mode 100644
index 0000000..8aad410
--- /dev/null
+++ b/t/add-multiple.t
@@ -0,0 +1,72 @@
+use Test::More tests => 13;
+
+use CPAN::Mini::Inject;
+use File::Path;
+
+mkdir( 't/local/MYCPAN' );
+
+my $mcpi;
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg;
+
+$mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01',
+ file => 't/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz'
+ )->add(
+ #module => 'Dist::Metadata::Test::MetaFile',
+ authorid => 'RWSTAUNER',
+ #version => '2.1',
+ file => 't/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz'
+ )->add(
+ module => 'Dist::Metadata::Test::MetaFile',
+ authorid => 'RWSTAUNER',
+ version => '2.3', # package versions do not match this
+ file => 't/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz'
+ )->add(
+ authorid => 'RWSTAUNER',
+ file => 't/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz'
+ );
+
+my $auth_path = File::Spec->catfile( 'R', 'RW', 'RWSTAUNER' );
+is( $mcpi->{authdir}, $auth_path, 'author directory' );
+
+foreach $dist ( qw(
+ t/local/MYCPAN/authors/id/S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz
+ t/local/MYCPAN/authors/id/R/RW/RWSTAUNER/Dist-Metadata-Test-MetaFile-2.2.tar.gz
+ t/local/MYCPAN/authors/id/R/RW/RWSTAUNER/Dist-Metadata-Test-MetaFile-Only.tar.gz
+) ) {
+ ok( -r $dist, "Added module '$dist' is readable" );
+}
+
+foreach $line (
+ 'CPAN::Mini::Inject 0.01 S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz',
+ 'Dist::Metadata::Test::MetaFile::PM 2.0 R/RW/RWSTAUNER/Dist-Metadata-Test-MetaFile-2.2.tar.gz',
+ 'Dist::Metadata::Test::MetaFile 2.1 R/RW/RWSTAUNER/Dist-Metadata-Test-MetaFile-2.2.tar.gz',
+ 'Dist::Metadata::Test::MetaFile::DiffName 0.02 R/RW/RWSTAUNER/Dist-Metadata-Test-MetaFile-Only.tar.gz',
+) {
+ ok( grep( /$line/, @{ $mcpi->{modulelist} } ), 'Module added to list' )
+ or diag explain [$line, $mcpi->{modulelist}];
+
+ my $pack = ($line =~ /^(\S+)/)[0];
+ is( grep( /^$pack\s+/, @{ $mcpi->{modulelist} } ),
+ 1, 'Module added to list just once' );
+}
+
+is_deeply(
+ [$mcpi->added_modules],
+ [
+ { file => 'CPAN-Mini-Inject-0.01.tar.gz', authorid => 'SSORICHE', modules => {'CPAN::Mini::Inject' => '0.01'} },
+ { file => 'Dist-Metadata-Test-MetaFile-2.2.tar.gz', authorid => 'RWSTAUNER',
+ modules => { 'Dist::Metadata::Test::MetaFile::PM' => '2.0', 'Dist::Metadata::Test::MetaFile' => '2.1' } },
+ # added twice (bug in usage not in reporting)
+ { file => 'Dist-Metadata-Test-MetaFile-2.2.tar.gz', authorid => 'RWSTAUNER',
+ modules => { 'Dist::Metadata::Test::MetaFile::PM' => '2.0', 'Dist::Metadata::Test::MetaFile' => '2.1' } },
+ { file => 'Dist-Metadata-Test-MetaFile-Only.tar.gz', authorid => 'RWSTAUNER',
+ modules => {'Dist::Metadata::Test::MetaFile::DiffName' => '0.02'} },
+ ],
+ 'info for added modules'
+);
+
+rmtree( 't/local/MYCPAN', 0, 1 );
diff --git a/t/add.t b/t/add.t
new file mode 100644
index 0000000..1e52bfb
--- /dev/null
+++ b/t/add.t
@@ -0,0 +1,55 @@
+use Test::More tests => 6;
+
+use CPAN::Mini::Inject;
+use File::Path;
+
+mkdir( 't/local/MYCPAN' );
+
+my $mcpi;
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg;
+
+$mcpi->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'
+ );
+
+my $soriche_path = File::Spec->catfile( 'S', 'SS', 'SSORICHE' );
+is( $mcpi->{authdir}, $soriche_path, 'author directory' );
+ok(
+ -r 't/local/MYCPAN/authors/id/S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz',
+ 'Added module is readable'
+);
+my $module
+ = "CPAN::Mini::Inject 0.02 S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz";
+ok( grep( /$module/, @{ $mcpi->{modulelist} } ),
+ 'Module added to list' );
+is( grep( /^CPAN::Mini::Inject\s+/, @{ $mcpi->{modulelist} } ),
+ 1, 'Module added to list just once' );
+
+SKIP: {
+ skip "Not a UNIX system", 2 if ( $^O =~ /^MSWin/ );
+ is( ( stat( 't/local/MYCPAN/authors/id/S/SS/SSORICHE' ) )[2] & 07777,
+ 0775, 'Added author directory mode is 0775' );
+ is(
+ (
+ stat(
+ 't/local/MYCPAN/authors/id/S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz'
+ )
+ )[2] & 07777,
+ 0664,
+ 'Added module mode is 0664'
+ );
+}
+
+# XXX do the same test as above again, but this time with a ->readlist after
+# the ->parsecfg
+
+rmtree( 't/local/MYCPAN', 0, 1 );
diff --git a/t/html/01mailrc.txt.gz b/t/html/01mailrc.txt.gz
new file mode 100644
index 0000000..7bee62a
--- /dev/null
+++ b/t/html/01mailrc.txt.gz
Binary files differ
diff --git a/t/html/02packages.details.txt.gz b/t/html/02packages.details.txt.gz
new file mode 100644
index 0000000..79ce42c
--- /dev/null
+++ b/t/html/02packages.details.txt.gz
Binary files differ
diff --git a/t/html/03modlist.data.gz b/t/html/03modlist.data.gz
new file mode 100644
index 0000000..689b691
--- /dev/null
+++ b/t/html/03modlist.data.gz
Binary files differ
diff --git a/t/html/CHECKSUMS b/t/html/CHECKSUMS
new file mode 100644
index 0000000..2a02d41
--- /dev/null
+++ b/t/html/CHECKSUMS
@@ -0,0 +1 @@
+TEST
diff --git a/t/html/CPAN-Mini-2.1828.tar.gz b/t/html/CPAN-Mini-2.1828.tar.gz
new file mode 100644
index 0000000..2a02d41
--- /dev/null
+++ b/t/html/CPAN-Mini-2.1828.tar.gz
@@ -0,0 +1 @@
+TEST
diff --git a/t/html/CPAN-Mini-Inject-1.01.tar.gz b/t/html/CPAN-Mini-Inject-1.01.tar.gz
new file mode 100644
index 0000000..2a02d41
--- /dev/null
+++ b/t/html/CPAN-Mini-Inject-1.01.tar.gz
@@ -0,0 +1 @@
+TEST
diff --git a/t/html/index.html b/t/html/index.html
new file mode 100644
index 0000000..9cbf947
--- /dev/null
+++ b/t/html/index.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+<h1>Index</h1>
+</body>
+</html>
diff --git a/t/inject.t b/t/inject.t
new file mode 100644
index 0000000..dfc03a2
--- /dev/null
+++ b/t/inject.t
@@ -0,0 +1,128 @@
+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: 6
+Last-Updated:
+
+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
diff --git a/t/lib/CPANServer.pm b/t/lib/CPANServer.pm
new file mode 100644
index 0000000..90a5cc9
--- /dev/null
+++ b/t/lib/CPANServer.pm
@@ -0,0 +1,46 @@
+package CPANServer;
+
+use strict;
+use warnings;
+use base qw(HTTP::Server::Simple::CGI);
+use File::Spec::Functions;
+
+sub handle_request {
+ my $self = shift;
+ my $cgi = shift;
+
+ my $file = ( split( '/', $cgi->path_info ) )[-1];
+ $file = 'index.html' unless ( $file );
+ open( INFILE, catfile( 't', 'html', $file ) )
+ or die "Can't open file $file: $@";
+ print $_ while ( <INFILE> );
+ close( INFILE );
+}
+
+our %env_mapping = (
+ protocol => "SERVER_PROTOCOL",
+ localport => "SERVER_PORT",
+ localname => "SERVER_NAME",
+ path => "PATH_INFO",
+ request_uri => "REQUEST_URI",
+ method => "REQUEST_METHOD",
+ peeraddr => "REMOTE_ADDR",
+ peername => "REMOTE_HOST",
+ query_string => "QUERY_STRING",
+);
+
+sub setup {
+ no warnings 'uninitialized';
+ my $self = shift;
+
+ while ( my ( $item, $value ) = splice @_, 0, 2 ) {
+ if ( $self->can( $item ) ) {
+ $self->$item( $value );
+ }
+ if ( my $k = $env_mapping{$item} ) {
+ $ENV{$k} = $value;
+ }
+ }
+}
+
+1;
diff --git a/t/lib/filenames.pl b/t/lib/filenames.pl
new file mode 100644
index 0000000..504b4bf
--- /dev/null
+++ b/t/lib/filenames.pl
@@ -0,0 +1,46 @@
+$WriteRepo = catfile( qw(t local WRITEREPO) );
+
+%MYCPAN => ( dir => catfile( qw(t read MYCPAN) ), );
+
+my @files = qw(modulelist test-0.01.tar.gz);
+$MYCPAN{@files} = map { catfile( $MYCPAN{dir}, $_ ) } @files;
+
+return 1 if ( -r '/usr/local/etc/mcpani' );
+return 1 if ( -r '/etc/mcpani' );
+
+# parsecfg()
+dies_ok { $mcpi->parsecfg( catfile( qw(t .mcpani config_bad) ) ); }
+'Missing config option';
+
+mkdir catfile( qw(t local MYCPAN) );
+$mcpi->parsecfg( catfile( qw(t .mcpani config_noread) ) );
+dies_ok { $mcpi->readlist } 'unreadable file';
+
+$mcpi->parsecfg( catfile( qw(t .mcpani config) ) );
+
+$mcpi->parsecfg( catfile( qw(t .mcpani config_norepo) ) );
+
+dies_ok {
+ $mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01',
+ file => 'test-0.01.tar.gz'
+ );
+}
+'Missing config repository';
+
+$mcpi->parsecfg( catfile( qw(t .mcpani config_read) ) );
+
+$mcpi->parsecfg( catfile( qw(t .mcpani config_nowrite) ) );
+dies_ok { $mcpi->writelist } 'fail write file';
+
+mkdir catfile( qw(t local WRITEREPO) );
+open WRITEFILE, '>', catfile( qw(t local WRITEREPO modulelist) );
+close WRITEFILE;
+chmod 0222, catfile( qw(t local WRITEREPO modulelist) );
+
+chmod 0555, catfile( qw(t read MYCPAN) );
+chmod 0444, catfile( qw(t read MYCPAN modulelist) );
+chmod 0444, catfile( qw(t read MYCPAN test-0.01.tar.gz) );
+
diff --git a/t/loadcfg.t b/t/loadcfg.t
new file mode 100644
index 0000000..4e8fcb5
--- /dev/null
+++ b/t/loadcfg.t
@@ -0,0 +1,40 @@
+use Test::More tests => 3;
+
+use CPAN::Mini::Inject;
+use Env;
+
+sub chkcfg {
+ return 1 if ( -r '/usr/local/etc/mcpani' );
+ return 1 if ( -r '/etc/mcpani' );
+}
+
+my $prevhome;
+if ( defined( $ENV{HOME} ) ) {
+ $prevhome = $ENV{HOME};
+ delete $ENV{HOME};
+}
+
+my $mcpanienv;
+if ( defined( $ENV{MCPANI_CONFIG} ) ) {
+ $mcpanienv = $ENV{MCPANI_CONFIG};
+ delete $ENV{MCPANI_CONFIG};
+}
+
+my $native_path = File::Spec->catfile( qw( t .mcpani config ) );
+my $mcpi = CPAN::Mini::Inject->new;
+
+$mcpi->loadcfg( $native_path );
+is( $mcpi->{cfgfile}, $native_path );
+
+$ENV{HOME} = 't';
+$mcpi->loadcfg;
+is( $mcpi->{cfgfile}, $native_path );
+
+$ENV{MCPANI_CONFIG} = $native_path;
+$mcpi->loadcfg;
+is( $mcpi->{cfgfile}, $native_path );
+
+# XXX add tests for /usr/local/etc/mcpani and /etc/minicpani
+
+$ENV{MCPANI_CONFIG} = $mcpanienv if ( defined( $mcpanienv ) );
+$ENV{HOME} = $prevhome if ( defined( $prevhome ) );
diff --git a/t/local/01mailrc.txt.gz.original b/t/local/01mailrc.txt.gz.original
new file mode 100644
index 0000000..d14acf2
--- /dev/null
+++ b/t/local/01mailrc.txt.gz.original
Binary files differ
diff --git a/t/local/CPAN/modules/02packages.details.txt.gz.original b/t/local/CPAN/modules/02packages.details.txt.gz.original
new file mode 100644
index 0000000..60cdbd7
--- /dev/null
+++ b/t/local/CPAN/modules/02packages.details.txt.gz.original
Binary files differ
diff --git a/t/local/mymodules/CPAN-Mini-0.17.tar.gz b/t/local/mymodules/CPAN-Mini-0.17.tar.gz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/t/local/mymodules/CPAN-Mini-0.17.tar.gz
diff --git a/t/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz b/t/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/t/local/mymodules/CPAN-Mini-Inject-0.01.tar.gz
diff --git a/t/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz b/t/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz
new file mode 100644
index 0000000..3c49465
--- /dev/null
+++ b/t/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz
Binary files differ
diff --git a/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz b/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz
new file mode 100644
index 0000000..4af56c9
--- /dev/null
+++ b/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz
Binary files differ
diff --git a/t/local/mymodules/not-discoverable.tar.gz b/t/local/mymodules/not-discoverable.tar.gz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/t/local/mymodules/not-discoverable.tar.gz
diff --git a/t/new.t b/t/new.t
new file mode 100644
index 0000000..bedd1e6
--- /dev/null
+++ b/t/new.t
@@ -0,0 +1,6 @@
+use Test::More tests => 1;
+
+use CPAN::Mini::Inject;
+
+my $mcpi = CPAN::Mini::Inject->new;
+isa_ok( $mcpi, 'CPAN::Mini::Inject' );
diff --git a/t/parsecfg.t b/t/parsecfg.t
new file mode 100644
index 0000000..bbd0976
--- /dev/null
+++ b/t/parsecfg.t
@@ -0,0 +1,25 @@
+use Test::More tests => 11;
+
+use CPAN::Mini::Inject;
+
+my $mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' );
+$mcpi->parsecfg;
+is( $mcpi->{config}{local}, 't/local/CPAN' );
+is( $mcpi->{config}{remote}, 'http://localhost:11027' );
+is( $mcpi->{config}{repository}, 't/local/MYCPAN' );
+
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->parsecfg( 't/.mcpani/config' );
+is( $mcpi->{config}{local}, 't/local/CPAN' );
+is( $mcpi->{config}{remote}, 'http://localhost:11027' );
+is( $mcpi->{config}{repository}, 't/local/MYCPAN' );
+
+
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->parsecfg( 't/.mcpani/config_with_whitespaces' );
+is( $mcpi->{config}{local}, 't/local/CPAN' );
+is( $mcpi->{config}{remote}, 'http://localhost:11027' );
+is( $mcpi->{config}{repository}, 't/local/MYCPAN' );
+is( $mcpi->{config}{dirmode}, '0775' );
+is( $mcpi->{config}{passive}, 'yes' );
diff --git a/t/pod-coverage.t b/t/pod-coverage.t
new file mode 100644
index 0000000..963cbc9
--- /dev/null
+++ b/t/pod-coverage.t
@@ -0,0 +1,6 @@
+use Test::More;
+eval "use Test::Pod::Coverage 0.08";
+plan skip_all =>
+ "Test::Pod::Coverage 0.08 required for testing POD coverage"
+ if $@;
+all_pod_coverage_ok();
diff --git a/t/pod.t b/t/pod.t
new file mode 100644
index 0000000..437887a
--- /dev/null
+++ b/t/pod.t
@@ -0,0 +1,4 @@
+use Test::More;
+eval "use Test::Pod 1.00";
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+all_pod_files_ok();
diff --git a/t/private.t b/t/private.t
new file mode 100644
index 0000000..f1199ac
--- /dev/null
+++ b/t/private.t
@@ -0,0 +1,34 @@
+#!perl
+
+use strict;
+use warnings;
+
+use CPAN::Mini::Inject;
+use Test::More tests => 2;
+
+{
+ # _fmtmodule
+ my @tests = (
+ {
+ in => [ 'foo', 'foo.tar.gz', '0.01' ],
+ out => 'foo 0.01 foo.tar.gz',
+ },
+ {
+ in => [
+ 'fooIsAModuleWithAReallyLongNameSoLong'
+ . 'InFactThatItScrewsWithTheFormatting',
+ 'foo.tar.gz',
+ '0.01'
+ ],
+ out => 'fooIsAModuleWithAReallyLongNameSoLong'
+ . 'InFactThatItScrewsWithTheFormatting 0.01 foo.tar.gz',
+ },
+ );
+ for my $test ( @tests ) {
+ my $got = CPAN::Mini::Inject::_fmtmodule( @{ $test->{in} } );
+ is $got, $test->{out}, '_fmtmodule';
+ }
+}
+
+# vim:ts=2:sw=2:et:ft=perl
+
diff --git a/t/read/MYCPAN/modulelist b/t/read/MYCPAN/modulelist
new file mode 100644
index 0000000..c72f881
--- /dev/null
+++ b/t/read/MYCPAN/modulelist
@@ -0,0 +1,3 @@
+CPAN::Checksums 1.016 A/AN/ANDK/CPAN-Checksums-1.016.tar.gz
+CPAN::Mini 0.18 R/RJ/RJBS/CPAN-Mini-0.18.tar.gz
+CPANPLUS 0.0499 A/AU/AUTRIJUS/CPANPLUS-0.0499.tar.gz
diff --git a/t/read/MYCPAN/test-0.01.tar.gz b/t/read/MYCPAN/test-0.01.tar.gz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/t/read/MYCPAN/test-0.01.tar.gz
diff --git a/t/read/authors/01mailrc.txt.gz b/t/read/authors/01mailrc.txt.gz
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/t/read/authors/01mailrc.txt.gz
@@ -0,0 +1 @@
+test
diff --git a/t/readlist.t b/t/readlist.t
new file mode 100644
index 0000000..ad4635a
--- /dev/null
+++ b/t/readlist.t
@@ -0,0 +1,35 @@
+use Test::More tests => 2;
+
+use CPAN::Mini::Inject;
+use File::Path;
+
+rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+mkdir 't/local/MYCPAN';
+
+my $mcpi;
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg;
+
+$mcpi->readlist;
+is( $mcpi->{modulelist}, undef, 'Empty module list' );
+
+genmodlist();
+
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg->readlist;
+
+is( @{ $mcpi->{modulelist} }, 3, 'Read modulelist' );
+
+rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+
+sub genmodlist {
+ open( MODLIST, '>t/local/MYCPAN/modulelist' )
+ or die "Can not create t/local/MYCPAN/modulelist: $!";
+ print MODLIST << "EOF"
+CPAN::Checksums 1.016 A/AN/ANDK/CPAN-Checksums-1.016.tar.gz
+CPAN::Mini 0.18 R/RJ/RJBS/CPAN-Mini-0.18.tar.gz
+CPANPLUS 0.0499 A/AU/AUTRIJUS/CPANPLUS-0.0499.tar.gz
+EOF
+ ;
+ close( MODLIST );
+}
diff --git a/t/testremote.t b/t/testremote.t
new file mode 100644
index 0000000..900d3e8
--- /dev/null
+++ b/t/testremote.t
@@ -0,0 +1,44 @@
+use Test::More;
+
+use LWP;
+use CPAN::Mini::Inject;
+use lib 't/lib';
+
+BEGIN {
+ eval "use CPANServer";
+
+ plan skip_all => "HTTP::Server::Simple required to test update_mirror"
+ if $@;
+ plan tests => 3;
+}
+
+my $server = CPANServer->new( 11027 );
+my $pid = $server->background;
+ok( $pid, 'HTTP Server started' );
+# Give server time to get going.
+sleep 1;
+
+$SIG{__DIE__} = sub { kill( 9, $pid ) };
+
+my $mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg;
+
+$mcpi->testremote;
+is( $mcpi->{site}, 'http://localhost:11027/', 'Correct remote URL' );
+
+$mcpi->loadcfg( 't/.mcpani/config_badremote' )->parsecfg;
+
+SKIP: {
+ skip 'Test fails with funky DNS providers', 1
+ if can_fetch( 'http://blahblah' );
+ # This fails with OpenDNS &c
+ $mcpi->testremote;
+ is( $mcpi->{site}, 'http://localhost:11027/',
+ 'Selects correct remote URL' );
+}
+
+kill( 9, $pid );
+
+unlink( 't/testconfig' );
+
+sub can_fetch { LWP::UserAgent->new->get( shift )->is_success }
diff --git a/t/update_mirror.t b/t/update_mirror.t
new file mode 100644
index 0000000..c90cea2
--- /dev/null
+++ b/t/update_mirror.t
@@ -0,0 +1,63 @@
+use Test::More;
+use File::Spec::Functions;
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+BEGIN {
+ eval "use CPANServer";
+
+ plan skip_all => "HTTP::Server::Simple required to test update_mirror"
+ if $@;
+ plan tests => 8;
+}
+
+use CPAN::Mini::Inject;
+use File::Path;
+
+rmtree( [ catdir( 't', 'mirror' ) ], 0, 1 );
+
+my $server = CPANServer->new( 11027 );
+my $pid = $server->background;
+ok( $pid, 'HTTP Server started' );
+sleep 1;
+
+$SIG{__DIE__} = sub { kill( 9, $pid ) };
+
+my $mcpi = CPAN::Mini::Inject->new;
+$mcpi->parsecfg( 't/.mcpani/config' );
+
+mkdir( catdir( 't', 'mirror' ) );
+
+$mcpi->update_mirror(
+ remote => 'http://localhost:11027',
+ local => catdir( 't', 'mirror' )
+);
+
+kill( 9, $pid );
+
+ok( -e catfile( qw(t mirror authors 01mailrc.txt.gz) ),
+ 'Mirrored 01mailrc.txt.gz' );
+ok( -e catfile( qw(t mirror modules 02packages.details.txt.gz) ),
+ 'Mirrored 02packages.details.txt.gz' );
+ok( -e catfile( qw(t mirror modules 03modlist.data.gz) ),
+ 'Mirrored 03modlist.data.gz' );
+
+ok( -e catfile( qw(t mirror authors id R RJ RJBS CHECKSUMS) ),
+ 'RJBS CHECKSUMS' );
+ok(
+ -e catfile(
+ qw(t mirror authors id R RJ RJBS CPAN-Mini-2.1828.tar.gz) ),
+ 'CPAN::Mini'
+);
+ok( -e catfile( qw(t mirror authors id S SS SSORICHE CHECKSUMS) ),
+ 'SSORICHE CHECKSUMS' );
+ok(
+ -e catfile(
+ qw(t mirror authors id S SS SSORICHE CPAN-Mini-Inject-1.01.tar.gz)
+ ),
+ 'CPAN::Mini::Inject'
+);
+sleep 1; # allow locks to expire
+rmtree( [ catdir( 't', 'mirror' ) ], 0, 1 );
diff --git a/t/writelist.t b/t/writelist.t
new file mode 100644
index 0000000..de9d907
--- /dev/null
+++ b/t/writelist.t
@@ -0,0 +1,32 @@
+use Test::More tests => 2;
+
+use CPAN::Mini::Inject;
+
+my $mcpi;
+my $module
+ = "CPAN::Mini::Inject 0.01 S/SS/SSORICHE/CPAN-Mini-Inject-0.01.tar.gz";
+
+unlink( 't/local/MYCPAN/modulelist' );
+
+genmodlist();
+
+$mcpi = CPAN::Mini::Inject->new;
+$mcpi->loadcfg( 't/.mcpani/config' )->parsecfg->readlist;
+
+push( @{ $mcpi->{modulelist} }, $module );
+is( @{ $mcpi->{modulelist} }, 4, 'Updated memory modulelist' );
+ok( $mcpi->writelist, 'Write modulelist' );
+
+unlink( 't/local/MYCPAN/modulelist' );
+
+sub genmodlist {
+ open( MODLIST, '>t/local/MYCPAN/modulelist' )
+ or die "Can not create t/local/MYCPAN/modulelist: $!";
+ print MODLIST << "EOF"
+CPAN::Checksums 1.016 A/AN/ANDK/CPAN-Checksums-1.016.tar.gz
+CPAN::Mini 0.18 R/RJ/RJBS/CPAN-Mini-0.18.tar.gz
+CPANPLUS 0.0499 A/AU/AUTRIJUS/CPANPLUS-0.0499.tar.gz
+EOF
+ ;
+ close( MODLIST );
+}
diff --git a/t/zz.exceptions.t b/t/zz.exceptions.t
new file mode 100644
index 0000000..f90c9de
--- /dev/null
+++ b/t/zz.exceptions.t
@@ -0,0 +1,172 @@
+use Test::More;
+
+BEGIN {
+ eval "use Test::Exception";
+
+ plan skip_all => "Test Exceptions required to test croaks" if $@;
+ plan tests => 12;
+}
+
+use CPAN::Mini::Inject;
+use File::Path;
+use Env;
+use lib 't/lib';
+
+sub chkcfg {
+ return 1 if ( -r '/usr/local/etc/mcpani' );
+ return 1 if ( -r '/etc/mcpani' );
+}
+
+my $prevhome;
+if ( defined( $ENV{HOME} ) ) {
+ $prevhome = $ENV{HOME};
+ delete $ENV{HOME};
+}
+
+my $mcpanienv;
+if ( defined( $ENV{MCPANI_CONFIG} ) ) {
+ $mcpanienv = $ENV{MCPANI_CONFIG};
+ delete $ENV{MCPANI_CONFIG};
+}
+
+# loadcfg()
+SKIP: {
+ skip 'Config file exists', 1 if chkcfg();
+ my $mcpi = CPAN::Mini::Inject->new;
+ dies_ok { $mcpi->loadcfg } 'No config file';
+}
+
+{
+ # parsecfg()
+ my $mcpi = CPAN::Mini::Inject->new;
+ dies_ok { $mcpi->parsecfg( 't/.mcpani/config_bad' ); }
+ 'Missing config option';
+}
+
+# readlist()
+SKIP: {
+ skip 'User is superuser and can always read', 1 if $< == 0;
+ skip 'User is generally superuser under cygwin and can read', 1 if $^O eq 'cygwin';
+
+ my $mcpi = CPAN::Mini::Inject->new;
+
+ rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+ mkdir 't/local/MYCPAN';
+ $mcpi->parsecfg( 't/.mcpani/config_noread' );
+ dies_ok { $mcpi->readlist } 'unreadable file';
+ rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+}
+
+{
+ my $mcpi = CPAN::Mini::Inject->new;
+ $mcpi->parsecfg( 't/.mcpani/config' );
+
+ # add()
+ dies_ok {
+ $mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01'
+ );
+ }
+ 'Missing add param';
+
+ dies_ok {
+ $mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01',
+ file => 'blahblah'
+ );
+ }
+ 'Module file not readable';
+
+ lives_ok {
+ $mcpi->add(
+ authorid => 'RWSTAUNER',
+ file => 't/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz'
+ );
+ }
+ 'Ok without module/version when discoverable';
+
+ lives_ok {
+ $mcpi->add(
+ module => 'Who::Cares',
+ version => '1',
+ authorid => 'RWSTAUNER',
+ file => 't/local/mymodules/not-discoverable.tar.gz'
+ );
+ }
+ 'Ok without module/version when specified';
+
+ dies_ok {
+ $mcpi->add(
+ authorid => 'RWSTAUNER',
+ file => 't/local/mymodules/not-discoverable.tar.gz'
+ );
+ }
+ 'Dies without module/version when not discoverable';
+}
+
+{
+ my $mcpi = CPAN::Mini::Inject->new;
+ $mcpi->parsecfg( 't/.mcpani/config_norepo' );
+
+ dies_ok {
+ $mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01',
+ file => 'test-0.01.tar.gz'
+ );
+ }
+ 'Missing config repository';
+
+}
+
+SKIP: {
+ skip "We don't have a r/o repo", 2;
+ my $mcpi = CPAN::Mini::Inject->new;
+ $mcpi->parsecfg( 't/.mcpani/config_read' );
+
+ dies_ok {
+ $mcpi->add(
+ module => 'CPAN::Mini::Inject',
+ authorid => 'SSORICHE',
+ version => '0.01',
+ file => 'test-0.01.tar.gz'
+ );
+ }
+ 'read-only repository';
+
+ $mcpi->{config}{remote} = "ftp://blahblah http://blah blah";
+ dies_ok { $mcpi->testremote } 'No reachable site';
+
+}
+
+# writelist()
+SKIP: {
+ skip 'User is superuser and can always write', 1 if $< == 0;
+ skip 'User is generally superuser under cygwin and can write', 1 if $^O eq 'cygwin';
+
+ my $mcpi = CPAN::Mini::Inject->new;
+ rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+ mkdir 't/local/MYCPAN';
+ $mcpi->parsecfg( 't/.mcpani/config_nowrite' );
+ dies_ok { $mcpi->writelist } 'fail write file';
+ rmtree( ['t/local/MYCPAN/modulelist'], 0, 1 );
+}
+
+# Setup routines
+sub genmodlist {
+ open( MODLIST, '>t/local/MYCPAN/modulelist' )
+ or die "Can not create t/local/MYCPAN/modulelist: $!";
+ print MODLIST << "EOF"
+CPAN::Checksums 1.016 A/AN/ANDK/CPAN-Checksums-1.016.tar.gz
+CPAN::Mini 0.18 R/RJ/RJBS/CPAN-Mini-0.18.tar.gz
+CPANPLUS 0.0499 A/AU/AUTRIJUS/CPANPLUS-0.0499.tar.gz
+EOF
+ ;
+ close( MODLIST );
+}
+