package Test::Sietima;
use strict;
use warnings;
use 5.020;
use lib 't/lib';
use Import::Into;
use Email::Stuffer;
use Email::Sender::Transport::Test;
use Data::Printer;
use Sietima;
use Test2::Bundle::Extended;
use Test2::API qw(context);
use namespace::clean;
sub import {
my $target = caller;
Test2::Bundle::Extended->import::into($target);
Test2::Plugin::DieOnFail->import::into($target);
Data::Printer->import::into($target);
for my $function (qw(transport make_sietima make_mail
deliveries_are test_sending)) {
no strict 'refs';
*{"${target}::${function}"} = __PACKAGE__->can($function);
}
return;
}
my $return_path = 'sietima-test@list.example.com';
sub transport {
state $transport = Email::Sender::Transport::Test->new;
return $transport;
}
sub make_sietima {
my (%args) = @_;
my $class = 'Sietima';
if (my $traits = delete $args{with_traits}) {
$class = $class->with_traits(@{$traits});
}
$class->new({
return_path => $return_path,
%args,
transport => transport(),
});
}
my $maybe = sub {
my ($obj,$method,$arg) = @_;
return $obj unless $arg;
return $obj->$method($arg);
};
sub make_mail {
my (%args) = @_;
Email::Stuffer
->from($args{from}||'someone@users.example.com')
->to($args{to}||$return_path)
->$maybe(cc => $args{cc})
->subject($args{subject}||'Test Message')
->text_body($args{body}||'some simple message')
->email;
}
sub deliveries_are {
my (%args) = @_;
my $ctx = context();
my $to = $args{to};
my @recipients = ref($to) ? @{$to} : $to;
my @deliveries = transport->deliveries;
is(
\@deliveries,
array {
if (@recipients) {
item hash {
field envelope => hash {
field from => $args{from}||$return_path;
field to => bag {
for (@recipients) {
item object { call address => $_ };
}
};
};
};
}
end();
},
'the deliveries should be as expected',
np @deliveries,
);
$ctx->release;
}
sub test_sending {
my (%args) = @_;
my $ctx = context();
my $sietima = delete $args{sietima};
if (!$sietima or ref($sietima) eq 'HASH') {
$sietima = make_sietima(%{$sietima||{}});
}
my $mail = delete $args{mail};
if (!$mail or ref($mail) eq 'HASH') {
$mail = make_mail(
to => $sietima->return_path,
%{$mail||{}},
);
}
transport->clear_deliveries;
ok(
lives { $sietima->handle_mail($mail) },
'should handle the mail',
$@,
);
$args{from} ||= $sietima->return_path;
$args{to} ||= [ map { $_->address} @{$sietima->subscribers} ];
deliveries_are(%args);
$ctx->release;
}
1;