The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -wT
use Test::More;
plan tests => 22;

use strict;
use warnings;

use CGI ();

{
    package TestAppProtectedRunmodes;

    use base qw(CGI::Application);
    use CGI::Application::Plugin::Authentication;

    __PACKAGE__->authen->config(
        DRIVER => [ 'Generic', { user1 => '123' } ],
        STORE  => 'Store::Dummy',
    );
}

$ENV{CGI_APP_RETURN_ONLY} = 1;

my $cgiapp = TestAppProtectedRunmodes->new;
my $authen = $cgiapp->authen;

ok($authen->protected_runmodes(qw(one)), 'we can register protected runmodes');
is_deeply( [$authen->protected_runmodes], [ 'one' ], 'verify that runmode is registered correctly' );

ok($authen->protected_runmodes(qw(two three)), 'we can register multiple protected runmodes');
is_deeply( [$authen->protected_runmodes], [ qw(one two three) ], 'verify that runmodes are cummulative' );

ok($authen->protected_runmodes(qr/^auth_/), 'we can register protected runmodes as a regexp');
is_deeply( [$authen->protected_runmodes], [ qw(one two three), qr/^auth_/ ], 'verify that this test was added' );

my $sub = sub { $_[0] eq 'sub' ? 1 : 0 };
ok($authen->protected_runmodes($sub), 'we can register protected runmodes as a subroutine reference');
is_deeply( [$authen->protected_runmodes], [ qw(one two three), qr/^auth_/, $sub ], 'verify that this test was added' );

# test valid runmodes
ok($authen->is_protected_runmode('one'), "Test 'is_protected_runmode' with valid string");
ok($authen->is_protected_runmode('two'), "Test 'is_protected_runmode' with valid string");
ok($authen->is_protected_runmode('three'), "Test 'is_protected_runmode' with valid string");
ok($authen->is_protected_runmode('auth_test'), "Test 'is_protected_runmode' with valid regexp test string");
ok($authen->is_protected_runmode('sub'), "Test 'is_protected_runmode' with valid subroutine test string");

# test invalid runmodes
ok(!$authen->is_protected_runmode('notone'), "Test 'is_protected_runmode' with invalid value");
ok(!$authen->is_protected_runmode('authtest'), "Test 'is_protected_runmode' with invalid value");
ok(!$authen->is_protected_runmode('subtest'), "Test 'is_protected_runmode' with invalid value");
ok(!$authen->is_protected_runmode(''), "Test 'is_protected_runmode' with empty string value");
ok(!$authen->is_protected_runmode( [] ), "Test 'is_protected_runmode' with invalid value (arrayref)");
ok(!$authen->is_protected_runmode( {} ), "Test 'is_protected_runmode' with invalid value (arrayref)");


ok($authen->protected_runmodes(':all'), 'we can mark all runmodes as protected');
is_deeply( [$authen->protected_runmodes], [ qw(one two three), qr/^auth_/, $sub, ':all' ], 'verify that this test was added' );
ok($authen->is_protected_runmode('anything_goes'), "Test 'is_protected_runmode' with any string");