use strict; use warnings; use Test::More import => ['!pass']; use Dancer ':syntax'; use Dancer::Test; BEGIN { use_ok('Dancer::Exception', ':all'); } set views => path( 't', '25_exceptions', 'views' ); { # halt in route my $v = 0; get '/halt_in_route' => sub { halt ({ error => 'plop' }); $v = 1; }; response_content_like( [ GET => '/halt_in_route' ], qr|Unable to process your query| ); response_status_is( [ GET => '/halt_in_route' ], 500 => "We get a 500 status" ); is ($v, 0, 'halt broke the workflow as intended'); } { # halt in hook my $flag = 0; my $v = 0; hook before_template_render => sub { if ( 0 || ! $flag++ ) { status 500; halt ({ error => 'plop2' }); $v = 1; } }; get '/halt_in_hook' => sub { template 'index'; }; response_content_like( [ GET => '/halt_in_hook' ], qr|Unable to process your query| ); is ($v, 0, 'halt broke the workflow as intended'); $flag = 0; response_status_is( [ GET => '/halt_in_hook' ], 500 => "We get a 500 status" ); } set error_template => "error.tt"; { # die in route get '/die_in_route' => sub { die "die in route"; }; response_content_like( [ GET => '/die_in_route' ], qr|MESSAGE:
die in route| );
response_content_like( [ GET => '/die_in_route' ], qr|EXCEPTION: die in route| );
response_status_is( [ GET => '/die_in_route' ], 500 => "We get a 500 status" );
}
register_exception ('Test',
message_pattern => "test - %s",
);
{
my $route_hook_executed = 0;
my $handler_hook_executed = 0;
# raise in route
get '/raise_in_route' => sub {
raise Test => 'plop';
};
hook on_route_exception => sub {
my ($exception) = @_;
$exception->isa('Dancer::Exception::Test');
$route_hook_executed++;
};
hook on_handler_exception => sub {
my ($exception) = @_;
$exception->isa('Dancer::Exception::Test');
$handler_hook_executed++;
};
response_content_like( [ GET => '/raise_in_route' ], qr|MESSAGE: runtime error
| );
my $e = "test - plop";
response_content_like( [ GET => '/raise_in_route' ], qr|EXCEPTION: $e| );
response_status_is( [ GET => '/raise_in_route' ], 500 => "We get a 500 status" );
is($route_hook_executed, 3,"exception route hook has been called");
is($handler_hook_executed, 3,"exception handler hook has been called");
}
{
# die in hook
my $flag = 0;
hook after_template_render => sub {
$flag++
or die "die in hook";
};
get '/die_in_hook' => sub {
template 'index', { foo => 'baz' };
};
$flag = 0;
response_content_like( [ GET => '/die_in_hook' ], qr|MESSAGE: runtime error
| );
$flag = 0;
response_content_like( [ GET => '/die_in_hook' ], qr|EXCEPTION: die in hook| );
$flag = 0;
response_status_is( [ GET => '/die_in_hook' ], 500 => "We get a 500 status" );
}
register_exception ('Generic',
message_pattern => "test message : %s",
);
{
# raise in hook
my $flag = 0;
hook before_template_render => sub {
$flag++
or raise Generic => 'foo';
};
get '/raise_in_hook' => sub {
template 'index', { foo => 'baz' };
};
route_exists [ GET => '/raise_in_hook' ];
$flag = 0;
response_content_like( [ GET => '/raise_in_hook' ], qr|MESSAGE: runtime error
| );
$flag = 0;
response_content_like( [ GET => '/raise_in_hook' ], qr|EXCEPTION: test message : foo| );
$flag = 0;
response_status_is( [ GET => '/raise_in_hook' ], 500 => "We get a 500 status" );
}
done_testing();