aboutsummaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2016-06-16 18:09:39 +0100
committerdakkar <dakkar@thenautilus.net>2016-06-16 18:09:39 +0100
commitee35cc15e1e05fb48ec9ecf476c0c5f6d4e50314 (patch)
treed45412a86b77c347e669be5b24a37a8b59bdb0e2 /t
parentrole: drop mail from non-subscribers (diff)
downloadSietima-ee35cc15e1e05fb48ec9ecf476c0c5f6d4e50314.tar.gz
Sietima-ee35cc15e1e05fb48ec9ecf476c0c5f6d4e50314.tar.bz2
Sietima-ee35cc15e1e05fb48ec9ecf476c0c5f6d4e50314.zip
factor out common test functions
Diffstat (limited to 't')
-rw-r--r--t/lib/Test/Sietima.pm122
-rw-r--r--t/tests/sietima.t77
-rw-r--r--t/tests/sietima/role/subscriberonly/drop.t80
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 => [],
);
};