The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use HTTP::Request::Common;
use Plack::Builder;
use Plack::Test;

my $app = builder {
    enable 'Headers',
        code => '404',
        set => ['X-Robots-Tag' => 'noindex, noarchive, follow'];
    enable 'Headers',
        set => ['X-Plack-One' => 'one'];
    sub {
        my $env = shift;
        if ( $env->{'PATH_INFO'} eq '/' ) {
            return ['200', ['Content-Type' => 'text/plain'], ['hello world']];
        }
        else {
            return ['404', ['Content-Type' => 'text/plain'], ['not found']];
        }
    };
};

# See https://github.com/libwww-perl/http-message/issues/2#issuecomment-24443074
sub headers_as_hash {
    my $h = shift;
    return { 
        map { $_ => $h->header($_) } grep { $_ ne '::std_case' }
        keys %$h
    }
}

test_psgi app => $app, client => sub {
    my $cb = shift;

    {
        my $req = GET "http://localhost/";
        my $res = $cb->($req);
        print ref($res)."\n";
        is_deeply headers_as_hash($res->headers), {
            'content-type' => 'text/plain',
            'x-plack-one' => 'one'
        };
    }
};

test_psgi app => $app, client => sub {
    my $cb = shift;

    {
        my $req = GET "http://localhost/foo";
        my $res = $cb->($req);
        ok($res->code == 404) or diag($res->code);
        is_deeply headers_as_hash($res->headers), {
            'content-type' => 'text/plain',
            'x-plack-one' => 'one',
            'x-robots-tag' => 'noindex, noarchive, follow'
        };
    }
};

done_testing;