Kubernetes-REST
view release on metacpan or search on metacpan
#!/usr/bin/env perl
# Tests for the Kubernetes Pod Log API using mock data.
#
# Run:
# prove -l t/20_log.t
use strict;
use warnings;
use Test::More;
use Test::Exception;
use FindBin;
use lib "$FindBin::Bin/lib";
use lib "$FindBin::Bin/../lib";
use Test::Kubernetes::Mock qw(mock_api);
use Kubernetes::REST;
use Kubernetes::REST::Server;
use Kubernetes::REST::AuthToken;
use Kubernetes::REST::LogEvent;
my $mock_io = Test::Kubernetes::Mock::IO->new;
my $api = Kubernetes::REST->new(
server => Kubernetes::REST::Server->new(endpoint => 'http://mock.local'),
credentials => Kubernetes::REST::AuthToken->new(token => 'MockToken'),
resource_map_from_cluster => 0,
io => $mock_io,
);
# === Test 1: One-shot log retrieval ===
subtest 'one-shot log' => sub {
$mock_io->add_log_lines('/api/v1/namespaces/default/pods/nginx-abc/log', [
'2024-01-01T00:00:00Z Starting nginx',
'2024-01-01T00:00:01Z Listening on port 80',
'2024-01-01T00:00:02Z Ready to accept connections',
]);
my $text = $api->log('Pod', 'nginx-abc', namespace => 'default');
like($text, qr/Starting nginx/, 'log contains first line');
like($text, qr/Listening on port 80/, 'log contains second line');
like($text, qr/Ready to accept connections/, 'log contains third line');
};
# === Test 2: Streaming log with on_line callback ===
subtest 'streaming log' => sub {
$mock_io->add_log_lines('/api/v1/namespaces/default/pods/nginx-abc/log', [
'line 1: hello',
'line 2: world',
'line 3: done',
]);
my @events;
$api->log('Pod', 'nginx-abc',
namespace => 'default',
follow => 1,
on_line => sub { push @events, $_[0] },
);
is(scalar @events, 3, 'received 3 log events');
isa_ok($events[0], 'Kubernetes::REST::LogEvent', 'event is LogEvent');
is($events[0]->line, 'line 1: hello', 'first line');
is($events[1]->line, 'line 2: world', 'second line');
is($events[2]->line, 'line 3: done', 'third line');
};
# === Test 3: LogEvent class ===
subtest 'LogEvent class' => sub {
my $event = Kubernetes::REST::LogEvent->new(line => 'test log line');
ok($event, 'LogEvent created');
is($event->line, 'test log line', 'line accessor');
};
# === Test 4: log requires name ===
subtest 'log requires name' => sub {
throws_ok {
$api->log('Pod', namespace => 'default');
} qr/name required/, 'dies without name';
};
# === Test 5: log with name as key-value ===
subtest 'log with name as key-value' => sub {
$mock_io->add_log_lines('/api/v1/namespaces/default/pods/my-pod/log', [
( run in 0.835 second using v1.01-cache-2.11-cpan-524268b4103 )