The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Kelp::Base -strict;

use Kelp;
use Kelp::Test;
use HTTP::Request::Common;
use Test::More;

my $app = Kelp->new( mode => 'test' );
$app->routes->base("main");
my $t = Kelp::Test->new( app => $app );

# Bridge
$app->add_route(
    "/bridge" => {
        to   => "bridge",
        tree => [ "/route" => "bridge_route" ]
    }
);
$t->request( GET '/bridge' )->code_is(403);
$t->request( GET '/bridge/route' )->code_is(403);
$t->request( GET '/bridge/route?code=404' )->code_is(404);
$t->request( GET '/bridge/not_existing_route?ok=1' )->code_is(404);

$t->request( GET '/bridge/route?ok=1' )
  ->code_is(200)
  ->content_is("We like milk.");

# render inside bridge
$app->add_route(
    "/render" => {
        to => sub {
            $_[0]->res->set_code(700)->render('auth');
        },
        bridge => 1
    }
);

$t->request( GET '/render' )
  ->code_is(700)
  ->content_is('auth');

# Redirect inside bridge
$app->add_route( '/auth' => sub { 'auth' } );
$app->add_route(
    '/redirect' => {
        to => sub { $_[0]->res->redirect_to('/auth'); 0 },
        tree => [
            '/dead' => sub { 'you should not see this' }
        ]
    }
);

$t->request( GET '/redirect/dead' )
  ->code_is(302)
  ->header_like(location => qr{/auth$});

done_testing;

sub bridge {
    my $self = shift;
    $self->req->stash->{info} = "We like milk.";
    if ( my $code = $self->param('code') ) {
        $self->res->set_code($code)->render("ok");
    }
    return $self->param('ok');
}

sub bridge_route {
    my $self = shift;
    return $self->req->stash->{info};
}