EV-Etcd

 view release on metacpan or  search on metacpan

t/auth.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
use lib 'blib/lib', 'blib/arch';
use Test::More;

# Skip if EV not available
BEGIN {
    eval { require EV };
    plan skip_all => 'EV required' if $@;
}

use EV;
use EV::Etcd;

# Check if etcd is available
my $etcd_available = 0;
eval {
    my $client = EV::Etcd->new(
        endpoints => ['127.0.0.1:2379'],
        timeout => 2,
    );
    $client->status(sub {
        my ($resp, $err) = @_;
        $etcd_available = 1 if !$err;
        EV::break;
    });
    my $t = EV::timer(3, 0, sub { EV::break });
    EV::run;
};

plan skip_all => 'etcd not available on 127.0.0.1:2379' unless $etcd_available;

# Note: These tests are designed to work whether auth is enabled or not.
# We test user/role management which works regardless of auth state.
# We intentionally avoid enabling/disabling auth to not disrupt the cluster.

plan tests => 30;

my $client = EV::Etcd->new(
    endpoints => ['127.0.0.1:2379'],
);

my $test_user = "test-user-$$-" . time();
my $test_role = "test-role-$$-" . time();

# Test 1-2: auth_status
$client->auth_status(sub {
    my ($resp, $err) = @_;
    ok(!$err, 'auth_status succeeded');
    ok(defined $resp->{enabled}, 'auth_status has enabled field');
    diag("Auth enabled: " . ($resp->{enabled} ? "yes" : "no"));
    EV::break;
});
my $t1 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;

# Test 3-4: role_add
$client->role_add($test_role, sub {
    my ($resp, $err) = @_;
    ok(!$err, 'role_add succeeded');
    ok($resp->{header}, 'role_add response has header');
    diag("Created role: $test_role");
    EV::break;
});
my $t2 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;

# Test 5-7: role_list
$client->role_list(sub {
    my ($resp, $err) = @_;
    ok(!$err, 'role_list succeeded');
    ok(ref($resp->{roles}) eq 'ARRAY', 'role_list has roles array');

    my $found = grep { $_ eq $test_role } @{$resp->{roles} || []};
    ok($found, 'our test role is in the list');
    diag("Found " . scalar(@{$resp->{roles} || []}) . " roles");
    EV::break;
});
my $t3 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;

# Test 8-9: role_grant_permission
$client->role_grant_permission($test_role, 'READWRITE', '/test/', '/test0', sub {
    my ($resp, $err) = @_;
    ok(!$err, 'role_grant_permission succeeded');
    ok($resp->{header}, 'role_grant_permission response has header');
    diag("Granted READWRITE on /test/* to $test_role");
    EV::break;
});
my $t4 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;

# Test 10-11: role_get (verify permission was granted)
$client->role_get($test_role, sub {
    my ($resp, $err) = @_;
    ok(!$err, 'role_get succeeded');
    ok(ref($resp->{perm}) eq 'ARRAY', 'role_get has perm array');
    if ($resp->{perm} && @{$resp->{perm}}) {
        diag("Role has " . scalar(@{$resp->{perm}}) . " permission(s)");
        diag("  First perm: type=$resp->{perm}[0]{perm_type}, key=$resp->{perm}[0]{key}");



( run in 0.603 second using v1.01-cache-2.11-cpan-524268b4103 )