use DateTime::TimeZone;
use C4::Context;
-use Test::More tests => 54;
+
+use Test::More tests => 60;
+
use Test::MockModule;
+use Test::Warn;
use Time::HiRes qw/ gettimeofday /;
use t::lib::Mocks;
BEGIN { use_ok('Koha::DateUtils'); }
+t::lib::Mocks::mock_preference('dateformat', 'us');
+t::lib::Mocks::mock_preference('TimeFormat', 'This_is_not_used_but_called');
+
my $tz = C4::Context->tz;
isa_ok( $tz, 'DateTime::TimeZone', 'Context returns timezone object' );
my $date_string;
-my $module_context = new Test::MockModule('C4::Context');
-
-t::lib::Mocks::mock_preference('dateformat', 'us');
-
my $dateformat = C4::Context->preference('dateformat');
cmp_ok output_pref({ dt => $dt, dateformat => $dateformat }),
'eq',
cmp_ok( $new_dt->ymd(), 'eq', $testdate_iso,
'Returned Dublin object matches input' );
-for ( qw/ 2014-01-01 2100-01-01 9999-01-01 / ) {
- my $duration = gettimeofday();
- $new_dt = dt_from_string($_, 'iso', $dear_dirty_dublin);
- $duration = gettimeofday() - $duration;
- cmp_ok $duration, '<', 1, "Create DateTime with dt_from_string() for $_ with TZ in less than 1s";
- $duration = gettimeofday();
- output_pref( { dt => $new_dt } );
- $duration = gettimeofday() - $duration;
- cmp_ok $duration, '<', 1, "Create DateTime with output_pref() for $_ with TZ in less than 1s";
-}
+SKIP: {
+ skip "Don't test execution time of dt_from_string on slow servers", 6 if $ENV{SLOW_SERVER};
+ for ( qw/ 2014-01-01 2100-01-01 9999-01-01 / ) {
+ my $duration = gettimeofday();
+ $new_dt = dt_from_string($_, 'iso', $dear_dirty_dublin);
+ $duration = gettimeofday() - $duration;
+ cmp_ok $duration, '<', 1, "Create DateTime with dt_from_string() for $_ with TZ in less than 1s";
+ $duration = gettimeofday();
+ output_pref( { dt => $new_dt } );
+ $duration = gettimeofday() - $duration;
+ cmp_ok $duration, '<', 1, "Create DateTime with output_pref() for $_ with TZ in less than 1s";
+ }
+};
$new_dt = dt_from_string( '2011-06-16 12:00', 'sql' );
isa_ok( $new_dt, 'DateTime', 'Create DateTime from (mysql) sql' );
$new_dt = dt_from_string( $dt, 'iso' );
isa_ok( $new_dt, 'DateTime', 'Passed a DateTime dt_from_string returns it' );
-# C4::Dates allowed 00th of the month
-
my $ymd = '2012-01-01';
my $dt0 = dt_from_string( '00/01/2012', 'metric' );
isa_ok( $dt0, 'DateTime',
my $now = DateTime->now;
is( dt_from_string, $now, "Without parameter, dt_from_string should return today" );
+my $module_context = new Test::MockModule('C4::Context');
$module_context->mock(
'tz',
sub {
is( ref($dt), '', '31/01/2015 is not a correct date in us format' );
$dt = dt_from_string( '01/01/2015', 'us' );
is( ref($dt), 'DateTime', '01/01/2015 is a correct date in us format' );
+$dt = dt_from_string( '01.01.2015', 'dmydot' );
+is( ref($dt), 'DateTime', '01.01.2015 is a correct date in dmydot format' );
# default value for hh and mm is 00:00
# date before 1900
$dt = dt_from_string('01/01/1900');
is( output_pref( { dt => $dt, dateonly => 1 } ), '01/01/1900', 'dt_from_string should manage date < 1900' );
+
+# fallback
+$dt = dt_from_string('2015-01-31 01:02:03');
+is( output_pref( {dt => $dt} ), '31/01/2015 01:02', 'dt_from_string should fallback to sql format' );
+
+# output_pref with str parameter
+is( output_pref( { 'str' => $testdate_iso, dateformat => 'iso', dateonly => 1 } ), $testdate_iso, 'output_pref should handle correctly the iso parameter' );
+my $output_for_invalid_date;
+warning_like { $output_for_invalid_date = output_pref( { str => 'invalid_date' } ) }
+ { carped => qr[^Invalid date 'invalid_date' passed to output_pref] },
+ 'output_pref should carp if an invalid date is passed for the str parameter';
+is( $output_for_invalid_date, undef, 'output_pref should return undef if an invalid date is passed' );
+warning_is { output_pref( { 'str' => $testdate_iso, dt => $dt, dateformat => 'iso', dateonly => 1 } ) }
+ { carped => 'output_pref should not be called with both dt and str parameters' },
+ 'output_pref should carp if str and dt parameters are passed together';