diff options
Diffstat (limited to 't')
-rw-r--r-- | t/lib/Test/Sietima.pm | 122 | ||||
-rw-r--r-- | t/tests/sietima.t | 77 | ||||
-rw-r--r-- | t/tests/sietima/role/subscriberonly/drop.t | 80 |
3 files changed, 137 insertions, 142 deletions
diff --git a/t/lib/Test/Sietima.pm b/t/lib/Test/Sietima.pm new file mode 100644 index 0000000..e61640a --- /dev/null +++ b/t/lib/Test/Sietima.pm @@ -0,0 +1,122 @@ +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::Tools::MoreCompare qw(bag); +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); + Test2::Tools::MoreCompare->import::into($target,qw(bag)); + 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(), + }); +} + +sub make_mail { + my (%args) = @_; + + Email::Stuffer + ->from($args{from}||'someone@users.example.com') + ->to($args{to}||$return_path) + ->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; diff --git a/t/tests/sietima.t b/t/tests/sietima.t index ab6e129..3644763 100644 --- a/t/tests/sietima.t +++ b/t/tests/sietima.t @@ -3,52 +3,13 @@ use strict; use warnings; use 5.020; use lib 't/lib'; -use Test2::Bundle::Extended; -use Test2::Tools::MoreCompare qw(bag); -use Test2::Plugin::DieOnFail; -use Email::Stuffer; -use Email::Sender::Transport::Test; -use Data::Printer; -use Sietima; - -my $return_path = 'sietima-test@list.example.com', -my $transport = Email::Sender::Transport::Test->new; -sub make_sietima { - $transport->clear_deliveries; - Sietima->new({ - return_path => $return_path, - transport => $transport, - @_, - }); -} - -sub make_mail { - my (%args) = @_; - Email::Stuffer - ->from($args{from}||'someone@users.example.com') - ->to($args{no}||$return_path) - ->text_body($args{body}||'some simple message') - ->email; -} +use Test::Sietima; ok(make_sietima(),'should instantiate') or bail_out; subtest 'no subscribers' => sub { - my $s = make_sietima(); - my $m = make_mail(); - - ok( - lives { $s->handle_mail($m) }, - 'should handle the mail', - $@, - ); - - my @deliveries = $transport->deliveries; - is( - \@deliveries, - [], - 'nothing should be delivered', - np @deliveries, + test_sending( + to => [], ); }; @@ -57,35 +18,9 @@ subtest 'with subscribers' => sub { 'one@users.example.com', 'two@users.example.com', ); - my $s = make_sietima( - subscribers => [@subscriber_addresses], - ); - my $m = make_mail(); - - ok( - lives { $s->handle_mail($m) }, - 'should handle the mail', - $@, - ); - - my @deliveries = $transport->deliveries; - is( - \@deliveries, - array { - item hash { - field envelope => hash { - field from => $return_path; - field to => bag { - for (@subscriber_addresses) { - item object { call address => $_ }; - } - }; - }; - }; - end(); - }, - 'there should be two deliveries', - np @deliveries, + test_sending( + sietima => { subscribers => \@subscriber_addresses }, + to => \@subscriber_addresses, ); }; diff --git a/t/tests/sietima/role/subscriberonly/drop.t b/t/tests/sietima/role/subscriberonly/drop.t index 886acce..165268d 100644 --- a/t/tests/sietima/role/subscriberonly/drop.t +++ b/t/tests/sietima/role/subscriberonly/drop.t @@ -3,91 +3,29 @@ use strict; use warnings; use 5.020; use lib 't/lib'; -use Test2::Bundle::Extended; -use Test2::Tools::MoreCompare qw(bag); -use Test2::Plugin::DieOnFail; -use Email::Stuffer; -use Email::Sender::Transport::Test; -use Data::Printer; -use Sietima; - -my $return_path = 'sietima-test@list.example.com'; -my $transport = Email::Sender::Transport::Test->new; -sub make_sietima { - $transport->clear_deliveries; - Sietima - ->with_traits('SubscriberOnly::Drop') - ->new({ - return_path => $return_path, - transport => $transport, - @_, - }); -} - -sub make_mail { - my (%args) = @_; - Email::Stuffer - ->from($args{from}||'someone@users.example.com') - ->to($args{no}||$return_path) - ->text_body($args{body}||'some simple message') - ->email; -} +use Test::Sietima; my @subscriber_addresses = ( 'one@users.example.com', 'two@users.example.com', ); my $s = make_sietima( + with_traits => ['SubscriberOnly::Drop'], subscribers => [@subscriber_addresses], ); subtest 'from subscriber' => sub { - $transport->clear_deliveries; - my $m = make_mail(from=>'one@users.example.com'); - - ok( - lives { $s->handle_mail($m) }, - 'should handle the mail', - $@, - ); - - my @deliveries = $transport->deliveries; - is( - \@deliveries, - array { - item hash { - field envelope => hash { - field from => $return_path; - field to => bag { - for (@subscriber_addresses) { - item object { call address => $_ }; - } - }; - }; - }; - end(); - }, - 'there should be two deliveries', - np @deliveries, + test_sending( + sietima => $s, + mail => { from=>'one@users.example.com' }, ); }; subtest 'from non-subscriber' => sub { - $transport->clear_deliveries; - my $m = make_mail(from=>'someone@users.example.com'); - - ok( - lives { $s->handle_mail($m) }, - 'should handle the mail', - $@, - ); - - my @deliveries = $transport->deliveries; - is( - \@deliveries, - [], - 'there should be no deliveries', - np @deliveries, + test_sending( + sietima => $s, + mail => { from=>'someone@users.example.com' }, + to => [], ); }; |