App-karr
view release on metacpan or search on metacpan
t/32-show.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use lib 't/lib';
use TestGit qw( require_git_c );
require_git_c();
use File::Temp qw( tempdir );
use YAML::XS qw( Dump );
use App::karr::Git;
use App::karr::BoardStore;
use App::karr::Task;
use App::karr::Cmd::Show;
sub _init_repo {
my $repo = tempdir( CLEANUP => 1 );
system( 'git', 'init', '-q', $repo );
system( 'git', '-C', $repo, 'config', 'user.email', 'test@example.com' );
system( 'git', '-C', $repo, 'config', 'user.name', 'Test User' );
return $repo;
}
my $repo = _init_repo();
my $git = App::karr::Git->new( dir => $repo );
$git->write_ref( 'refs/karr/config', Dump( { version => 1, board => { name => 'T' } } ) );
$git->write_ref( 'refs/karr/meta/next-id', "9\n" );
my $store = App::karr::BoardStore->new( git => $git );
# Three tasks, deterministic 'updated' so recency ordering is stable.
my %updated = (
1 => '2026-01-01T00:00:00Z',
2 => '2026-03-01T00:00:00Z',
3 => '2026-02-01T00:00:00Z',
);
for my $id ( 1, 2, 3 ) {
my $t = App::karr::Task->new(
id => $id,
title => "Task $id",
status => 'backlog',
priority => 'medium',
class => 'standard',
);
$t->updated( $updated{$id} );
$t->claimed_by('fox-owl') if $id == 3;
$store->save_task($t);
}
my $ids = sub { map { $_->id } @_ };
subtest 'explicit id wins over selectors' => sub {
my $cmd = App::karr::Cmd::Show->new( store => $store, me => 1, last => 5 );
my @t = $cmd->_select_tasks(1);
is_deeply [ $ids->(@t) ], [1], 'returns exactly the requested task';
};
subtest 'no id, default last=1 -> most recently updated' => sub {
my $cmd = App::karr::Cmd::Show->new( store => $store );
my @t = $cmd->_select_tasks(undef);
is_deeply [ $ids->(@t) ], [2], 'task 2 is newest by updated';
};
subtest '--last 2 -> two newest, descending' => sub {
my $cmd = App::karr::Cmd::Show->new( store => $store, last => 2 );
my @t = $cmd->_select_tasks(undef);
is_deeply [ $ids->(@t) ], [ 2, 3 ], 'two newest in updated-desc order';
};
subtest '--agent filters by claimed_by' => sub {
my $cmd = App::karr::Cmd::Show->new( store => $store, agent => 'fox-owl', last => 5 );
my @t = $cmd->_select_tasks(undef);
is_deeply [ $ids->(@t) ], [3], 'only the task claimed by fox-owl';
};
subtest '--me resolves via the activity log identity' => sub {
# Two entries for this identity; task 1 is the most recent action.
my $ref = 'refs/karr/log/user/test_example.com';
my $l1 = '{"ts":"2026-01-01T00:00:00Z","agent":"fox-owl","action":"pick","task_id":3}';
my $l2 = '{"ts":"2026-04-01T00:00:00Z","agent":"fox-owl","action":"move","task_id":1}';
$git->write_ref( $ref, "$l1\n$l2" );
my $cmd = App::karr::Cmd::Show->new( store => $store, me => 1 );
my @t = $cmd->_select_tasks(undef);
is_deeply [ $ids->(@t) ], [1], '--me default last=1 -> last task acted on';
my $cmd2 = App::karr::Cmd::Show->new( store => $store, me => 1, last => 5 );
my @t2 = $cmd2->_select_tasks(undef);
is_deeply [ $ids->(@t2) ], [ 1, 3 ], '--me dedupes and orders newest first';
};
done_testing;
( run in 0.383 second using v1.01-cache-2.11-cpan-bbe5e583499 )