HTTP-MultiGet
view release on metacpan or search on metacpan
t/HTTP-MultiGet-Role.t view on Meta::CPAN
use Modern::Perl;
use Log::LogMethods::Log4perlLogToString;
use Test::More qw(no_plan);
use HTTP::Response;
use HTTP::Headers;
use HTTP::Request;
use Data::Dumper;
use AnyEvent::Loop;
use Scalar::Util qw(looks_like_number);
use AnyEvent::Strict;
use Carp qw(confess);
BEGIN { $SIG{__DIE__} = sub { confess @_ }; }
my $string;
my $module='HTTP::MultiGet::Role';
require_ok($module);
use_ok($module);
my $class='SomeTestClass';
my $log=LoggerToString($class,$string);
my $self=$class->new;
isa_ok($self,$class);
{
my $result=$self->fail;
isa_ok($result,'Data::Result') or die Dumper($result);
ok(!$result,'should have a failed result');
}
{
my $result=$self->pass;
isa_ok($result,'Data::Result') or die Dumper($result,$self->agent->results);
ok($result,'should have a good result');
}
{
my $id=$self->queue_result(undef,Data::Result->new_true({}));
my $result=$self->block_on_ids($id);
ok($result,'Should get our fake result');
}
our $STAGE=0;
SKIP: {
skip '$ENV{RUN_HTTP_TESTS}!=1', 40 unless $ENV{RUN_HTTP_TESTS};
{
my $pass_count=0;
my $fail_count=0;
for(0 .. 99) {
$self->que_pass(sub { ++$pass_count });
$self->que_fail(sub { ++$fail_count });
}
my $rec_pass=0;
my $rec_fail=0;
my ($rec_ps,$rec_fs);
t/HTTP-MultiGet-Role.t view on Meta::CPAN
my $self=$class->new;
my $cv=AnyEvent->condvar;
my $tv=AnyEvent->timer(after=>4,cb=>sub { $cv->send});
ok($self->que_subfetch(sub { ok(1,'Sub fetch should have run!')}),'fire ouf our subfetch in non blocking mode');
$self->agent->run_next;
$cv->recv;
cmp_ok($STAGE,'==',0,'Should have 0 remaining requests');
diag Dumper([sort keys %{$self->agent->results}]);
}
}
{
my $sub=$self->can('pass');
ok($sub,'Should return a code refrence');
my $result=$sub->($self);
isa_ok($result,'Data::Result');
ok($result,'result should be true');
ok(!$self->can('bad_function_should_not_exist'),'Should fail to return a function that does not exist');
$sub=$self->can('que_google');
cmp_ok($sub,'eq',\&SomeTestClass::que_google,'Validate $self->SUPER::can($method)');
}
{
my $test="this is a test";
ok($self->json->get_allow_nonref,'non ref mode should be enabled');
my $in=qq{"$test"};
cmp_ok($self->json->decode($in),'eq',$test,'should now decode non refs');
}
for my $code (200 .. 299 ){
{
my $response=HTTP::Response->new($code,'ok',[],q{{"test": "testing"}});
my $result=$self->parse_response(undef,$response);
ok($result,'Should get true as a response, code: '.$code);
is_deeply($result->get_data,{test=>"testing"},'parse a json hash with a code $code');
}
{
my $response=HTTP::Response->new($code,'ok',[],q{["test", "testing"]});
my $result=$self->parse_response(undef,$response);
ok($result,'Should get true as a response, code: '.$code);
is_deeply($result->get_data,[test=>"testing"],'parse a json array with a code $code');
}
{
my $response=HTTP::Response->new($code,'ok',[],q{"test"});
my $result=$self->parse_response(undef,$response);
ok($result,'Should get true as a response, code: '.$code);
cmp_ok($result->get_data,'eq','test','parse a json string with a code $code');
}
}
for my $code (199,400,401,300,500,501,595) {
my $response=HTTP::Response->new($code,'fail',[],q{{"test": "testing"}});
my $result=$self->parse_response(undef,$response);
ok(!$result,'Should fail a code: '.$code);
}
BEGIN {
package
SomeTestClass;
use Modern::Perl;
use Moo;
use Data::Dumper;
BEGIN {
with 'HTTP::MultiGet::Role';
}
sub que_google {
my ($self,$cb)=@_;
my $req=new HTTP::Request(GET=>'https://google.com');
return $self->queue_request($req,$cb);
}
sub que_subfetch {
my ($self,$cb)=@_;
my $req=new HTTP::Request(GET=>'https://google.com');
my $code=sub {
my ($self,$id,$result)=@_;
::diag("Main Request ran");
::ok(1,"Main google fetch ran");
my $req=new HTTP::Request(GET=>'https://google.com');
$self->add_ids_for_blocking($self->queue_request($req,sub {
main::diag "request 1 ran: $id";
main::ok($result,'Que sending multiple requests');
$STAGE--;
my $count=0;
for my $req_id (1 .. 3) {
my $req=new HTTP::Request(GET=>'https://google.com');
++$count;
--$STAGE;
$self->add_ids_for_blocking($self->queue_request($req,sub {
--$count;
(undef,undef,$result)=@_;
main::ok($result,'Sub request [$req_id] ok');
return unless $count==0;
::diag("using ID, $id, current count is [$count]\n");
$cb->($self,$id,$result,$req,undef) ;
::diag('current list of result map keys: ', join ', ',keys %{$self->result_map});
}));
}
}));
};
my $id=$self->queue_request($req,$code);
::diag("Queing $id");
return $id;
}
sub que_fail {
my ($self,$cb)=@_;
return $self->queue_result( sub {$cb->(@_) },$self->new_false('I am a failure!'));
}
sub que_pass {
my ($self,$cb)=@_;
return $self->queue_result($cb,$self->new_true({}));
}
}
( run in 0.862 second using v1.01-cache-2.11-cpan-39bf76dae61 )