use strict;
use warnings;
use v5.10;
use Test::More;
use Plack::Builder;
use Plack::Test;
use HTTP::Request::Common;

my $app = sub { 
    my $env = shift;
    [200,[],[ join '|', map { $env->{$_} } 
        qw(negotiate.format SCRIPT_NAME PATH_INFO)]];
};

my $stack = builder { 
	mount '/a', builder {
		enable sub {
			my $app = shift;
			sub {
				my $env = shift;
				Plack::Util::response_cb( $app->($env), sub {
					my $res = shift;
					push @{$res->[1]}, 'x-path' => $env->{PATH_INFO};
					$res;
				});
			};
		};
		enable 'Negotiate',
			formats => {
				xml  => { type => 'application/xml' },
				html => { type => 'text/html' },
			},
			parameter => 'format',
			extension => 'strip';
		$app;
	};
};

test_psgi $stack => sub {
    my $cb = shift;

    my $res = $cb->(GET '/a/foo.xml');
    is $res->content, 'xml|/a|/foo', 'stripped extension';
	is $res->header('x-path'),'/foo.xml', 'restored path';

    $res = $cb->(GET '/a/foo.xml?format=html');
    is $res->content, 'html|/a|/foo.xml', 'parameter';

    $res = $cb->(GET '/a/foo.xml?format=baz');
    is $res->content, 'xml|/a|/foo', 'skip unknown parameter';
	is $res->header('x-path'),'/foo.xml', 'restored path';

    $res = $cb->(GET '/a?format=xml');
    is $res->content, 'xml|/a|', 'parameter on empty script';
};

done_testing;
