#!/usr/bin/env perl
BEGIN {
eval
"require Dancer2"
;
plan
skip_all
=>
'Dancer2 is not installed'
if
$@;
plan
skip_all
=>
"Dancer2 is too old: $Dancer2::VERSION"
if
version->parse(
$Dancer2::VERSION
) <= 0.207;
warn
"Dancer2 version $Dancer2::VERSION\n"
;
eval
"require Plack::Test"
;
$@ and plan
skip_all
=>
'Unable to load Plack::Test'
;
eval
"require HTTP::Cookies"
;
$@ and plan
skip_all
=>
'Unable to load HTTP::Cookies'
;
eval
"require HTTP::Request::Common"
;
$@ and plan
skip_all
=>
'Unable to load HTTP::Request::Common'
;
HTTP::Request::Common->
import
;
plan
tests
=> 4;
}
{
set
session
=>
'Simple'
;
set
logger
=>
'LogReport'
;
dispatcher
close
=>
'default'
;
hook
before
=>
sub
{
if
(query_parameters->get(
'is_fatal'
))
{
my
$foo
;
$foo
->bar;
}
};
get
'/'
=>
sub
{
my
$foo
;
$foo
->bar;
};
get
'/write_message/:level/:text'
=>
sub
{
my
$level
= param(
'level'
);
my
$text
= param(
'text'
);
eval
qq($level "$text")
;
};
get
'/read_message'
=>
sub
{
my
$all
= session
'messages'
;
my
$message
=
pop
@$all
or
return
''
;
"$message"
;
};
get
'/process'
=>
sub
{
process(
sub
{ error
"Fatal error text"
});
};
get
'/show_error/:show_error'
=>
sub
{
set
show_errors
=> route_parameters->get(
'show_error'
);
};
get
'/add_fatal_handler/:type'
=>
sub
{
my
$type
= param
'type'
;
if
(
$type
eq
'json'
) {
fatal_handler
sub
{
my
(
$dsl
,
$msg
,
$reason
) =
@_
;
return
unless
$dsl
->app->request->uri =~ /api/;
$dsl
->send_as(
JSON
=> {
message
=>
$msg
->toString});
};
}
elsif
(
$type
eq
'html'
)
{
fatal_handler
sub
{
my
(
$dsl
,
$msg
,
$reason
) =
@_
;
return
unless
$dsl
->app->request->uri =~ /html/;
$dsl
->send_as(
html
=>
"<p>"
.
$msg
->toString.
"</p>"
);
};
}
};
}
my
$jar
= HTTP::Cookies->new();
my
$test
= Plack::Test->create( TestApp->to_app );
subtest
'Basic messages'
=>
sub
{
{
my
$req
= GET
"$url/write_message/notice/notice_text"
;
$jar
->add_cookie_header(
$req
);
my
$res
=
$test
->request(
$req
);
ok
$res
->is_success,
"get /write_message"
;
$jar
->extract_cookies(
$res
);
$req
= GET
"$url/read_message"
;
$jar
->add_cookie_header(
$req
);
$res
=
$test
->request(
$req
);
is (
$res
->content,
'notice_text'
);
}
{
my
$req
= GET
"$url/write_message/trace/trace_text"
;
$jar
->add_cookie_header(
$req
);
my
$res
=
$test
->request(
$req
);
ok
$res
->is_success,
"get /write_message"
;
$jar
->extract_cookies(
$res
);
$req
= GET
"$url/read_message"
;
$jar
->add_cookie_header(
$req
);
$res
=
$test
->request(
$req
);
is (
$res
->content,
''
);
}
};
subtest
'Throw error'
=>
sub
{
{
my
$req
= GET
"$url/write_message/error/error_text"
;
my
$res
=
$test
->request(
$req
);
ok
$res
->is_redirect,
"get /write_message"
;
}
{
my
$req
= GET
"$url/process"
;
$jar
->add_cookie_header(
$req
);
my
$res
=
$test
->request(
$req
);
ok
$res
->is_success,
"get /write_message"
;
is
$res
->content,
'0'
;
$jar
->extract_cookies(
$res
);
$req
= GET
"$url/read_message"
;
$jar
->add_cookie_header(
$req
);
$res
=
$test
->request(
$req
);
is (
$res
->content,
'Fatal error text'
);
}
};
subtest
'Unexpected exception default page'
=>
sub
{
{
my
$req
= GET
"$url/"
;
my
$res
=
$test
->request(
$req
);
ok !
$res
->is_redirect,
"No redirect for exception on default route"
;
is
$res
->content,
"An unexpected error has occurred"
,
"Plain text exception text correct"
;
}
{
$test
->request(GET
"$url/show_error/1"
);
my
$req
= GET
"$url/"
;
my
$res
=
$test
->request(
$req
);
ok !
$res
->is_redirect,
"get /write_message"
;
like
$res
->content,
qr/Can't call method "bar" on an undefined value/
;
$test
->request(GET
"$url/show_error/0"
);
}
{
my
$req
= GET
"$url/?is_fatal=1"
;
my
$res
=
$test
->request(
$req
);
ok !
$res
->is_redirect,
"get /write_message"
;
like
$res
->content,
qr/Error 500 - Internal Server Error/
;
}
};
subtest
'Custom handler'
=>
sub
{
$test
->request(GET
"$url/add_fatal_handler/json"
);
$test
->request(GET
"$url/add_fatal_handler/html"
);
{
my
$req
= GET
"$url/write_message/error/api_text"
;
my
$res
=
$test
->request(
$req
);
ok
$res
->is_success,
"get /write_message"
;
is
$res
->content,
'{"message":"api_text"}'
;
}
{
my
$req
= GET
"$url/write_message/error/html_text"
;
my
$res
=
$test
->request(
$req
);
ok
$res
->is_success,
"get /write_message"
;
is
$res
->content,
'<p>html_text</p>'
;
}
{
my
$req
= GET
"$url/write_message/error/error_text"
;
my
$res
=
$test
->request(
$req
);
ok
$res
->is_redirect,
"get /write_message"
;
}
};
done_testing;