The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 11;
use strict;
$^W = 1;

use Cwd;
use Email::Send;
use Email::Send::Sendmail;

my $email = <<'EOF';
To:   Casey West <casey@geeknest.org>
From: Casey West <casey@geeknest.org>
Subject: This should never show up in my inbox

blah blah blah
EOF

{
  undef $Email::Send::Sendmail::SENDMAIL;
  local $ENV{PERL_EMAIL_SEND_SENDMAIL_NO_EXTRA_PATHS} = 1;
  local $ENV{PATH} = '';
  ok( Email::Send::Sendmail->is_available, 'Email::Send always is available' );
  my $msg = Email::Send::Sendmail->is_available;
  is $msg, 'No Sendmail found', 'is available return value says sendmail was not found';

  my $path = Email::Send::Sendmail->_find_sendmail;
  ok( ! defined $path, 'no sendmail found because we have no path' );
}

{
  local $Email::Send::Sendmail::SENDMAIL = 'testing';
  ok( Email::Send::Sendmail->is_available, 'Email::Send is available with $SENDMAIL set' );
  my $msg = Email::Send::Sendmail->is_available;
  is( $msg, '', 'is available return message is empty with $SENDMAIL set');
}

SKIP:
{
  skip 'Cannot run unless sendmail is at /usr/sbin/sendmail', 1
    unless -x '/usr/sbin/sendmail'
      && ! -x '/usr/bin/sendmail';

  local $ENV{PATH} = '/usr/bin:/usr/sbin';
  $ENV{PATH} =~ tr/:/;/ if $^O =~ /Win/;
  my $path = Email::Send::Sendmail->_find_sendmail;
  is( $path, '/usr/sbin/sendmail', 'found sendmail in /usr/sbin' );
}

{
  local $Email::Send::Sendmail::SENDMAIL = './util/not-executable';
  my $sender = Email::Send->new({mailer => 'Sendmail'});
  my $return = $sender->send($email);
  ok( ! $return, "send() failed because $return" );
  like( $return, qr/cannot execute/, 'error message says what we expect' );
}

my $has_FileTemp = eval { require File::Temp; };

SKIP:
{
  skip 'Cannot run this test unless current perl is -x', 1 unless -x $^X;
  skip 'Win32 does not understand shebang', 1 if $^O eq 'MSWin32';

  skip 'Cannot run this test without File::Temp', 1 unless $has_FileTemp;
  my $tempdir = File::Temp::tempdir(DIR => 't', CLEANUP => 1);

  require File::Spec;

  my $error = "can't prepare executable test script";

  my $filename = File::Spec->catfile($tempdir, "executable");
  open my $fh, ">", $filename or skip $error, 1;

  open my $exec, "<", './util/executable' or skip $error, 1;

  print {$fh} "#!$^X\n" or skip $error, 1;
  print {$fh} <$exec>   or skip $error, 1;
  close $fh             or skip $error, 1;

  chmod 0755, $filename;

  local $Email::Send::Sendmail::SENDMAIL = $filename;
  my $sender = Email::Send->new({mailer => 'Sendmail'});
  my $return = $sender->send($email);
  ok( $return, 'send() succeeded with executable $SENDMAIL' );
}

SKIP:
{
  skip 'Cannot run this test unless current perl is -x', 2 unless -x $^X;
  skip 'Win32 does not understand shebang', 2 if $^O eq 'MSWin32';

  skip 'Cannot run this test without File::Temp', 2 unless $has_FileTemp;
  my $tempdir = File::Temp::tempdir(DIR => 't', CLEANUP => 1);

  require File::Spec;

  my $error = "can't prepare executable test script";

  my $filename = File::Spec->catfile($tempdir, "sendmail");
  open my $sendmail_fh, ">", $filename or skip $error, 2;
  open my $template_fh, "<", './util/sendmail' or skip $error, 2;

  print {$sendmail_fh} "#!$^X\n"      or skip $error, 2;
  print {$sendmail_fh} <$template_fh> or skip $error, 2;
  close $sendmail_fh                  or skip $error, 2;

  chmod 0755, $filename;

  local $ENV{PATH} = $tempdir;
  my $sender = Email::Send->new({mailer => 'Sendmail'});
  my $return = $sender->send($email);
  ok( $return, 'send() succeeded with executable sendmail in path' );

  if ( -f 'sendmail.log' ) {
    open my $fh, '<sendmail.log'
        or die "Cannot read sendmail.log: $!";
    my $log = join '', <$fh>;
    like( $log, qr/From: Casey West/, 'log contains From header' );
  } else {
    fail( 'cannot check sendmail log contents'  );
  }
}