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::Base;
use IO::Scalar;
use Plack::Request;

plan tests => 2*blocks;

filters {
    add_env    => ['yaml'],
    parameters => ['eval'],
};

run {
    my $block = shift;
    my $env = {SERVER_PORT => 80};
    if ($block->add_env && ref($block->add_env) eq 'HASH') {
        while (my($key, $val) = each %{ $block->add_env }) {
            $env->{$key} = $val;
        }
    }
    my $req = Plack::Request->new($env);

    is $req->uri, $block->uri;
    is_deeply $req->query_parameters, $block->parameters;
};

__END__

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: ""
--- uri: http://example.com/
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: ""
  PATH_INFO: "/foo bar"
--- uri: http://example.com/foo%20bar
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: /test.c
--- uri: http://example.com/test.c
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: /test.c
  PATH_INFO: /info
--- uri: http://example.com/test.c/info
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: /test
  QUERY_STRING: dynamic=daikuma
--- uri: http://example.com/test?dynamic=daikuma
--- parameters: { dynamic => 'daikuma' }


===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: /exec/
--- uri: http://example.com/exec/
--- parameters: {}

===
--- add_env
  SERVER_NAME: example.com
--- uri: http://example.com/
--- parameters: {}

===
--- add_env
--- uri: http:///
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: ""
  QUERY_STRING: aco=tie
--- uri: http://example.com/?aco=tie
--- parameters: { aco => 'tie' }

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: ""
  QUERY_STRING: 0
--- uri: http://example.com/?0
--- parameters: {}

===
--- add_env
  HTTP_HOST: example.com
  SCRIPT_NAME: "/foo bar"
  PATH_INFO: "/baz quux"
--- uri: http://example.com/foo%20bar/baz%20quux
--- parameters: {}