The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Socket;
use Email::Simple;
use Email::Simple::Creator;
use Email::MessageID;
use Test::More;
use POE qw(Component::Server::SimpleSMTP Component::Client::SMTP);

my $from = 'chris@bingosnet.co.uk';
my $to = 'gumby@gumbybra.in';
my %data = (
	from => $from,
	to => $to,
	email => Email::Simple->create(
      		header => [
              'Message-ID' => Email::MessageID->new( host => 'bingosnet.co.uk' )->in_brackets(),
        			From    => $from,
        			To      => $to,
        			Subject => 'Message in a bottle',
      		],
      		body => 'My bRain hUrts!',
	)->as_string(), 
);

plan tests => 6;

POE::Session->create(
  package_states => [
	'main' => [qw(
			_start
			_local_recipient
			smtpd_registered
			smtpd_connection
			smtpd_disconnected
	)],
  ],
  heap => \%data,
);

$poe_kernel->run();
exit 0;

sub _start {
  $_[HEAP]->{smtpd} = POE::Component::Server::SimpleSMTP->spawn(
	address => '127.0.0.1',
	port => 0,
	handlers => [
	   {
	      	SESSION => $_[SESSION]->ID(),
		EVENT   => '_local_recipient',
		MATCH   => 'gumbybra.in$',
	   },
	],
	options => { trace => 0 },
  );
  isa_ok( $_[HEAP]->{smtpd}, 'POE::Component::Server::SimpleSMTP' );
  return;
}

sub smtpd_registered {
  my ($heap,$object) = @_[HEAP,ARG0];
  isa_ok( $object, 'POE::Component::Server::SimpleSMTP' );
  ok( $object->enqueue(
    {
      from => $from,
      rcpt => [ $to ],
      msg  => $data{email},
    },
  ), 'Enqueued a message' );
  return;
}

sub smtpd_connection {
  pass($_[STATE]);
  return;
}

sub smtpd_disconnected {
  pass($_[STATE]);
  return;
}

sub _local_recipient {
  my $uid = $_[ARG0]->{uid};
  my $msg = $_[ARG0]->{msg};
  my $email = Email::Simple->new( $msg );
  ok( $uid, "There is a UID: $uid" );
  my $msg_id = $email->header('Message-ID');
  ok( $msg_id, "There is a Message-ID header: $msg_id" );
  ok( $msg_id =~ /^<.*>$/, "The Message-ID is in brackets" );
  $_[HEAP]->{smtpd}->shutdown();
  return;
}