diff options
Diffstat (limited to 't')
-rw-r--r-- | t/lib/Test/Sietima/MailStore.pm | 15 | ||||
-rw-r--r-- | t/tests/sietima/mailstore.t | 117 |
2 files changed, 129 insertions, 3 deletions
diff --git a/t/lib/Test/Sietima/MailStore.pm b/t/lib/Test/Sietima/MailStore.pm index 60054c3..2925fd3 100644 --- a/t/lib/Test/Sietima/MailStore.pm +++ b/t/lib/Test/Sietima/MailStore.pm @@ -1,7 +1,8 @@ package Test::Sietima::MailStore; use Moo; use Sietima::Policy; -use List::AllUtils qw(all); +use List::AllUtils qw(all first_index); +use Digest::SHA1 qw(sha1_hex); use namespace::clean; with 'Sietima::MailStore'; @@ -14,10 +15,11 @@ has _mails => ( sub clear { shift->_mails([]) } sub store ($self,$mail,@tags) { - my $id = time(); + my $str = $mail->as_string; + my $id = sha1_hex($str); push $self->_mails->@*, { id => $id, - mail => $mail->as_string, + mail => $str, tags => { map {$_ => 1;} @tags, }, }; return $id; @@ -45,4 +47,11 @@ sub retrieve_by_id ($self,$id) { return; } +sub remove($self,$id) { + my $idx = first_index { $_->{id} eq $id } $self->_mails->@*; + return unless defined $idx; + splice $self->_mails->@*,$idx,1; + return; +} + 1; diff --git a/t/tests/sietima/mailstore.t b/t/tests/sietima/mailstore.t new file mode 100644 index 0000000..2c2c74a --- /dev/null +++ b/t/tests/sietima/mailstore.t @@ -0,0 +1,117 @@ +#!perl +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(Test::Sietima::MailStore->new({root => $root})); +}; + +done_testing; |