Kubernetes-REST

 view release on metacpan or  search on metacpan

t/20_log.t  view on Meta::CPAN

#!/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 )