Dancer2
view release on metacpan or search on metacpan
lib/Dancer2/Test.pm view on Meta::CPAN
for my $v (@$value) {
push @params,
uri_escape_utf8($p) . '=' . uri_escape_utf8($v);
}
}
else {
push @params,
uri_escape_utf8($p) . '=' . uri_escape_utf8($value);
}
}
$env->{QUERY_STRING} = join( '&', @params );
}
my $request = Dancer2::Core::Request->new( env => $env );
# body
$request->body( $options->{body} ) if exists $options->{body};
# headers
if ( $options->{headers} ) {
for my $header ( @{ $options->{headers} } ) {
my ( $name, $value ) = @{$header};
$request->header( $name => $value );
if ( $name =~ /^cookie$/i ) {
$env->{HTTP_COOKIE} = $value;
}
}
}
# files
if ( $options->{files} ) {
for my $file ( @{ $options->{files} } ) {
my $headers = $file->{headers};
$headers->{'Content-Type'} ||= 'text/plain';
my $temp = File::Temp->new();
if ( $file->{data} ) {
print $temp $file->{data};
close($temp);
}
else {
require File::Copy;
File::Copy::copy( $file->{filename}, $temp );
}
my $upload = Dancer2::Core::Request::Upload->new(
filename => $file->{filename},
size => -s $temp->filename,
tempname => $temp->filename,
headers => $headers,
);
## keep temp_fh in scope so it doesn't get deleted too early
## But will get deleted by the time the test is finished.
$upload->{temp_fh} = $temp;
$request->uploads->{ $file->{name} } = $upload;
}
}
# content-type
if ( $options->{content_type} ) {
$request->content_type( $options->{content_type} );
}
return ( $request, $env );
}
sub _build_env_from_request {
my ($request) = @_;
my $env = {
REQUEST_METHOD => $request->method,
PATH_INFO => $request->path,
QUERY_STRING => '',
'psgi.url_scheme' => 'http',
SERVER_PROTOCOL => 'HTTP/1.0',
SERVER_NAME => 'localhost',
SERVER_PORT => 3000,
HTTP_HOST => 'localhost',
HTTP_USER_AGENT => "Dancer2::Test simulator v" . Dancer2->VERSION,
};
# TODO
if ( my $params = $request->{_query_params} ) {
my @params;
while ( my ( $p, $value ) = each %{$params} ) {
if ( is_arrayref($value) ) {
for my $v (@$value) {
push @params,
uri_escape_utf8($p) . '=' . uri_escape_utf8($v);
}
}
else {
push @params,
uri_escape_utf8($p) . '=' . uri_escape_utf8($value);
}
}
$env->{QUERY_STRING} = join( '&', @params );
}
# TODO files
return ( $request, $env );
}
sub response_status_is {
my ( $req, $status, $test_name ) = @_;
carp 'DEPRECATED: Dancer2::Test. Please use Plack::Test instead'
unless $NO_WARN;
$test_name ||= "response status is $status for " . _req_label($req);
my $response = dancer_response($req);
my $tb = Test::Builder->new;
local $Test::Builder::Level = $Test::Builder::Level + 1;
$tb->is_eq( $response->[0], $status, $test_name );
}
sub _find_route_match {
( run in 1.002 second using v1.01-cache-2.11-cpan-d7f47b0818f )