Class-User-DBI

 view release on metacpan or  search on metacpan

t/21-cu_dbi.t  view on Meta::CPAN

## no critic (RCS,VERSION,encapsulation,Module)

use strict;
use warnings;
use Test::More;
use Test::Exception;

use List::MoreUtils qw( any );

use Class::User::DBI;
use Class::User::DBI::Roles;
use Class::User::DBI::Privileges;
use Class::User::DBI::RolePrivileges;

# use Data::Dumper;

use DBIx::Connector;

# WARNING:  Tables will be dropped before and after running these tests.
#           Only run the tests against a test database containing no data
#           of value.
#           Tables 'users', 'user_ips'.
# YOU HAVE BEEN WARNED.

# SQLite database settings.
my $dsn     = 'dbi:SQLite:dbname=:memory:';
my $db_user = q{};
my $db_pass = q{};

# mysql database settings.
# my $database = 'cudbi_test';
# my $dsn      = "dbi:mysql:database=$database";
# my $db_user  = 'tester';
# my $db_pass  = 'testers_pass';

my $conn = DBIx::Connector->new(
    $dsn, $db_user, $db_pass,
    {
        RaiseError => 1,
        AutoCommit => 1,
    }
);

my $appuser        = 'testuser';
my $appuser_ip_req = 'testuser_ip_req';
my $test_ip        = '192.168.0.198';
my $test_ip2       = '192.168.0.199';
my $appuser_pass   = 'Morerugs';

subtest 'Class::User::DBI use and can tests.' => sub {
    my $user = use_ok( 'Class::User::DBI', [ $conn, $appuser ] );
    can_ok(
        'Class::User::DBI', qw(
          _db_conn          _db_run         add_ips         add_user
          configure_db      delete_ips      delete_user     exists_user
          get_credentials get_valid_ips get_role        is_role
          list_users        load_profile    new             set_role
          set_email         update_password set_username
          userid            validate        validated
          )
    );
    done_testing();
};

# Prepare the database environment.
# Drop tables if they exist (in case we're testing against a non-memory
# test database.

$conn->run(
    fixup => sub {
        $_->do('DROP TABLE IF EXISTS users');
    }
);

$conn->run(
    fixup => sub {
        $_->do('DROP TABLE IF EXISTS user_ips');
    }
);

Class::User::DBI->configure_db($conn);
Class::User::DBI::UserDomains->configure_db($conn);
subtest "Tests for $appuser" => sub {

    my $user = Class::User::DBI->new( $conn, $appuser );
    if ( !$user->exists_user ) {
        $user->add_user(
            {
                userid   => $appuser,
                password => $appuser_pass,
                email    => 'fake@address.com',
                username => 'Test User',
            }
        );
    }

    isa_ok( $user, 'Class::User::DBI', 'new():         ' );

    is( $user->userid, $appuser, 'userid():     Returns correct user ID.' );
    is( $user->validated, 0,
        'validated():    Returns false if user has not been validated yet.' );
    isa_ok( $user->_db_conn, 'DBIx::Connector', '_db_conn():     ' );

    my $query_handle = $user->_db_run( 'SELECT * FROM users', () );
    isa_ok( $query_handle, 'DBI::st', '_db_run():  ' );

    my $rv = $user->get_credentials();

    is( ref($rv), 'HASH', 'get_credentials():   Returns a hashref.' );
    ok( exists( $rv->{valid_ips} ),
        'get_credentials():   valid_ips   field found.' );
    ok( exists( $rv->{ip_required} ),
        'get_credentials():   ip_required field found.' );
    ok( exists( $rv->{salt_hex} ),
        'get_credentials():   salt_hex    field found.' );
    ok( exists( $rv->{pass_hex} ),
        'get_credentials():  pass_hex    field found.' );
    ok( exists( $rv->{userid} ), 'get_credentials():  userid    field found.' );
    is( $rv->{userid}, $appuser, 'get_credentials():  Correct userid found.' );
    is( ref( $rv->{valid_ips} ),
        'ARRAY', 'get_credentials():  valid_ips contains aref.' );
    is( $rv->{ip_required} == 0 || $rv->{ip_required} == 1,
        1, 'get_credentials():  ip_required is a Boolean value.' );
    like( $rv->{salt_hex}, qr/^[[:xdigit:]]{128}$/x,
        'get_credentials():  salt_hex has 128 hex digits.' );
    like( $rv->{pass_hex}, qr/^[[:xdigit:]]{128}$/x,
        'get_credentials():  pass_hex has 128 hex digits.' );
    is( scalar( $user->get_valid_ips ),
        0, "get_valid_ips():  $appuser has no IP's." );
    is( $user->exists_user, 1, "exists_user(): $appuser exists in DB." );
    is( $user->validate('wrong pass'),
        0, 'validate: Reject incorrect password with 0.' );
    is( $user->validated, 0,
        'validated():   Flag still false after rejected validation.' );

    is( $user->validate($appuser_pass),
        1, "validate(): $appuser validates by password." );
    is( $user->validated, 1,
            'validated():   Flag set to true after successful call '
          . 'to validate()' );
    $user->validated(0);
    is( $user->validated, 0,
        'validated():   User validation flag may be flipped to not-validated.'
    );
    $user->validated(1);
    is( $user->validated, 0,
            'validated():   User validation flag may not be explicitly set '
          . 'true via accessor.' );
    my $load = $user->load_profile;
    is( ref($load), 'HASH', 'load_profile(): Returns a hashref.' );
    is( $load->{userid}, $appuser,
        'load_userid()->{userid}: Returns proper user ID.' );
    like( $load->{email}, qr/@/,
            'load_userid()->{email}: Returns something that looks like an '
          . 'email address.' );
    done_testing();
};

subtest "Tests for $appuser_ip_req." => sub {
    my $user = Class::User::DBI->new( $conn, $appuser_ip_req );
    if ( !$user->exists_user ) {
        $user->add_user(
            {
                username => 'Test User Requiring IP',
                email    => 'fake@address.com',
                ip_req   => 1,
                ips      => ['192.168.0.198'],
                password => $appuser_pass,
            }
        );
    }
    isa_ok( $user, 'Class::User::DBI', 'new():         ' );
    is( grep( { $_ eq $test_ip } $user->get_valid_ips ),
        1, 'get_valid_ips(): Found a known IP in the DB.' );
    is( $user->validate($appuser_pass),
        0, 'validate(): Reject user requiring IP if no IP is supplied.' );
    is( $user->validate( $appuser_pass, '127.0.0.1' ),
        0, 'validate(): Reject user requiring IP if wrong IP is supplied.' );
    is(
        $user->validate( 'wrong pass', $test_ip ),
        0,
        'validate(): Reject user requiring IP if incorrect pass '
          . 'with correct IP.'
    );
    is( $user->validate( $appuser_pass, $test_ip ),
        1, 'validate(): Accept user if correct password and correct IP.' );



( run in 2.106 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )