use lib 't/lib';
use Test::Sietima;
use Email::Stuffer;
use Path::Tiny;
sub mkmail($id) {
Email::Stuffer
->from("from-${id}\@example.com")
->to("to-${id}\@example.com")
->subject("subject $id")
->text_body("body $id \nbody body\n")
->email;
}
sub chkmail($id) {
object {
call [header=>'from'] => "from-${id}\@example.com";
call [header=>'to'] => "to-${id}\@example.com";
call [header=>'subject'] => "subject $id";
call body => match qr{\bbody \Q$id\E\b};
};
}
sub chk_multimail(@ids) {
return bag {
for my $id (@ids) {
item hash {
field id => D();
field mail => chkmail($id);
end;
};
}
end;
};
}
sub test_store($store) {
my %stored_id;
subtest 'storing' => sub {
ok($stored_id{1}=$store->store(mkmail(1),'tag1','tag2'));
ok($stored_id{2}=$store->store(mkmail(2),'tag2'));
ok($stored_id{3}=$store->store(mkmail(3),'tag1'));
};
subtest 'retrieving by id' => sub {
is(
$store->retrieve_by_id($stored_id{$_}),
chkmail($_),
) for 1..3;
};
subtest 'retrieving by tag' => sub {
my $tag1 = $store->retrieve_by_tags('tag1');
is(
$tag1,
chk_multimail(1,3),
'tag1 should have mails 1 & 3',
);
my $tag2 = $store->retrieve_by_tags('tag2');
is(
$tag2,
chk_multimail(1,2),
'tag1 should have mails 1 & 2',
);
my $tag12 = $store->retrieve_by_tags('tag2','tag1');
is(
$tag12,
chk_multimail(1),
'tag1+tag2 should have mail 1',
);
my $tag_all = $store->retrieve_by_tags();
is(
$tag_all,
chk_multimail(1,2,3),
'no tags should retrieve all mails',
);
};
subtest 'removing' => sub {
$store->remove($stored_id{2});
is(
$store->retrieve_by_tags('tag2'),
chk_multimail(1),
'remove should remove',
);
};
subtest 'clearing' => sub {
$store->clear;
is(
$store->retrieve_by_tags(),
[],
'clear should clear',
);
};
}
subtest 'test store' => sub {
require Test::Sietima::MailStore;
test_store(Test::Sietima::MailStore->new);
};
subtest 'file store' => sub {
require Sietima::MailStore::FS;
my $root = Path::Tiny->tempdir;
test_store(Sietima::MailStore::FS->new({root => $root}));
};
done_testing;