diff options
Diffstat (limited to 't')
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 ); @@ -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 Binary files differnew file mode 100644 index 0000000..7bee62a --- /dev/null +++ b/t/html/01mailrc.txt.gz diff --git a/t/html/02packages.details.txt.gz b/t/html/02packages.details.txt.gz Binary files differnew file mode 100644 index 0000000..79ce42c --- /dev/null +++ b/t/html/02packages.details.txt.gz diff --git a/t/html/03modlist.data.gz b/t/html/03modlist.data.gz Binary files differnew file mode 100644 index 0000000..689b691 --- /dev/null +++ b/t/html/03modlist.data.gz 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 Binary files differnew file mode 100644 index 0000000..d14acf2 --- /dev/null +++ b/t/local/01mailrc.txt.gz.original diff --git a/t/local/CPAN/modules/02packages.details.txt.gz.original b/t/local/CPAN/modules/02packages.details.txt.gz.original Binary files differnew file mode 100644 index 0000000..60cdbd7 --- /dev/null +++ b/t/local/CPAN/modules/02packages.details.txt.gz.original 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 Binary files differnew file mode 100644 index 0000000..3c49465 --- /dev/null +++ b/t/local/mymodules/Dist-Metadata-Test-MetaFile-2.2.tar.gz diff --git a/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz b/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz Binary files differnew file mode 100644 index 0000000..4af56c9 --- /dev/null +++ b/t/local/mymodules/Dist-Metadata-Test-MetaFile-Only.tar.gz 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 @@ -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(); @@ -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 ); +} + |