The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use Kelp::Base -strict;
use Kelp;
my $app = Kelp->new(mode => 'test');
my $t = Kelp::Test->new(app => $app);
# Bare render
$app->add_route("/1", sub { $_[0]->res->render });
$t->request(GET "/1")
->code_is(200)
->content_is('')
->content_type_is('text/html');
# Set code
$app->add_route("/2", sub { $_[0]->res->set_code(401)->render });
$t->request(GET "/2")->code_is(401);
# Set content type
$app->add_route("/3", sub { $_[0]->res->html->render });
$t->request(GET "/3")->content_type_is('text/html');
$app->add_route("/4", sub { $_[0]->res->text->render });
$t->request(GET "/4")->content_type_is('text/plain');
$app->add_route("/5", sub { $_[0]->res->json->render({}) });
$t->request(GET "/5")->content_type_is('application/json');
$app->add_route("/51", sub { $_[0]->res->json->render("aaa") });
$t->request(GET "/51")->code_is(200)->content_type_is('application/json');
$app->add_route("/52", sub { $_[0]->res->json->render(\"aaa") });
$t->request(GET "/52")->code_is(500);
$app->add_route("/53", sub { $_[0]->res->json->render([]) });
$t->request(GET "/53")->code_is(200)->content_type_is('application/json');
$app->add_route("/6", sub { $_[0]->res->xml->render });
$t->request(GET "/6")->content_type_is('application/xml');
$app->add_route("/7", sub { $_[0]->res->set_content_type('image/png')->render });
$t->request(GET "/7")->content_type_is('image/png');
# Set header
$app->add_route("/8", sub { $_[0]->res->set_header('x-something', 'foo')->render });
$t->request(GET "/8")->header_is('x-something', 'foo');
# 404
$app->add_route("/404", sub { $_[0]->res->render_404 });
$t->request(GET "/404")->code_is(404);
# 500
$app->add_route("/500", sub { $_[0]->res->render_500 });
$t->request(GET "/500")->code_is(500);
# Redirect
$app->add_route("/redi1", sub { $_[0]->res->redirect_to('/') });
$t->request(GET "/redi1")->code_is(302);
$app->add_route("/redi2", sub { $_[0]->res->redirect_to('/', {}, 301) });
$t->request(GET "/redi2")->code_is(301);
# Die
$app->add_route("/die", sub { die "You all suck." });
$t->request(GET "/die")->code_is(500);
# Render
$app->add_route("/r1", sub { return "Ahoi" });
$t->request(GET "/r1")
->code_is(200)
->content_type_is('text/html')
->content_is("Ahoi");
$app->add_route("/r2", sub { return {a => 'foo'} });
$t->request(GET "/r2")
->code_is(200)
->content_type_is('application/json')
->json_cmp({a => 'foo'});
# json_content will return a hash
is ref($t->request(GET "/r2")->json_content), 'HASH';
# Template
$app->add_route("/t1", sub { $_[0]->res->text->template(\"[% word %]", {word => 'duck'}) });
$t->request(GET "/t1")
->code_is(200)
->content_type_is('text/plain')
->content_is("duck");
$app->add_route("/t2", sub { $_[0]->res->html->template(\"[% word %]", {word => 'swan'}) });
$t->request(GET "/t2")
->code_is(200)
->content_type_is('text/html')
->content_is("swan");
$app->add_route("/bin1", sub { $_[0]->res->render_binary("123") });
$t->request(GET "/bin1")->code_is(500);
$app->add_route("/bin2", sub { $_[0]->res->set_content_type("image/png")->render_binary("123") });
$t->request(GET "/bin2")->code_is(200);
done_testing;