about summary refs log tree commit diff
path: root/t/10_basic.t
blob: 86495ec982b37d74ad1f6d46aa2fde95908e59f2 (plain) (blame)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
use strict;
use warnings;

use Test::More;
use Plack::Test;

use JSON;
use HTTP::Request;
use presque;

$Plack::Test::Impl = 'Server';

my $app = presque->app(
    config => {
        redis => {
            host => '127.0.0.1',
            port => 6379
        }
    }
);

my $queue           = "presque_test";
my $queue_url       = "http://localhost/q/$queue";
my $queue_batch_url = "http://localhost/qb/$queue";
my $job_url         = "http://localhost/j/$queue";
my $status_url      = "http://localhost/status/$queue";
my $worker_url      = "http://localhost/w/$queue";
my $control_url     = "http://localhost/control/$queue";

test_psgi $app, sub {
    my $cb = shift;

    # get queue informations
    my $req = HTTP::Request->new(GET => $job_url);
    ok my $res = $cb->($req), 'get info on an empty queue';
    is_deeply JSON::decode_json $res->content,
      { job_processed => 0,
        job_count     => 0,
        queue_name    => $queue,
        job_failed    => 0,
      },
      'good job info result';

    # no job in queue
    $req = HTTP::Request->new(GET => $queue_url);
    ok $res = $cb->($req), 'first request done';
    ok !$res->is_success, 'no job for this queue';
    is_deeply JSON::decode_json($res->content), {error => "no job"},
      'error message is valid';

    # fail to create a new job
    $req = HTTP::Request->new(POST => $queue_url);
    my $job = {foo => "bar"};
    $req->content(JSON::encode_json($job));
    $res = $cb->($req);
    ok !$res->is_success, 'content-type is not set to json';

    # insert a job
    $req->header('Content-Type' => 'application/json');
    $res = $cb->($req);
    ok $res->is_success, 'new job inserted';

    # info about a queue
    $req = HTTP::Request->new(GET => $job_url);
    $res = $cb->($req);
    my $content = JSON::decode_json $res->content;
    is_deeply $content,
      { job_count     => 1,
        job_failed    => 0,
        job_processed => 0,
        queue_name    => $queue,
      },
      'valid jobs info';

    # do a basic job
    $req = HTTP::Request->new(GET => $queue_url);
    ok $res = $cb->($req), 'get a job';
    ok $res->is_success, 'job fetched';
    is_deeply JSON::decode_json $res->content, $job, 'job is good';

    # insert a delayed job
    $req = HTTP::Request->new(POST => $queue_url . '?delayed=' . (time() + 2));
    $req->header('Content-Type' => 'application/json');
    $req->content(JSON::encode_json({foo => 'baz'}));
    ok $res = $cb->($req), 'delayed job inserted';

    # no job to do now
    $req = HTTP::Request->new(GET => $queue_url);
    $res = $cb->($req);
    ok !$res->is_success, 'no job';
    sleep(2);
    $res = $cb->($req);
    ok $res->is_success, 'job found';
    like $res->content, qr/baz/, 'delayed job';

    # # control queue
    $req     = HTTP::Request->new(GET => $control_url);
    $res     = $cb->($req);
    $content = JSON::decode_json $res->content;
    is_deeply $content,
      { status => 1,
        queue  => 'presque_test'
      },
      'queue is open';

    # close queue
    $req = HTTP::Request->new(POST => $control_url);
    $req->content(JSON::encode_json({status => 'stop'}));
    $res = $cb->($req);
    like $res->content, qr/updated/, 'queue status change';

    # status of a closed queue
    $req = HTTP::Request->new(GET => $control_url);
    $res = $cb->($req);
    like $res->content, qr/0/, 'queue is closed';

    # can't get job on a stopped queue
    $req = HTTP::Request->new(GET => $queue_url);
    $res = $cb->($req);
    ok !$res->is_success, 'no job for this queue';

    # open queue
    $req = HTTP::Request->new(POST => $control_url);
    $req->content(JSON::encode_json({status => 'start'}));
    $res = $cb->($req);
    like $res->content, qr/updated/, 'queue status change';

    # batch inserts
    $req = HTTP::Request->new(POST => $queue_batch_url);
    $req->header('Content-Type' => 'application/json');
    my $jobs = [{foo => 1}, {foo => 2}, {foo => 3}, {foo => 4}];
    $req->content(JSON::encode_json({jobs => $jobs}));
    ok $res = $cb->($req), 'insert a batch of jobs';

    # batch fetch
    $req     = HTTP::Request->new(GET => $queue_batch_url);
    $res     = $cb->($req);
    $content = JSON::decode_json $res->content;
    my @jobs = map { JSON::decode_json $_ } @$content;
    is_deeply $jobs, \@jobs, 'valid jobs';

    # status
    $req = HTTP::Request->new(GET => $status_url);
    $res = $cb->($req);
    is_deeply JSON::decode_json $res->content,
      {queue => 'presque_test', size => 0}, 'valid status';

    # worker stats

    # purge queue
    $req = HTTP::Request->new(DELETE => $queue_url);
    $res = $cb->($req);
    is $res->code, 204, 'queue purge';
};

done_testing;