use strict;
use Test::Requires qw(IO::Handle::Util);
package MyComponent;
use parent 'Plack::Component';
use Plack::Util::Accessor qw( res cb );
sub call { return $_[0]->response_cb( $_[0]->res, $_[0]->cb ); }
package main;
use IO::Handle::Util qw(:io_from);
use HTTP::Request::Common;
use Test::More;
use Plack::Test;
# Various kinds of PSGI responses.
sub generate_responses {
[200, ['Content-Type' => 'text/plain'], ['Hello']],
[200, ['Content-Type' => 'text/plain'], io_from_array ['Hello']],
sub { $_[0]->([ 200, ['Content-Type' => 'text/plain'], ['Hello'] ]) },
sub {
my $writer = $_[0]->([ 200, ['Content-Type' => 'text/plain'] ]);
$writer->write( 'Hello' );
$writer->close;
},
}
# $body filters can return undef with no warnings.
for my $res ( generate_responses ) {
my @warns;
local $SIG{__WARN__} = sub { push @warns, @_ };
my $app = MyComponent->new(
res => $res, cb => sub { sub { $_[0] } },
);
test_psgi( $app, sub { $_[0]->(GET '/') } );
is_deeply \@warns, [];
}
for my $res ( generate_responses ) {
my $app = MyComponent->new(
res => $res, cb => sub {
my $done;
sub {
return if $done;
if (defined $_[0]) {
return $_[0];
} else {
$done = 1;
return 'END';
}
},
},
);
test_psgi( $app, sub {
my $res = $_[0]->(GET '/');
is $res->content, 'HelloEND';
} );
}
done_testing;