EV-Etcd

 view release on metacpan or  search on metacpan

t/callback_validation.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
BEGIN { delete @ENV{qw(http_proxy https_proxy grpc_proxy)} }
use Test::More;
use lib 'blib/lib', 'blib/arch';

# Invalid arguments croak at the call, not later from the event loop

BEGIN {
    eval { require EV };
    if ($@) {
        plan skip_all => 'EV module not available';
        exit;
    }
}

plan tests => 27;

use_ok('EV::Etcd');

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

ok($client, 'client created');

eval { $client->get('/test/key', 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'get rejects non-coderef callback');

eval { $client->put('/test/key', 'value', 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'put rejects non-coderef callback');

eval { $client->delete('/test/key', 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'delete rejects non-coderef callback');

eval { $client->watch('/test/key', 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'watch rejects non-coderef callback');

eval { $client->lease_grant(60, 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'lease_grant rejects non-coderef callback');

eval { $client->lease_revoke(12345, 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'lease_revoke rejects non-coderef callback');

eval { $client->lease_time_to_live(12345, 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'lease_time_to_live rejects non-coderef callback');

eval { $client->lease_leases('not_a_callback'); };
like($@, qr/callback must be a code reference/, 'lease_leases rejects non-coderef callback');

eval { $client->compact(1, 'not_a_callback'); };
like($@, qr/callback must be a code reference/, 'compact rejects non-coderef callback');

eval { $client->status('not_a_callback'); };
like($@, qr/callback must be a code reference/, 'status rejects non-coderef callback');

eval { $client->role_grant_permission('r', 'BOGUS', '/k', undef, sub {}); };
like($@, qr/Invalid permission type/, 'role_grant_permission rejects invalid perm_type');

eval { $client->alarm('GET', { alarm => 'BOGUS' }, sub {}); };
like($@, qr/Invalid alarm type/, 'alarm rejects invalid alarm type');

eval { $client->txn([{ key => '/k', value => 'v', result => 'BOGUS' }], [], [], sub {}); };
like($@, qr/invalid compare result/, 'txn rejects invalid compare result');

eval { $client->txn([{ key => '/k', value => 'v', target => 'BOGUS' }], [], [], sub {}); };
like($@, qr/invalid compare target/, 'txn rejects invalid compare target');

eval { $client->txn([{ key => '/k', value => 'v', target => 5 }], [], [], sub {}); };
like($@, qr/invalid compare target/, 'txn rejects numeric target');

eval { $client->txn([{ key => '/k', value => 'v', target => [] }], [], [], sub {}); };
like($@, qr/invalid compare target/, 'txn rejects ref target');

eval { $client->txn([{ key => '/k', value => 'v', result => 5 }], [], [], sub {}); };
like($@, qr/invalid compare result/, 'txn rejects numeric result');

eval { $client->txn([{ key => '/k', value => 'v', target => undef, result => undef }], [], [], sub {}); };
ok(!$@, 'txn undef target/result behave as absent') or diag($@);

eval { EV::Etcd->new(endpoints => ['127.0.0.1:2379'], bogus_opt => 1); };
like($@, qr/Unknown option/, 'new rejects unknown option');

eval { $client->get('/k', { sort_order => 'sideways' }, sub {}); };
like($@, qr/Invalid sort_order/, 'get rejects invalid sort_order');

eval { $client->get('/k', { sort_target => 'BOGUS' }, sub {}); };
like($@, qr/Invalid sort_target/, 'get rejects invalid sort_target');

eval { $client->txn([{ key => '/k', value => 'v', result => '=', target => 'value' }], [], [], sub {}); };
ok(!$@, 'valid txn compare does not croak') or diag($@);

eval { $client->get('/k', { sort_order => 'descend', sort_target => 'value' }, sub {}); };
ok(!$@, 'valid sort opts do not croak') or diag($@);

my (@undef_warns, $undef_client);
{
    local $SIG{__WARN__} = sub { push @undef_warns, @_ };
    $undef_client = EV::Etcd->new(timeout => undef, max_retries => undef);
}
ok($undef_client, 'client created with undef numerics');
ok(!@undef_warns, 'undef numerics do not warn') or diag(@undef_warns);

done_testing();



( run in 0.954 second using v1.01-cache-2.11-cpan-16aabcbfbcb )