
use strict;
use warnings;

use RT::Test;
use HTML::TreeBuilder;

my ( $baseurl, $m ) = RT::Test->started_ok;

ok( $m->login( 'root' => 'password' ), 'login as root' );

my %viewed = ( '/NoAuth/Logout.html' => 1 );    # in case logout

my $user = RT::User->new($RT::SystemUser);
$user->Load('root');
ok( $user->id, 'loaded root' );

my $queue = RT::Queue->new($RT::SystemUser);
$queue->Load('General');
ok( $queue->id, 'loaded General queue' );

my $group = RT::Group->new($RT::SystemUser);
ok( $group->CreateUserDefinedGroup( Name => 'group_foo' ) );
my $cf = RT::CustomField->new($RT::SystemUser);
ok(
    $cf->Create(
        Name       => 'cf_foo',
        Type       => 'Freeform',
        LookupType => 'RT::Queue-RT::Ticket',
    )
);
ok( $cf->id, 'created cf_foo' );

my $class = RT::Class->new($RT::SystemUser);
ok( $class->Create( Name => 'class_foo' ) );
ok( $class->id, 'created class_foo' );

# to make search have results
my $open_ticket = RT::Test->create_ticket(
    Subject => 'ticket_foo',
    Queue   => 1,
);

my $resolved_ticket = RT::Test->create_ticket(
    Subject => 'ticket_bar',
    Status  => 'resolved',
    Queue   => 1,
);

my @links = (
    '/',
    '/Admin/Users/Modify.html?id=' . $user->id,
    '/Admin/Groups/Modify.html?id=' . $group->id,
    '/Admin/Queues/Modify.html?id=' . $queue->id,
    '/Admin/CustomFields/Modify.html?id=' . $cf->id,
    '/Admin/Global/Scrip.html?id=1',
    '/Admin/Global/Template.html?Template=1',
    '/Admin/Articles/Classes/Modify.html?id=' . $class->id,
    '/Search/Build.html?Query=id<10',
    '/Ticket/Display.html?id=' . $open_ticket->id,
    '/Ticket/Display.html?id=' . $resolved_ticket->id,
);

for my $link (@links) {
    test_page($m, $link);
}

$m->get_ok('/NoAuth/Logout.html');

sub test_page {
    my $m = shift;
    my $link = shift;
    $m->get_ok( $link, $link );
    $m->no_warnings_ok($link);

    my $tree = HTML::TreeBuilder->new();
    $tree->parse( $m->content );
    $tree->elementify;
    my ($top_menu)  = $tree->look_down( id => 'main-navigation' );
    my ($page_menu) = $tree->look_down( id => 'page-navigation' );

    my (@links) =
      grep { !$viewed{$_}++ && /^[^#]/ }
      map { $_->attr('href') || () } ( $top_menu ? $top_menu->find('a') : () ),
      ( $page_menu ? $page_menu->find('a') : () );

    for my $link (@links) {
        test_page($m, $link);
    }
}

