1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
use 5.008004;
use Test2::V0 -no_srand => 1;
use Test::Alien::Build;
use Alien::Build::Plugin::Fetch::NetFTP;
use lib 't/lib';
use MyTest::FTP;
use Path::Tiny qw( path );
use Alien::Build::Util qw( _dump );
subtest 'updates requires' => sub {
my $plugin = Alien::Build::Plugin::Fetch::NetFTP->new( url => 'ftp://localhost/' );
my $build = alienfile filename => 'corpus/blank/alienfile';
my $meta = $build->meta;
$plugin->init($meta);
is( $build->requires('share')->{'Net::FTP'}, 0 );
is( $build->requires('share')->{'URI'}, 0 );
note _dump $meta;
};
subtest 'use start_url' => sub {
subtest 'sets start_url' => sub {
my $build = alienfile_ok q{
use alienfile;
plugin 'Fetch::NetFTP' => 'http://foo.bar.baz';
};
is $build->meta_prop->{start_url}, 'http://foo.bar.baz';
};
subtest 'uses start_url' => sub {
my $mock = mock 'Alien::Build::Plugin::Fetch::NetFTP';
my $plugin;
$mock->after(init => sub {
my($self, $meta) = @_;
$plugin = $self;
});
my $build = alienfile_ok q{
use alienfile;
meta->prop->{start_url} = 'http://baz.bar.foo';
plugin 'Fetch::NetFTP';
};
is $plugin->url, 'http://baz.bar.foo';
};
};
subtest 'fetch' => sub {
my $url = ftp_url;
unless($url)
{
my $log = path('t/bin/ftpd.log');
if(-r $log)
{
note($log->slurp);
}
skip_all ftp_error;
}
note "url = $url";
# FTP is inherently insecure. This test usually only runs in CI
# against a ftp server running on localhost
local $ENV{ALIEN_DOWNLOAD_RULE} = 'warn';
my $plugin = Alien::Build::Plugin::Fetch::NetFTP->new( url => $url );
my $build = alienfile filename => 'corpus/blank/alienfile';
my $meta = $build->meta;
$plugin->init($meta);
eval { $build->load_requires('share') };
skip_all 'test requires Net::FTP and URI' if $@;
subtest 'listing' => sub {
my $res = $build->fetch;
is(
$res,
hash {
field type => 'list';
field protocol => 'ftp';
field list => array {
for (qw( foo-1.00 foo-1.00.tar foo-1.00.tar.Z foo-1.00.tar.bz2 foo-1.00.tar.gz foo-1.00.tar.xz foo-1.00.zip )) {
item hash {
field filename => $_;
field url => match qr!^ftp://!;
};
}
};
}
);
};
subtest 'file' => sub {
my $furl = URI->new_abs("foo-1.00.tar.gz", $url);
note "url = $furl";
my $res = $build->fetch($furl);
is(
$res,
hash {
field type => 'file';
field protocol => 'ftp';
field filename => 'foo-1.00.tar.gz';
field path => match qr/foo-1\.00\.tar\.gz$/;
},
);
my $expected = path('corpus/dist/foo-1.00.tar.gz')->slurp_raw;
my $actual = path($res->{path})->slurp_raw;
is( $actual, $expected );
};
subtest 'not found' => sub {
my $furl = URI->new_abs("bogus.tar.gz", $url);
note "url = $furl";
eval { $build->fetch("$furl") };
like $@, qr/^unable to fetch ftp/;
};
};
done_testing;
|