The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package MySpool;

use strict;
use vars qw(@ISA $loaded);
use File::Path qw(rmtree);

BEGIN { $| = 1; print "1..11\n"; }

### load the module
END {print "not ok 1\n" unless $loaded;}
use Mail::Spool;
$loaded = 1;
print "ok 1\n";

@ISA = qw(Mail::Spool);


### set up an object
my $spool = MySpool->new();
if( $spool ){
  print "ok 2\n";
}else{
  print "not ok 2\n";
}


### change the base dequeue dir
my $dequeue_dir = "./test_dequeue";
END{ rmtree($dequeue_dir); }
mkdir $dequeue_dir, 0755;


### try to create dirs
$spool->dequeue_dir($dequeue_dir);
$spool->create_dequeue_dirs;

if( -e "$dequeue_dir/0" ){
  print "ok 3\n";
}else{
  print "not ok 3\n";
}


### try to queue a message
my $test_str = "FOObarBAZ";
my $scalar = "To: anybody\@in.the.world
From: me\@right.here.local
Subject: Whatever

Some sort of body.
$test_str
";

### see if it'll accept
eval{ $spool->send_mail(message => \$scalar) };
if( ! $@ ){
  print "ok 4\n";
}else{
  print "not ok 4\n";
}

### list the handles
my @msh = $spool->list_spool_handles;
if( @msh ){
  print "ok 5\n";
}else{
  print "not ok 5\n";
}

### see if the first handle looks good
my $msh = shift(@msh);
my $dir = $msh->spool_dir;
if( $dir eq "$dequeue_dir/0" ){
  print "ok 6\n";
}else{
  print "not ok 6\n";
}

### open it up for reading
eval{ $msh->open_spool };
if( ! $@ ){
  print "ok 7\n";
}else{ 
  print "not ok 7\n";
}

my $found = 0;
while(defined(my $node = $msh->next_node)){

  $found ++;

  ### get a lock
  my $lock = $node->lock_node;
  if( $lock ){
    print "ok 8\n";
  }else{
    print "not ok 8\n";
  }

  ### get a handle
  my $fh = $node->filehandle;
  if( $fh ){
    print "ok 9\n";
  }else{
    print "not ok 9\n";
  }

  ### see if the node contained the right message
  my $str = join("",<$fh>);
  if( $str =~ /\Q$test_str\E/ ){
    print "ok 10\n";
  }else{
    print "not ok 10\n";
  }

  last;
}

### did we find a node
if( $found ){
  print "ok 11\n";
}else{
  print "not ok 11\n";
}