use strict;
use warnings;
use Test::More 0.88;
use Message::Passing::Output::Test;
use JSON qw/ decode_json encode_json /;
use_ok 'Plack::Handler::Message::Passing';
our $reply_to;
local $reply_to = Message::Passing::Output::Test->new;
{
package TestHandler;
use Moose;
extends 'Plack::Handler::Message::Passing';
sub get_output_to { $::reply_to }
no Moose;
}
my $called = 0;
my $h;
sub _make_handler {
my $die = shift;
$h = TestHandler->new(
app => sub {
$called++;
my $env = shift;
::is ref($env), 'HASH';
my $input = $env->{'psgi.input'};
::ok($input);
::is $input->read(my $buf, 4096), 6;
::is $buf, 'foobar';
::is $input->read($buf, 4096), 0;
::ok $env->{'psgi.errors'}->print('SOME ERROR');
die("TEST EXCEPTION") if $die;
return [ 200, [], ['foo'] ];
}
);
}
_make_handler(0);
ok $h;
my $env = {
'psgix.message.passing.clientid' => 1,
'psgix.message.passing.returnaddress' => 'tcp://127.0.0.1:5222',
'psgi.input' => 'foobar',
};
$h->consume(encode_json $env);
is $reply_to->message_count, 1;
is_deeply [map { decode_json $_ } $reply_to->messages],
[{clientid => 1, response => [ 200, [], ["foo"] ], errors => 'SOME ERROR'}];
is $called, 1;
_make_handler(1);
$h->consume(encode_json $env);
my (undef, $res) = $reply_to->messages;
$res = decode_json $res;
like $res->{errors}, qr/Caught exception: TEST EXCEPTION/;
is $res->{response}->[0], 500;
like $res->{response}->[2]->[0], qr/Internal server error/;
done_testing;