The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use Test::More 0.88 tests => 17;
use File::Spec ();
use Test::DZil qw(Builder simple_ini);
use Test::Fatal qw(exception);
#---------------------------------------------------------------------
# Install a fake upload_file method for testing purposes:
sub Dist::Zilla::Plugin::UploadToCPAN::_Uploader::upload_file {
my ($self, $archive) = @_;
$self->log("PAUSE $_ is $self->{$_}") for qw(user password);
$self->log("Uploading $archive") if -f $archive;
}
#---------------------------------------------------------------------
# Create a Builder with a simple configuration:
sub build_tzil {
Builder->from_config(
{ dist_root => 'corpus/dist/DZT' },
{
add_files => {
'source/dist.ini' => simple_ini('GatherDir', @_),
},
},
);
}
#---------------------------------------------------------------------
# Set responses for the username and password prompts:
sub set_responses {
my ($zilla, $username, $pw) = @_;
$zilla->chrome->set_response_for('PAUSE username: ', $username);
$zilla->chrome->set_response_for("PAUSE password for $username: ", $pw);
}
#---------------------------------------------------------------------
# Pass invalid upload_uri to UploadToCPAN as an extra precaution,
# and don't let it look for ~/.pause:
my %safety_first = (qw(upload_uri http://bogus.example.com/do/not/upload/),
pause_cfg_file => File::Spec->devnull);
#---------------------------------------------------------------------
# config from %PAUSE stash in dist.ini:
{
my $tzil = build_tzil(
[ UploadToCPAN => { %safety_first } ],
'FakeRelease',
[ '%PAUSE' => {qw(
username user
password password
)}],
);
$tzil->release;
my $msgs = $tzil->log_messages;
ok(grep({ /PAUSE user is user/ } @$msgs), "read username");
ok(grep({ /PAUSE password is password/ } @$msgs), "read password");
ok(grep({ /Uploading.*DZT-Sample/ } @$msgs), "uploaded archive");
ok(
grep({ /fake release happen/i } @$msgs),
"releasing continues after upload",
);
}
#---------------------------------------------------------------------
# Config from user input:
{
my $tzil = build_tzil(
[ UploadToCPAN => { %safety_first } ],
'FakeRelease',
);
set_responses($tzil, qw(user password));
$tzil->release;
my $msgs = $tzil->log_messages;
ok(grep({ /PAUSE user is user/ } @$msgs), "entered username");
ok(grep({ /PAUSE password is password/ } @$msgs), "entered password");
ok(grep({ /Uploading.*DZT-Sample/ } @$msgs), "uploaded archive manually");
ok(
grep({ /fake release happen/i } @$msgs),
"releasing continues after manual upload",
);
}
#---------------------------------------------------------------------
# No config at all:
{
my $tzil = build_tzil(
'FakeRelease',
[ UploadToCPAN => { %safety_first } ],
);
# Pretend user just hits Enter at the prompts:
set_responses($tzil, '', '');
like( exception { $tzil->release },
qr/No username was provided/,
"release without credentials fails");
my $msgs = $tzil->log_messages;
ok(grep({ /No username was provided/} @$msgs), "insist on username");
ok(!grep({ /Uploading.*DZT-Sample/ } @$msgs), "no upload without credentials");
ok(
!grep({ /fake release happen/i } @$msgs),
"no release without credentials"
);
}
#---------------------------------------------------------------------
# No config at all, but enter username:
{
my $tzil = build_tzil(
'FakeRelease',
[ UploadToCPAN => { %safety_first } ],
);
# Pretend user just hits Enter at the password prompt:
set_responses($tzil, 'user', '');
like( exception { $tzil->release },
qr/No password was provided/,
"release without password fails");
my $msgs = $tzil->log_messages;
ok(grep({ /No password was provided/} @$msgs), "insist on password");
ok(!grep({ /Uploading.*DZT-Sample/ } @$msgs), "no upload without password");
ok(
!grep({ /fake release happen/i } @$msgs),
"no release without password"
);
}
# Config from dist.ini
{
my $tzil = build_tzil(
'FakeRelease',
[ UploadToCPAN => {
%safety_first,
username => 'me',
password => 'ohhai',
}
],
);
like( exception { $tzil->release },
qr/Couldn't figure out password/,
"password set in dist.ini is ignored");
}