From 72013a9a08faf46f94df076bbebb788bf8aa0077 Mon Sep 17 00:00:00 2001 From: Kharec Date: Mon, 29 Dec 2025 16:11:31 +0100 Subject: [PATCH] test: add DNS cache coverage --- t/06_validation.t | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/t/06_validation.t b/t/06_validation.t index e3205cd..c400e96 100644 --- a/t/06_validation.t +++ b/t/06_validation.t @@ -2,6 +2,7 @@ use Test::More; use Test::MockObject; use Mojo::Promise; use Urupam::Validation; +use Socket qw(AF_INET); use_ok('Urupam::Validation'); @@ -80,6 +81,18 @@ sub with_ssrf_ua { return $code->(); } +sub with_subprocess_stub { + my ( $result, $code, $calls_ref ) = @_; + no warnings 'redefine'; + local *Mojo::IOLoop::subprocess = sub { + my ( $class, $work, $finish, $host ) = @_; + $$calls_ref++ if defined $calls_ref; + $finish->( undef, undef, $result ); + return; + }; + return $code->(); +} + subtest 'is_valid_url_length' => sub { ok( $validator->is_valid_url_length('http://example.com'), 'valid URL length passes' ); @@ -271,6 +284,38 @@ subtest 'is_blocked_url' => sub { ); }; +subtest '_resolve_host - caches results' => sub { + my $calls = 0; + my $result = { + error => 0, + results => [ { addr => '127.0.0.1', family => AF_INET } ], + }; + + with_subprocess_stub( + $result, + sub { + my ( $value, $error ) = + wait_promise( $validator->_resolve_host('example.com') ); + is( $error, undef, 'first resolve has no error' ); + is( scalar @$value, 1, 'first resolve returns one address' ); + }, + \$calls + ); + + with_subprocess_stub( + $result, + sub { + my ( $value, $error ) = + wait_promise( $validator->_resolve_host('example.com') ); + is( $error, undef, 'cached resolve has no error' ); + is( scalar @$value, 1, 'cached resolve returns one address' ); + }, + \$calls + ); + + is( $calls, 1, 'subprocess called once due to cache' ); +}; + subtest 'validate_short_code' => sub { my @valid = ( [ 'abc123456789', 'alphanumeric code passes' ],