aboutsummaryrefslogtreecommitdiff
path: root/t/tests/sietima/mailstore.t
blob: 2c2c74a3415f174b87c9dd54b362b869d69838ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;