Concierge

 view release on metacpan or  search on metacpan

t/04-user-operations.t  view on Meta::CPAN

    is $result->{user}{moniker}, 'Alice', 'moniker returned';
    is $result->{user}{email}, 'alice@example.com', 'email returned';
    ok !exists $result->{user}{theme}, 'theme not returned';
};

subtest 'update_user_data modifies user' => sub {
    my $result = $concierge->update_user_data('alice', {
        theme => 'light',
        role  => 'admin',
    });

    ok $result->{success}, 'update_user_data succeeds';

    # Verify changes
    my $check = $concierge->get_user_data('alice');
    is $check->{user}{theme}, 'light', 'theme updated';
    is $check->{user}{role}, 'admin', 'role updated';
};

subtest 'update_user_data filters protected fields' => sub {
    my $result = $concierge->update_user_data('alice', {
        user_id  => 'hacker',  # Should be filtered out
        password => 'newpass',  # Should be filtered out
        theme    => 'blue',
    });

    ok $result->{success}, 'update succeeds';

    # Verify user_id didn't change
    my $check = $concierge->get_user_data('alice');
    is $check->{user}{user_id}, 'alice', 'user_id unchanged';
    is $check->{user}{theme}, 'blue', 'theme updated';
};

subtest 'list_users returns user_ids' => sub {
    # Add another user
    $concierge->add_user({
        user_id  => 'bob',
        moniker  => 'Bob',
        password => 'bobpass1',
    });

    my $result = $concierge->list_users();

    ok $result->{success}, 'list_users succeeds';
    ref_ok $result->{user_ids}, 'ARRAY', 'user_ids is array';
    ok $result->{count} >= 2, 'has multiple users';
    ok scalar(grep { $_ eq 'alice' } @{$result->{user_ids}}), 'alice in list';
    ok scalar(grep { $_ eq 'bob' } @{$result->{user_ids}}), 'bob in list';
};

subtest 'list_users with include_data' => sub {
    my $result = $concierge->list_users('', { include_data => 1 });

    ok $result->{success}, 'list_users with data succeeds';
    ref_ok $result->{users}, 'HASH', 'users is hash';
    ok exists $result->{users}{alice}, 'alice data included';
    is $result->{users}{alice}{moniker}, 'Alice', 'alice data correct';
};

subtest 'verify_password checks credentials' => sub {
    my $result = $concierge->verify_password('alice', 'secret123');
    ok $result->{success}, 'correct password verified';

    $result = $concierge->verify_password('alice', 'wrongpass');
    ok !$result->{success}, 'incorrect password rejected';
};

subtest 'reset_password changes password' => sub {
    my $result = $concierge->reset_password('alice', 'newsecret456');
    ok $result->{success}, 'reset_password succeeds';

    # Verify old password doesn't work
    my $check = $concierge->verify_password('alice', 'secret123');
    ok !$check->{success}, 'old password rejected';

    # Verify new password works
    $check = $concierge->verify_password('alice', 'newsecret456');
    ok $check->{success}, 'new password accepted';
};

subtest 'remove_user deletes from all components' => sub {
    # Create and login user to create session
    $concierge->add_user({
        user_id  => 'removeme',
        moniker  => 'RemoveMe',
        password => 'temppass1',
    });

    $concierge->login_user({
        user_id  => 'removeme',
        password => 'temppass1',
    });

    # Remove user
    my $result = $concierge->remove_user('removeme');

    ok $result->{success}, 'remove_user succeeds';
    like $result->{message}, qr/removed/i, 'success message';

    # Verify user is gone from all components
    my $verify = $concierge->verify_user('removeme');
    ok !$verify->{verified}, 'user no longer verified';
    ok !$verify->{exists_in_auth}, 'removed from auth';
    ok !$verify->{exists_in_users}, 'removed from users';
};

subtest 'add_user with non-hashref input' => sub {
    my $result = $concierge->add_user('not a hash');
    ok !$result->{success}, 'add_user fails with non-hashref';
    like $result->{message}, qr/hash/i, 'error mentions hash';
};

subtest 'remove_user input validation' => sub {
    my $r1 = $concierge->remove_user(undef);
    ok !$r1->{success}, 'remove_user fails with undef user_id';

    my $r2 = $concierge->remove_user('');
    ok !$r2->{success}, 'remove_user fails with empty user_id';
};



( run in 1.604 second using v1.01-cache-2.11-cpan-22024b96cdf )