Bug 5549 : Make Koha::Calendar testable

Add a testing option
Add a script with tests
Some simplifications of the logic
This commit is contained in:
Colin Campbell 2011-06-23 00:06:29 +01:00 committed by Chris Cormack
parent e8daace29f
commit 40b907bc0b
2 changed files with 85 additions and 12 deletions

View File

@ -13,14 +13,18 @@ use Readonly;
sub new {
my ( $classname, %options ) = @_;
my $self = {};
bless $self, $classname;
for my $o_name ( keys %options ) {
my $o = lc $o_name;
$self->{$o} = $options{$o_name};
}
if (exists $options{TEST_MODE}) {
$self->_mockinit();
return $self;
}
if ( !defined $self->{branchcode} ) {
croak 'No branchcode argument passed to Koha::Calendar->new';
}
bless $self, $classname;
$self->_init();
return $self;
}
@ -33,17 +37,15 @@ sub _init {
'SELECT * from repeatable_holidays WHERE branchcode = ? AND ISNULL(weekday) = ?'
);
$repeat_sth->execute( $branch, 0 );
$self->{weekly_closed_days} = [];
$self->{weekly_closed_days} = [0,0,0,0,0,0,0];
Readonly::Scalar my $sunday => 7;
while ( my $tuple = $repeat_sth->fetchrow_hashref ) {
my $day = $tuple->{weekday} == 0 ? $sunday : $tuple->{weekday};
push @{ $self->{weekly_closed_days} }, $day;
$self->{weekly_closed_days}->[$tuple->{weekday }] = 1;
}
$repeat_sth->execute( $branch, 1 );
$self->{day_month_closed_days} = [];
while ( my $tuple = $repeat_sth->fetchrow_hashref ) {
push @{ $self->{day_month_closed_days} },
{ day => $tuple->{day}, month => $tuple->{month}, };
$self->{day_month_closed_days}->{ $tuple->{day}}->{$tuple->{month} } = 1;
}
my $special = $dbh->prepare(
'SELECT day, month, year, title, description FROM special_holidays WHERE ( branchcode = ? ) AND (isexception = ?)'
@ -132,17 +134,17 @@ sub addDate {
sub is_holiday {
my ( $self, $dt ) = @_;
my $dow = $dt->day_of_week;
my @matches = grep { $_ == $dow } @{ $self->{weekly_closed_days} };
if (@matches) {
if ($dow == 7) {
$dow = 0;
}
if ($self->{weekly_closed_days}->[$dow] == 1) {
return 1;
}
$dt->truncate( to => 'days' );
my $day = $dt->day;
my $month = $dt->month;
for my $dm ( @{ $self->{day_month_closed_days} } ) {
if ( $month == $dm->{month} && $day == $dm->{day} ) {
return 1;
}
if ( $self->{day_month_closed_days}->{$month}->{$day} == 1 ) {
return 1;
}
if ( $self->{exception_holidays}->contains($dt) ) {
return 1;
@ -176,6 +178,27 @@ sub days_between {
}
sub _mockinit {
my $self = shift;
$self->{weekly_closed_days} = [1,0,0,0,0,0,0]; # Sunday only
$self->{day_month_closed_days} = {
6 => {
16 => 1,
}
};
my $dates = [];
$self->{exception_holidays} = DateTime::Set->from_datetimes( dates => $dates );
my $special = DateTime->new(
year => 2011,
month => 6,
day => 1,
time_zone => 'Europe/London',
);
push @{$dates}, $special;
$self->{single_holidays} = DateTime::Set->from_datetimes( dates => $dates );
return;
}
1;
__END__

50
t/Kalendar.t Executable file
View File

@ -0,0 +1,50 @@
use strict;
use warnings;
use 5.010;
use DateTime;
use DateTime::TimeZone;
use C4::Context;
use Test::More tests => 7; # last test to print
BEGIN { use_ok('Koha::Calendar'); }
my $cal = Koha::Calendar->new( TEST_MODE => 1);
isa_ok( $cal, 'Koha::Calendar', 'Calendar class returned');
my $sunday = DateTime->new(
year => 2011,
month => 6,
day => 26,
time_zone => 'Europe/London',
);
my $monday = DateTime->new(
year => 2011,
month => 6,
day => 27,
time_zone => 'Europe/London',
);
my $bloomsday = DateTime->new(
year => 2011,
month => 6,
day => 16,
time_zone => 'Europe/London',
); # should be a holiday
my $special = DateTime->new(
year => 2011,
month => 6,
day => 1,
time_zone => 'Europe/London',
); # should be a holiday
my $notspecial = DateTime->new(
year => 2011,
month => 6,
day => 2,
time_zone => 'Europe/London',
); # should NOT be a holiday
is ( $cal->is_holiday($sunday), 1, 'Sunday is a closed day');# wee free test;
is ( $cal->is_holiday($monday), 0, 'Monday is not a closed day');# alas
is ( $cal->is_holiday($bloomsday), 1, 'month/day closed day test');
is ( $cal->is_holiday($special), 1, 'special closed day test');
is ( $cal->is_holiday($notspecial), 0, 'open day test');