summaryrefslogblamecommitdiff
path: root/t/10_basic.t
blob: ddf33a4bd46dd7b7a52fe4bc36564c0d578226c7 (plain) (tree)




















                                








                                                               


                     

                    

                            
                                     


                                              
                                        


                             

                     
                        
                                                  
                                                                    

                               
                      
                             
                                 


                                            

                                              


                           
                                        



                        
                        



                                                                   
                                                                                  

                      
                        

                                   
                        


                                               


                                              
                    




                                
                                            
                                                           

                              
                              


                                                 
                        
                                                  

                
                                             


                                                           
                                                                
                                   

                 
                             
                                               



















                                                                            

            







                                                           
                                       










                                            
                                             

                                      
                         


                                  
                                              
                                         
                                       



                              
 


                                           

                 
                            
                                      

                  

  
                          


                                              






                                                           
                                              




                                                   


                                              

                                                     







                                                       
                                                     






                                           

                                               






                                                       


                                              






                                                       


                                              




                             


                                               





                                                          


                                              




                             


                                              




                             
                  


                                                                 




                             

                                                                   
                                                     




                             


                                                 



                             

             
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;