about summary refs log tree commit diff
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2010-07-05 09:34:40 +0200
committerfranck cuny <franck@lumberjaph.net>2010-07-05 09:34:40 +0200
commit09933f3bc89a5ed24541bb31e4964b77ad8c913c (patch)
tree6cb0f322e23de5e665792dc25fe4d6257b035c9f
parentupdate README (diff)
downloadpresque-09933f3bc89a5ed24541bb31e4964b77ad8c913c.tar.gz
refactor tests
-rw-r--r--t/10_basic.t254
1 files changed, 192 insertions, 62 deletions
diff --git a/t/10_basic.t b/t/10_basic.t
index 86495ec..b36cb8d 100644
--- a/t/10_basic.t
+++ b/t/10_basic.t
@@ -19,20 +19,23 @@ my $app = presque->app(
     }
 );
 
-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";
+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
-    my $req = HTTP::Request->new(GET => $job_url);
-    ok my $res = $cb->($req), 'get info on an empty queue';
+    $res = get_stats_from_queue($cb);
     is_deeply JSON::decode_json $res->content,
       { job_processed => 0,
         job_count     => 0,
@@ -42,29 +45,19 @@ test_psgi $app, sub {
       'good job info result';
 
     # no job in queue
-    $req = HTTP::Request->new(GET => $queue_url);
-    ok $res = $cb->($req), 'first request done';
+    $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';
 
-    # fail to create a new job
-    $req = HTTP::Request->new(POST => $queue_url);
+    # create a new job
     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);
+    $res = create_job($cb, $job);
     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,
+    $res = get_stats_from_queue($cb);
+    is_deeply JSON::decode_json $res->content,
       { job_count     => 1,
         job_failed    => 0,
         job_processed => 0,
@@ -73,85 +66,222 @@ test_psgi $app, sub {
       'valid jobs info';
 
     # do a basic job
-    $req = HTTP::Request->new(GET => $queue_url);
-    ok $res = $cb->($req), 'get a 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
-    $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';
+    $res = create_job($cb, {foo => 'baz'}, $queue_url . '?delayed='.(time() + 2));
 
     # no job to do now
-    $req = HTTP::Request->new(GET => $queue_url);
-    $res = $cb->($req);
+    $res = get_job($cb);
     ok !$res->is_success, 'no job';
     sleep(2);
-    $res = $cb->($req);
+    $res = get_job($cb);
     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,
+    # control queue
+    $res = control_queue($cb);
+    is_deeply JSON::decode_json $res->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);
+    $res = change_queue_status($cb, 'stop');
     like $res->content, qr/updated/, 'queue status change';
 
     # status of a closed queue
-    $req = HTTP::Request->new(GET => $control_url);
-    $res = $cb->($req);
+    $res = control_queue($cb);
     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);
+    $res = get_job($cb);
     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);
+    $res = change_queue_status($cb, 'start');
     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';
+    $res = create_jobs($cb, $jobs);
 
     # batch fetch
-    $req     = HTTP::Request->new(GET => $queue_batch_url);
-    $res     = $cb->($req);
+    $res     = get_jobs($cb);
     $content = JSON::decode_json $res->content;
-    my @jobs = map { JSON::decode_json $_ } @$content;
-    is_deeply $jobs, \@jobs, 'valid jobs';
+    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
-    $req = HTTP::Request->new(GET => $status_url);
-    $res = $cb->($req);
+    $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."?worker_id=$worker_id");
+    is $res->code, 201, 'job created';
+
+    $res = get_jobs($cb, $queue_url."?worker_id=$worker_id");
+    is $res->code, 200, 'got job';
+
+    $res = workers_stats($cb);
     is_deeply JSON::decode_json $res->content,
-      {queue => 'presque_test', size => 0}, 'valid status';
+      { workers_list => [qw/worker_foo/],
+        queue_name   => "presque_test",
+        processed    => 9,
+        failed       => 1,
+      },
+      'valid stats for queue';
 
-    # worker stats
+    # unreg.
+    $res = unreg_worker($cb);
+    is $res->code, 204, 'worker is unreg.';
 
     # purge queue
-    $req = HTTP::Request->new(DELETE => $queue_url);
-    $res = $cb->($req);
+    $res = purge_queue($cb);
     is $res->code, 204, 'queue purge';
+
+    # check purged
 };
 
+sub get_stats_from_queue {
+    my $cb = shift;
+    my $req = HTTP::Request->new(GET => $job_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 => $queue_url);
+    ok my $res = $cb->($req), 'first request done';
+    $res;
+}
+
+sub get_jobs {
+    my $cb = shift;
+    my $req     = HTTP::Request->new(GET => $queue_batch_url);
+    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->content(JSON::encode_json($job));
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub create_jobs {
+    my ($cb, $jobs, $url) = @_;
+    $url ||= $queue_url;
+    my $req = HTTP::Request->new(POST => $queue_batch_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, ) = @_;
+    my $req = HTTP::Request->new(PUT => $queue_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 = shift;
+    my $req = HTTP::Request->new(GET => $control_url);
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub change_queue_status {
+    my ($cb, $status) = @_;
+    my $req = HTTP::Request->new(POST => $control_url);
+    $req->content(JSON::encode_json({status => $status}));
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub queue_status {
+    my ($cb, ) = @_;
+    my $req = HTTP::Request->new(GET => $status_url);
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub workers_stats {
+    my ($cb, ) = @_;
+    my $req = HTTP::Request->new(GET => $worker_stats_url);
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub reg_worker {
+    my ($cb, ) = @_;
+    my $req = HTTP::Request->new(POST => $worker_url."$queue");
+    $req->content(JSON::encode_json({worker_id => $worker_id}));
+    $req->header('Content-Type' => 'application/json');
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub unreg_worker {
+    my ($cb, ) = @_;
+    my $req = HTTP::Request->new(DELETE => $worker_url."$queue?worker_id=$worker_id");
+    ok my $res = $cb->($req);
+    $res;
+}
+
+sub purge_queue {
+    my ($cb, ) = @_;
+    my $req = HTTP::Request->new(DELETE => $queue_url);
+    ok my $res = $cb->($req);
+    $res;
+}
+
 done_testing;