App-TimeTracker
view release on metacpan or search on metacpan
t/Command/rt_73859_daychange.t view on Meta::CPAN
use 5.010;
use strict;
use warnings;
use lib qw(t);
use Test::MockTime qw(); # this needs to be loaded before DateTime
# http://www.nntp.perl.org/group/perl.datetime/2008/08/msg7043.html
use Test::Most;
use Test::Trap;
use Test::File;
use testlib::FakeHomeDir;
use App::TimeTracker::Proto;
use DateTime;
local $ENV{TZ} = 'UTC';
my $tmp = testlib::Fixtures::setup_tempdir;
my $home = $tmp->subdir('.TimeTracker');
my $prjdir = $tmp->subdir('rt73859');
$home->mkpath;
$prjdir->mkpath;
$home->file('projects.json')
->spew( iomode => '>:encoding(UTF-8)', '{"rt73859":"' . $prjdir . '"}' . "\n" );
$prjdir->file('.tracker.json')->spew( iomode => '>:encoding(UTF-8)', '{}' . "\n" );
my $p = App::TimeTracker::Proto->new( home => $home, project => 'rt73859' );
$p->load_config( $home, 'rt73859' );
my $tracker_dir = $home->subdir( '2012', '01' );
my $c = { project => 'rt73859' };
# test what was reported, but it works
diag("Test initial bug report");
{ # start
my $test_date =
DateTime->new( year => 2012, month => 1, day => 9, hour => 21, time_zone => 'local' );
Test::MockTime::set_fixed_time( $test_date->epoch );
@ARGV = ('start');
my $class = $p->setup_class($c);
my $t = $class->name->new(
home => $home,
config => $c,
_current_project => 'rt73859',
at => '23:30'
);
trap { $t->cmd_start };
is( $trap->stdout, "Started working on rt73859 at 23:30:00\n", 'start: output' );
file_not_empty_ok( $tracker_dir->file('20120109-233000_rt73859.trc'), 'tracker file exists' );
}
{ # stop
my $test_date = DateTime->new(
year => 2012,
month => 1,
day => 10,
hour => '00',
minute => 3,
time_zone => 'local'
);
Test::MockTime::set_fixed_time( $test_date->epoch );
@ARGV = ('stop');
my $class = $p->setup_class($c);
my $t = $class->name->new(
home => $home,
config => $c,
_current_project => 'rt73859',
at => '0:30'
);
trap { $t->cmd_stop };
is( $trap->stdout, "Worked 01:00:00 on rt73859\n", 'stop: output' );
my $task = App::TimeTracker::Data::Task->load(
$tracker_dir->file('20120109-233000_rt73859.trc')->stringify );
is( $task->seconds, 60 * 60, 'task: seconds' );
is( $task->duration, '01:00:00', 'task: duration' );
}
# ah, I assume there is a different bug:
# if you issue 'tracker stop --at 00:10' but it is 23:59, the stop-time will be set for the current day, i.e. way before the start time
# solution do not allow to set stop times that are before the start time.
diag("Test de facto bug");
{ # start
my $test_date = DateTime->new(
year => 2012,
month => 1,
day => 8,
hour => 23,
minute => 30,
time_zone => 'local'
);
Test::MockTime::set_fixed_time( $test_date->epoch );
@ARGV = ('start');
my $class = $p->setup_class($c);
my $t = $class->name->new( home => $home, config => $c, _current_project => 'rt73859' );
trap { $t->cmd_start };
is( $trap->stdout, "Started working on rt73859 at 23:30:00\n", 'start: output' );
file_not_empty_ok( $tracker_dir->file('20120108-233000_rt73859.trc'), 'tracker file exists' );
}
{ # stop
my $test_date = DateTime->new(
year => 2012,
month => 1,
day => 8,
hour => 23,
minute => 45,
time_zone => 'local'
);
Test::MockTime::set_fixed_time( $test_date->epoch );
@ARGV = ('stop');
my $class = $p->setup_class($c);
my $t = $class->name->new(
home => $home,
config => $c,
_current_project => 'rt73859',
at => '0:30'
);
trap { $t->cmd_stop };
like( $trap->stdout, qr/This makes no sense/, 'stop: aborted output' );
my $task = App::TimeTracker::Data::Task->load(
$tracker_dir->file('20120108-233000_rt73859.trc')->stringify );
is( $task->stop, undef, 'task: no stop time' );
file_not_empty_ok( $home->file('current'), '"current" file still exists' );
}
{ # stop again, with long --at
my $test_date = DateTime->new(
year => 2012,
month => 1,
day => 8,
hour => 23,
minute => 45,
time_zone => 'local'
);
Test::MockTime::set_fixed_time( $test_date->epoch );
@ARGV = ('stop');
my $class = $p->setup_class($c);
my $t = $class->name->new(
home => $home,
config => $c,
_current_project => 'rt73859',
at => '2012-01-09 00:30'
);
trap { $t->cmd_stop };
is( $trap->stdout, "Worked 01:00:00 on rt73859\n", 'stop: output' );
my $task = App::TimeTracker::Data::Task->load(
$tracker_dir->file('20120108-233000_rt73859.trc')->stringify );
is( $task->seconds, 60 * 60, 'task seconds' );
is( $task->duration, '01:00:00', 'task duration' );
file_not_exists_ok( $home->file('current'), '"current" file is gone now' );
}
done_testing();
( run in 1.930 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )