The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

use Plack::Builder;
use Plack::Test;
use HTTP::Request::Common;

use t::Apps qw(%apps);

for my $appname (keys %apps) {
    my $path;
    my $length;
    my $status;


    test_psgi(
        app => builder {
            enable "Plack::Middleware::EasyHooks",
                before => sub {
                    my ($env) = @_;

                    $path = $env->{PATH_INFO};
                },
                after => sub {
                    my ($env, $res) = @_;
                    $status = $res->[0];
                },
                filter => sub {
                    my ($env, $chunk) = @_;
                    $env->{length} += length $chunk;

                    return uc($chunk);
                },
                tail => sub {
                    return "baz";
                },
                finalize => sub {
                    my ($env) = @_;

                    $length = $env->{length};
                };

            $apps{$appname};
        },
        client => sub {
            my $cb = shift;

            my $res = $cb->( GET "/foo" );

            is($path, "/foo",              "$appname: Path was collected                (before)");
            is($status, 200,               "$appname: Status code was collected         (after)");
            is($res->content, "FOOBARbaz", "$appname: Content got uppercased and tailed (filter+tail)");
            is($length, 6,                 "$appname: Length was calculated             (finalize)")
        },
    );
}

done_testing( 4 * scalar( keys %apps ) );