From 71c5d4b62826554c4b9d0227625e41b797677705 Mon Sep 17 00:00:00 2001 From: Kharec Date: Sun, 28 Dec 2025 17:24:58 +0100 Subject: [PATCH] test: add some testing for DB module --- t/02_db.t | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 t/02_db.t diff --git a/t/02_db.t b/t/02_db.t new file mode 100644 index 0000000..76cb8fc --- /dev/null +++ b/t/02_db.t @@ -0,0 +1,125 @@ +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();