The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Test::UriRedirect;

use Test::Exception;
use Test::Roo::Role;

use DateTime;

test 'uri_redirects tests' => sub {

    my $self = shift;
    my ($nav, $uri_redirect);
    my $schema = $self->ic6s_schema;

    # pop nav from fixtures

    $nav = $self->navigation->find( { uri => 'hand-tools/hammers' } ); 

    lives_ok(
        sub {
            $uri_redirect = $schema->resultset("UriRedirect")->create(
                {
                    uri_source           => 'my_bad_uri',
                    uri_target           => $nav->uri
                }
            );
        },
        "Create Uri 301 Redirect my_bad_uri -> hand-tools/hammers"
    );

    cmp_ok( $self->uri_redirects->find({ uri_source => 'my_bad_uri' })->status_code,
        '==', 301, "301 default uri_redirect status_code" );

    lives_ok(
        sub {
            $uri_redirect = $self->uri_redirects->find( { uri_source => 'bad_uri_1' } );
        },
        "find uri_redirect uri_source bad_uri_1 from fixtures"
    );

    # 3 records from fixtures
    cmp_ok( $schema->resultset('UriRedirect')->count,
        '==', 4, "4 uri redirects" );

    # cleanup
    $self->clear_uri_redirects;

    scalar $schema->resultset("UriRedirect")->populate(
        [
            [qw/uri_source uri_target status_code/],
            [qw{/one /two 301}],
            [qw{/two /three 302}],
            [qw{/bad1 /bad2 301}],
            [qw{/bad2 /bad3 301}],
            [qw{/bad3 /bad1 302}],
        ]
    );

    cmp_ok( $schema->resultset('UriRedirect')->count,
        '==', 5, "5 uri redirects" );

    my ( $target, $code );

    lives_ok(
        sub {
            ( $target, $code ) =
              $schema->resultset("UriRedirect")->redirect('none');
        },
        "try non-existant redirect"
    );
    ok(!defined $target, "uri_target not defined");
    ok(!defined $code, "status_code not defined");

    lives_ok(
        sub {
            ( $target, $code ) =
              $schema->resultset("UriRedirect")->redirect('/one');
        },
        "try /one redirect"
    );
    cmp_ok($target, 'eq', '/three', "uri_target /three");
    cmp_ok($code, 'eq', 302, "status_code is 302");

    my $result;
    lives_ok(
        sub {
            $result =
              $schema->resultset("UriRedirect")->redirect('/one');
        },
        "try /one redirect"
    );
    cmp_ok($result->[0], 'eq', '/three', "uri_target /three");
    cmp_ok($result->[1], 'eq', 302, "status_code is 302");

    lives_ok(
        sub {
            ( $target, $code ) =
              $schema->resultset("UriRedirect")->redirect('/bad1');
        },
        "circular redirect"
    );
    is($target, undef, "uri_target undef");

    # cleanup
    $self->clear_uri_redirects;

    cmp_ok( $schema->resultset('UriRedirect')->count,
        '==', 0, "0 UriRedirect rows" );
};

1;