EV-Etcd
view release on metacpan or search on metacpan
my $perm_count = $resp->{perm} ? scalar(@{$resp->{perm}}) : 0;
ok($perm_count == 0, 'role has no permissions after revoke');
diag("Role has $perm_count permission(s) after revoke");
EV::break;
});
my $t5c = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 16-17: user_add
$client->user_add($test_user, 'test-password-123', sub {
my ($resp, $err) = @_;
ok(!$err, 'user_add succeeded');
ok($resp->{header}, 'user_add response has header');
diag("Created user: $test_user");
EV::break;
});
my $t6 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 18-19: authenticate() method
# When auth is disabled, authenticate returns an error (auth not enabled)
# When auth is enabled, authenticate returns a token
{
my $auth_result;
my $auth_err;
$client->authenticate($test_user, 'test-password-123', sub {
my ($resp, $err) = @_;
$auth_result = $resp;
$auth_err = $err;
EV::break;
});
my $t_auth = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# authenticate() should either succeed (auth enabled) or fail with specific error (auth disabled)
if ($auth_err) {
# Auth disabled - expect "authentication is not enabled" error
like($auth_err->{message} // $auth_err, qr/auth|not enabled|UNAUTHENTICATED/i,
'authenticate returns expected error when auth disabled');
pass('authenticate error handling works');
diag("authenticate() error (expected when auth disabled): " . ($auth_err->{message} // $auth_err));
} else {
# Auth enabled - expect token in response
ok($auth_result, 'authenticate succeeded');
ok(defined $auth_result->{token}, 'authenticate response has token');
diag("authenticate() returned token (auth is enabled)");
}
}
# Test 20: authenticate() with wrong password
{
my $wrong_err;
$client->authenticate($test_user, 'wrong-password', sub {
my ($resp, $err) = @_;
$wrong_err = $err;
EV::break;
});
my $t_wrong = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Should return an error (either auth not enabled, or invalid credentials)
ok($wrong_err, 'authenticate with wrong password returns error');
diag("Wrong password error: " . ($wrong_err->{message} // $wrong_err));
}
# Test 21-22: user_change_password
{
my $change_result;
my $change_err;
$client->user_change_password($test_user, 'new-password-456', sub {
my ($resp, $err) = @_;
$change_result = $resp;
$change_err = $err;
EV::break;
});
my $t_change = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
ok(!$change_err, 'user_change_password succeeded');
ok($change_result && $change_result->{header}, 'user_change_password response has header');
diag("Changed password for user: $test_user");
}
# Test 23-24: user_list
$client->user_list(sub {
my ($resp, $err) = @_;
ok(!$err, 'user_list succeeded');
my $found = grep { $_ eq $test_user } @{$resp->{users} || []};
ok($found, 'our test user is in the list');
diag("Found " . scalar(@{$resp->{users} || []}) . " users");
EV::break;
});
my $t7 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 25: user_grant_role
$client->user_grant_role($test_user, $test_role, sub {
my ($resp, $err) = @_;
ok(!$err, 'user_grant_role succeeded');
diag("Granted role $test_role to user $test_user");
EV::break;
});
my $t8 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 26-27: user_get
$client->user_get($test_user, sub {
my ($resp, $err) = @_;
ok(!$err, 'user_get succeeded');
my $has_role = grep { $_ eq $test_role } @{$resp->{roles} || []};
ok($has_role, 'user has the granted role');
EV::break;
});
my $t9 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Cleanup (Test 28-30): revoke role from user, delete user, delete role
# Test 28: user_revoke_role
$client->user_revoke_role($test_user, $test_role, sub {
( run in 0.798 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )