summaryrefslogtreecommitdiff
path: root/lib/JWebmail/Model/ReadMails/MockJSON.pm
blob: e429d534e48c5ef179eb6ff122e3eb008c30956e (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package JWebmail::Model::ReadMails::MockJSON;

use v5.24;
use warnings;
use utf8;
use autodie;

use List::Util 'sum';
use JSON::PP 'decode_json';

use Digest::HMAC_MD5 'hmac_md5_hex';
use Role::Tiny::With;

use namespace::clean;

use constant {
    VALID_USER => 'mockjson@example.org',
    VALID_PW   => '12345',
};

with 'JWebmail::Model::ReadMails::Role';


sub new { bless {}, shift }

sub _read_json_file {
    my ($file_name) = @_;

    use constant PREFIX => 't/private/';

    open my $body_file, '<', PREFIX . $file_name;
    local $/;
    my $body = <$body_file>;
    close $body_file;

    return decode_json($body);
}

sub list_reply {
    state $init = _read_json_file('msgs.json');
}

sub read_reply {
    state $init = {
        'SC-ORD-MAIL54526c63b751646618a793be3f8329cca@sc-ord-mail5' => _read_json_file('msg2.json'),
        'example' => _read_json_file('msg.json'),
    };
}


sub verify_user {
    my $self = shift;
    my $auth = shift;

    if ($auth->{challenge}) {
        my $res = hmac_md5_hex($auth->{challenge}, VALID_PW);
        return $auth->{user} eq VALID_USER && $auth->{password} eq $res;
    }
    return $auth->{user} eq VALID_USER && $auth->{password} eq VALID_PW;
}

sub read_headers_for {
    my $self = shift;
    my $auth = shift;
    my %args = @_;

    my ($start, $end, $sort, $folder) = @args{qw(start end sort folder)};

    unless ($sort) {
        return [@{ $self->list_reply }[$start..$end]];
    }
    if ($folder eq 'test') {
        return [];
    }
    my $s = sub {
        my $sort_by = $sort;
        my $rev = $sort_by !~ m/^!/ ? 1 : -1;
        $sort_by =~ s/^!//;
        return (($a->{$sort_by}||$a->{head}{$sort_by}) cmp ($b->{$sort_by}||$b->{head}{$sort_by})) * $rev;
    };
    return [sort { &$s } @{ $self->list_reply }[$start..$end]];
}

sub count {
    my $self = shift;
    my $auth = shift;
    my $_folder = shift;

    return (
        sum(map {$_->{size}} @{ $self->list_reply }), # size
        scalar(@{ $self->list_reply }), # count
        0, # new
    );
}

sub show {
    my $self = shift;
    my $auth = shift;
    my $mid = shift;

    my $mail = $self->read_reply->{$mid};
    if ($mail) {
        return $mail;
    }
    else {
        die 'unknown mail-id';
    }
}

sub folders { ['', qw(cur test devel debug)] }

sub raw {
    my $self = shift;
    my ($auth, $folder, $mid, $path) = @_;

    ...
}

sub search { ... }
sub move { ... }


1

__END__

=head1 NAME

Mock - Simple file based mock for the L<JWebmail::Model::ReadMails> module.

=cut