Alien-Build

 view release on metacpan or  search on metacpan

t/alien_build_plugin_download_negotiate.t  view on Meta::CPAN

use 5.008004;
use Test2::V0 -no_srand => 1;
use Test::Alien::Build;
use Alien::Build::Plugin::Download::Negotiate;
use Alien::Build::Plugin::Fetch::CurlCommand;
use Path::Tiny;
use Capture::Tiny qw( capture_merged );
use Alien::Build::Util qw( _dump );

delete $ENV{$_} for qw( ftp_proxy all_proxy );

my $mock_pick_decoder = mock 'Alien::Build::Plugin::Download::Negotiate' => (
  override => [
    _pick_decoder => sub { 'Decode::Mojo' },
  ],
);

subtest 'pick fetch' => sub {

  local %ENV = %ENV;
  my $has_ssl = 0;
  my $mock = mock 'Alien::Build::Plugin::Download::Negotiate' => (
    override => [
      _has_ssl => sub { $has_ssl },
    ],
  );

  my %curl;
  my $mock2 = mock 'Alien::Build::Plugin::Fetch::CurlCommand' => (
    override => [
      protocol_ok => sub {
        my(undef, $protocol) = @_;
        $curl{$protocol};
      }
    ]
  );

  subtest 'http' => sub {

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('http://mytest.test/');

    is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']);
    is($plugin->scheme, 'http');

  };

  subtest 'http override decoder scalar' => sub {

    { package Alien::Build::Plugin::Foo::Bar;
      use Alien::Build::Plugin;

      sub init {}
    }

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'http://mytest.test/', decoder => 'Foo::Bar' );

    is([$plugin->pick], ['Fetch::HTTPTiny','Foo::Bar']);
    is($plugin->scheme, 'http');

  };

  subtest 'http override decoder array' => sub {

    { package Alien::Build::Plugin::Foo::Baz;
      use Alien::Build::Plugin;

      sub init {}
    }

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new( url => 'http://mytest.test/', decoder => ['Foo::Bar','Foo::Baz'] );

    is([$plugin->pick], ['Fetch::HTTPTiny','Foo::Bar', 'Foo::Baz']);
    is($plugin->scheme, 'http');

  };

  subtest 'https (ssl modules already installed)' => sub {

    $has_ssl = 1;
    %curl = ( https => 1 );

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/');

    is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']);
    is($plugin->scheme, 'https');

  };

  subtest 'https (ssl modules NOT already installed)' => sub {

    skip_all 'not picking curl for now :(';
    $has_ssl = 0;
    %curl = ( https => 1 );

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/');

    is([$plugin->pick], ['Fetch::CurlCommand','Decode::Mojo']);
    is($plugin->scheme, 'https');

  };

  subtest 'https (ssl modules NOT already installed, no curl)' => sub {

    $has_ssl = 0;
    %curl = ( https => 0 );

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('https://mytest.test/');

    is([$plugin->pick], ['Fetch::HTTPTiny','Decode::Mojo']);
    is($plugin->scheme, 'https');

  };

  subtest 'ftp direct' => sub {

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('ftp://mytest.test/');

    is([$plugin->pick], ['Fetch::NetFTP']);
    is($plugin->scheme, 'ftp');

  };

  subtest 'ftp direct proxy' => sub {

    $ENV{ftp_proxy} = 1;

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('ftp://mytest.test/');

    is([$plugin->pick], ['Fetch::LWP','Decode::DirListing','Decode::Mojo']);
    is($plugin->scheme, 'ftp');

  };

  subtest 'local file URI' => sub {

    $ENV{ftp_proxy} = 1;

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('file:///foo/bar/baz');

    is([$plugin->pick], ['Fetch::Local']);
    is($plugin->scheme, 'file');

  };

  subtest 'local file' => sub {

    $ENV{ftp_proxy} = 1;

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new('/foo/bar/baz');

    is([$plugin->pick], ['Fetch::Local']);
    is($plugin->scheme, 'file');

  };

  subtest 'bootstrap ssl' => sub {

    subtest 'without Net::SSLeay' => sub {

      $has_ssl = 0;
      %curl = ();

      my $plugin = Alien::Build::Plugin::Download::Negotiate->new(
        url           => 'https://mytest.test/',
        bootstrap_ssl => 1,
      );

      is(
        [$plugin->pick],
        array {
          item ['Fetch::CurlCommand','Fetch::Wget'];
          item 'Decode::Mojo';
          end;
        },
      );
    };

    subtest 'with Net::SSLeay' => sub {

      $has_ssl = 1;
      %curl = ();

      my $plugin = Alien::Build::Plugin::Download::Negotiate->new(
        url           => 'https://mytest.test/',
        bootstrap_ssl => 1,
      );

      is(
        [$plugin->pick],
        array {
          item 'Fetch::HTTPTiny';
          item 'Decode::Mojo';
          end;
        },
      );

    };

  };

  subtest 'bootstrap ssl http' => sub {

    my $plugin = Alien::Build::Plugin::Download::Negotiate->new(
      url           => 'http://mytest.test/',
      bootstrap_ssl => 1,
    );

    is(
      [$plugin->pick],
      array {
        item 'Fetch::HTTPTiny';
        item 'Decode::Mojo';
        end;
      },
    );

  };

};

subtest 'get the version' => sub {

  skip_all 'test requires Sort::Versions'
    unless eval { require Sort::Versions; 1 };

  my $build = alienfile q{
    use alienfile;
    probe sub { 'share' };
    plugin 'Download' => (
      url => 'corpus/dist',
      version => qr/([0-9\.]+)/,
      filter => qr/\.tar\.gz$/,
    );
  };

  note capture_merged {
    $build->download;
    ();
  };

  is($build->runtime_prop->{version}, '1.00');

  my $filename = $build->install_prop->{download};

  ok(-f $filename, "tarball downloaded");
  note "filename = $filename";

  my $orig = path('corpus/dist/foo-1.00.tar.gz');
  my $new  = path($filename);

  is($new->slurp, $orig->slurp, 'content of file is the same');

};

subtest 'prefer property' => sub {

  subtest 'default (true)' => sub {

    require Alien::Build;
    my $mock = mock 'Alien::Build::Meta';

    my @calls;

    $mock->around(apply_plugin => sub {
      my($orig, $self, @args) = @_;



( run in 0.739 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )