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 )