The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use Test::More tests => 1;

use Mojolicious::Routes;
use MojoX::Routes::AsGraph;

### The top level container
my $r = Mojolicious::Routes->new;

### A couple of simple paths
$r->route('/')->to( controller => 'site', action => 'homepage')->name('Homepage' );
$r->route('/about')->to( controller => 'site', action => 'about')->name('About');

### check for long lived cookies for username hints; also check for authed users
my $user_sniffer = $r->under->to(controller => 'auth', action => 'sniff_user');

### homepage
$user_sniffer->route('/')->to(controller => 'dashboard', action => 'home');

### Login doesn't require auth but login might like to sniff the user
$user_sniffer->route('/login')->to(controller => 'auth', action => 'login');
$user_sniffer->route('/logout')->to(controller => 'auth', action => 'logout');

### Auth zone
my $is_authed = $user_sniffer->under->to(controller => 'auth', action => 'require_user' );

### My restricted area
my $home = $is_authed->route('/home')->to(controller => 'member_area');
$home->route()->to( action => 'index' );
$home->route('/profile')->to(action => 'profile');

### Ok, lets draw this
my $graph = MojoX::Routes::AsGraph->graph($r);
is($graph->as_txt, <<'...');
[  <empty 1> ] --> [  \[auth->sniff_user\] ]
[  <empty 1> ] --> [ * '/about' \[site->about\] (About) ]
[  <empty 1> ] --> [ * \[site->homepage\] (Homepage) ]
[  \[auth->sniff_user\] ] --> [  \[auth->require_user\] ]
[  \[auth->sniff_user\] ] --> [ * '/login' \[auth->login\] (login) ]
[  \[auth->sniff_user\] ] --> [ * '/logout' \[auth->logout\] (logout) ]
[  \[auth->sniff_user\] ] --> [ * \[dashboard->home\] ]
[  \[auth->require_user\] ] --> [  '/home' \[member_area\] (home) ]
[  '/home' \[member_area\] (home) ] --> [ * '/profile' \[->profile\] (profile) ]
[  '/home' \[member_area\] (home) ] --> [ * \[->index\] ]
...