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 $worker_id = "worker_foo";
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_stats_url = "http://localhost/w/?queue_name=$queue";
my $worker_url = "http://localhost/w/";
my $control_url = "http://localhost/control/$queue";
test_psgi $app, sub {
my $cb = shift;
my ($req, $res);
my $content;
# get queue informations
$res = get_stats_from_queue($cb);
is_deeply JSON::decode_json $res->content,
{ job_processed => 0,
job_count => 0,
queue_name => 'presque_test',
job_failed => 0,
},
'good job info result';
# no job in queue
$res = get_job($cb);
ok !$res->is_success, 'no job for this queue';
is_deeply JSON::decode_json($res->content), {error => "no job"},
'error message is valid';
# create a new job
my $job = {foo => "bar"};
$res = create_job($cb, $job);
ok $res->is_success, 'new job inserted';
# info about a queue
$res = get_stats_from_queue($cb);
is_deeply JSON::decode_json $res->content,
{ job_count => 1,
job_failed => 0,
job_processed => 0,
queue_name => 'presque_test',
},
'valid jobs info';
# do a basic job
$res = get_job($cb);
ok $res->is_success, 'job fetched';
is_deeply JSON::decode_json $res->content, $job, 'job is good';
# insert a delayed job
$res = create_job($cb, {foo => 'baz'}, $queue_url . '?delayed='.(time() + 2));
# no job to do now
$res = get_job($cb);
ok !$res->is_success, 'no job';
sleep(2);
$res = get_job($cb);
ok $res->is_success, 'job found';
like $res->content, qr/baz/, 'delayed job';
# control queue
$res = control_queue($cb);
is_deeply JSON::decode_json $res->content,
{ status => 1,
queue => 'presque_test'
},
'queue is open';
# close queue
$res = change_queue_status($cb, 'stop');
like $res->content, qr/updated/, 'queue status change';
# status of a closed queue
$res = control_queue($cb);
like $res->content, qr/0/, 'queue is closed';
# can't get job on a stopped queue
$res = get_job($cb);
ok !$res->is_success, 'no job for this queue';
# open queue
$res = change_queue_status($cb, 'start');
like $res->content, qr/updated/, 'queue status change';
# batch inserts
my $jobs = [{foo => 1}, {foo => 2}, {foo => 3}, {foo => 4}];
$res = create_jobs($cb, $jobs);
# batch fetch
$res = get_jobs($cb);
$content = JSON::decode_json $res->content;
is_deeply $jobs, [map { JSON::decode_json $_ } @$content], 'valid jobs';
# insert uniq job
$res = create_job($cb, {foo => 1}, $queue_url.'?uniq=a');
is $res->code, 201, 'new uniq job inserted';
$res = create_job($cb, {foo => 1}, $queue_url.'?uniq=a');
like $res->content, qr/job already exists/, 'job already exists';
is $res->code, 400, 'can\'t insert duplicate uniq job';
# fetch job
$res = get_job($cb);
is_deeply JSON::decode_json $res->content, {foo => 1}, 'fetch a job';
# no job in queue
$res = get_job($cb);
is $res->code, 404, 'no more job in queue';
# job failed
$res = failed_job($cb);
is $res->code, 201, 'valid HTTP code returned';
# status
$res = queue_status($cb);
is_deeply JSON::decode_json $res->content,
{queue => 'presque_test', size => 1}, 'valid status';
# worker stats for queue
$res = workers_stats($cb);
is_deeply JSON::decode_json $res->content,
{ workers_list => [],
queue_name => 'presque_test',
processed => 7,
failed => 1,
},
'valid stats for queue';
## full process with worker id
# reg.
$res = reg_worker($cb);
is $res->code, 201, 'worker is reg.';
# create/fetch/mcreate/mfetch/fail/stats
$res = create_job($cb, $job, $queue_url);
is $res->code, 201, 'job created';
$res = get_jobs($cb);
is $res->code, 200, 'got job';
$res = workers_stats($cb);
is_deeply JSON::decode_json $res->content,
{ workers_list => [qw/worker_foo/],
queue_name => 'presque_test',
processed => 9,
failed => 1,
},
'valid stats for queue';
# unreg.
$res = unreg_worker($cb);
is $res->code, 204, 'worker is unreg.';
# purge queue
$res = purge_queue($cb);
is $res->code, 204, 'queue purge';
# check purged
};
sub get_stats_from_queue {
my ($cb, $url) = @_;
$url ||= $job_url;
my $req = HTTP::Request->new(GET => $url);
ok my $res = $cb->($req), 'get info on an empty queue';
$res;
}
sub get_job {
my ($cb, $url) = @_;
$url ||= $queue_url;
my $req = HTTP::Request->new(GET => $url);
ok my $res = $cb->($req), 'first request done';
$res;
}
sub get_jobs {
my ($cb, $url) = @_;
$url ||= $queue_batch_url;
my $req = HTTP::Request->new(GET => $url);
$req->header('X-presque-workerid' => $worker_id);
ok my $res = $cb->($req);
$res;
}
sub create_job {
my ($cb, $job, $url) = @_;
$url ||= $queue_url;
my $req = HTTP::Request->new(POST => $url);
$req->header('Content-Type' => 'application/json');
$req->header('X-presque-workerid' => $worker_id);
$req->content(JSON::encode_json($job));
ok my $res = $cb->($req);
$res;
}
sub create_jobs {
my ($cb, $jobs, $url) = @_;
$url ||= $queue_batch_url;
my $req = HTTP::Request->new(POST => $url);
$req->header('Content-Type' => 'application/json');
$req->content(JSON::encode_json({jobs => $jobs}));
ok my $res = $cb->($req);
$res;
}
sub failed_job {
my ($cb, $url) = @_;
$url ||= $queue_url;
my $req = HTTP::Request->new(PUT => $url);
$req->header('Content-Type' => 'application/json');
$req->content(JSON::encode_json({foo => 1}));
ok my $res = $cb->($req), 'store a failed job';
$res;
}
sub control_queue {
my ($cb, $url) = @_;
$url ||= $control_url;
my $req = HTTP::Request->new(GET => $url);
ok my $res = $cb->($req);
$res;
}
sub change_queue_status {
my ($cb, $status, $url) = @_;
$url ||= $control_url;
my $req = HTTP::Request->new(POST => $url);
$req->content(JSON::encode_json({status => $status}));
ok my $res = $cb->($req);
$res;
}
sub queue_status {
my ($cb, $url) = @_;
$url ||= $status_url;
my $req = HTTP::Request->new(GET => $url);
ok my $res = $cb->($req);
$res;
}
sub workers_stats {
my ($cb, $url ) = @_;
$url ||= $worker_stats_url;
my $req = HTTP::Request->new(GET => $url);
ok my $res = $cb->($req);
$res;
}
sub reg_worker {
my ($cb) = @_;
my $req = HTTP::Request->new(POST => $worker_url . "$queue");
$req->header('Content-Type' => 'application/json');
$req->header('X-presque-workerid' => $worker_id);
ok my $res = $cb->($req);
$res;
}
sub unreg_worker {
my ($cb) = @_;
my $req = HTTP::Request->new(DELETE => $worker_url . "$queue");
$req->header('X-presque-workerid' => $worker_id);
ok my $res = $cb->($req);
$res;
}
sub purge_queue {
my ($cb, $url) = @_;
$url ||= $queue_url;
my $req = HTTP::Request->new(DELETE => $url);
ok my $res = $cb->($req);
$res;
}
done_testing;