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;