126 lines
3.3 KiB
Perl
126 lines
3.3 KiB
Perl
use Test::More;
|
|
use Test::MockObject;
|
|
use Mojo::Promise;
|
|
use Urupam::DB;
|
|
|
|
use_ok('Urupam::DB');
|
|
|
|
sub wait_promise {
|
|
my ($promise) = @_;
|
|
my ( $value, $error );
|
|
$promise->then( sub { $value = shift } )
|
|
->catch( sub { $error = shift } )
|
|
->wait;
|
|
return ( $value, $error );
|
|
}
|
|
|
|
sub mock_redis_method {
|
|
my ( $method, $err, $result ) = @_;
|
|
my $mock_redis = Test::MockObject->new;
|
|
$mock_redis->mock(
|
|
$method,
|
|
sub {
|
|
my ( $self, @args ) = @_;
|
|
my $cb = pop @args;
|
|
$cb->( $self, $err, $result );
|
|
}
|
|
);
|
|
return $mock_redis;
|
|
}
|
|
|
|
sub test_method {
|
|
my ( $name, $method, $args, $success_cases, $error_cases ) = @_;
|
|
my $db = Urupam::DB->new;
|
|
|
|
for my $case (@$success_cases) {
|
|
my ( $expected, $err, $result, $desc ) = @$case;
|
|
my $mock_redis = mock_redis_method( $method, $err, $result );
|
|
$db->redis($mock_redis);
|
|
my ( $value, $error ) = wait_promise( $db->$method(@$args) );
|
|
is( $value, $expected, "$name success: $desc" );
|
|
is( $error, undef, "$name success: no error" );
|
|
}
|
|
|
|
for my $case (@$error_cases) {
|
|
my ( $err, $desc ) = @$case;
|
|
my $mock_redis = mock_redis_method( $method, $err, undef );
|
|
$db->redis($mock_redis);
|
|
my ( $value, $error ) = wait_promise( $db->$method(@$args) );
|
|
is( $value, undef, "$name error: $desc" );
|
|
is( $error, $err, "$name error: error returned" );
|
|
}
|
|
}
|
|
|
|
subtest 'get' => sub {
|
|
test_method(
|
|
'get',
|
|
'get',
|
|
['test_key'],
|
|
[ [ 'test_value', undef, 'test_value', 'returns correct value' ] ],
|
|
[ [ 'Connection error', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'set' => sub {
|
|
test_method(
|
|
'set',
|
|
'set',
|
|
[ 'test_key', 'test_value' ],
|
|
[ [ 'OK', undef, 'OK', 'returns success result' ] ],
|
|
[ [ 'Write error', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'incr' => sub {
|
|
test_method(
|
|
'incr', 'incr', ['test_key'],
|
|
[ [ 42, undef, 42, 'returns correct value' ] ],
|
|
[ [ 'Increment error', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'exists' => sub {
|
|
test_method(
|
|
'exists', 'exists',
|
|
['test_key'],
|
|
[
|
|
[ 1, undef, 1, 'returns 1 when key exists' ],
|
|
[ 0, undef, 0, 'returns 0 when key does not exist' ],
|
|
],
|
|
[ [ 'Exists error', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'setnx' => sub {
|
|
test_method(
|
|
'setnx', 'setnx',
|
|
[ 'test_key', 'test_value' ],
|
|
[
|
|
[ 1, undef, 1, 'returns 1 when key is set' ],
|
|
[ 0, undef, 0, 'returns 0 when key already exists' ],
|
|
],
|
|
[ [ 'Setnx error', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'ping' => sub {
|
|
test_method(
|
|
'ping', 'ping', [],
|
|
[ [ 'PONG', undef, 'PONG', 'returns PONG' ] ],
|
|
[ [ 'Connection lost', 'error is returned' ] ]
|
|
);
|
|
};
|
|
|
|
subtest 'redis attribute' => sub {
|
|
my $new_db = Urupam::DB->new;
|
|
ok( $new_db->redis, 'redis attribute is initialized' );
|
|
isa_ok( $new_db->redis, 'Mojo::Redis2',
|
|
'redis is a Mojo::Redis2 instance' );
|
|
|
|
my $custom_redis = Test::MockObject->new;
|
|
my $custom_db = Urupam::DB->new( redis => $custom_redis );
|
|
is( $custom_db->redis, $custom_redis, 'custom redis instance is set' );
|
|
};
|
|
|
|
done_testing();
|