forked from Koha-Community/Koha
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDateUtils.t
executable file
·217 lines (167 loc) · 8.9 KB
/
DateUtils.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
use Modern::Perl;
use DateTime;
use DateTime::TimeZone;
use C4::Context;
use Test::More tests => 55;
use Test::MockModule;
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 $testdate_iso = '2011-06-16'; # Bloomsday 2011
my $dt = dt_from_string( $testdate_iso, 'iso' );
isa_ok( $dt, 'DateTime', 'dt_from_string returns a DateTime object' );
cmp_ok( $dt->ymd(), 'eq', $testdate_iso, 'Returned object matches input' );
$dt->set_hour(12);
$dt->set_minute(0);
my $date_string;
my $dateformat = C4::Context->preference('dateformat');
cmp_ok output_pref({ dt => $dt, dateformat => $dateformat }),
'eq',
output_pref($dt),
'output_pref gives an hashref or a dt';
$date_string = output_pref({ dt => $dt, dateformat => 'iso', timeformat => '24hr' });
cmp_ok $date_string, 'eq', '2011-06-16 12:00', 'iso output';
$date_string = output_pref({ dt => $dt, dateformat => 'iso', timeformat => '12hr' });
cmp_ok $date_string, 'eq', '2011-06-16 12:00 PM', 'iso output 12hr';
# "notime" doesn't actually mean anything in this context, but we
# can't pass undef or output_pref will try to access the database
$date_string = output_pref({ dt => $dt, dateformat => 'iso', timeformat => 'notime', dateonly => 1 });
cmp_ok $date_string, 'eq', '2011-06-16', 'iso output (date only)';
$date_string = output_pref({ dt => $dt, dateformat => 'us', timeformat => '24hr' });
cmp_ok $date_string, 'eq', '06/16/2011 12:00', 'us output';
$date_string = output_pref({ dt => $dt, dateformat => 'us', timeformat => '12hr' });
cmp_ok $date_string, 'eq', '06/16/2011 12:00 PM', 'us output 12hr';
$date_string = output_pref({ dt => $dt, dateformat => 'us', timeformat => 'notime', dateonly => 1 });
cmp_ok $date_string, 'eq', '06/16/2011', 'us output (date only)';
# metric should return the French Revolutionary Calendar Really
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '24hr' });
cmp_ok $date_string, 'eq', '16/06/2011 12:00', 'metric output';
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => 'notime', dateonly => 1 });
cmp_ok $date_string, 'eq', '16/06/2011', 'metric output (date only)';
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '24hr' });
cmp_ok $date_string, 'eq', '16/06/2011 12:00',
'output_pref preserves non midnight HH:SS';
my $dear_dirty_dublin = DateTime::TimeZone->new( name => 'Europe/Dublin' );
my $new_dt = dt_from_string( '16/06/2011', 'metric', $dear_dirty_dublin );
isa_ok( $new_dt, 'DateTime', 'Create DateTime with different timezone' );
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";
}
$new_dt = dt_from_string( '2011-06-16 12:00', 'sql' );
isa_ok( $new_dt, 'DateTime', 'Create DateTime from (mysql) sql' );
cmp_ok( $new_dt->ymd(), 'eq', $testdate_iso, 'sql returns correct date' );
$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',
'dt_from_string returns a DateTime object passed a zero metric day' );
cmp_ok( $dt0->ymd(), 'eq', $ymd, 'Returned object corrects metric day 0' );
$dt0 = dt_from_string( '01/00/2012', 'us' );
isa_ok( $dt0, 'DateTime',
'dt_from_string returns a DateTime object passed a zero us day' );
cmp_ok( $dt0->ymd(), 'eq', $ymd, 'Returned object corrects us day 0' );
$dt0 = dt_from_string( '2012-01-00', 'iso' );
isa_ok( $dt0, 'DateTime',
'dt_from_string returns a DateTime object passed a zero iso day' );
cmp_ok( $dt0->ymd(), 'eq', $ymd, 'Returned object corrects iso day 0' );
# Return undef if passed mysql 0 dates
$dt0 = dt_from_string( '0000-00-00', 'iso' );
is( $dt0, undef, "undefined returned for 0 iso date" );
# Return undef if passed mysql 9999-* date
my $dt9999 = dt_from_string( '9999-12-31', 'sql' );
is( $dt9999->ymd(), '9999-12-31', "dt_from_string should return a DateTime object for 9999-12-31" );
my $formatted = format_sqldatetime( '2011-06-16 12:00:07', 'metric', '24hr' );
cmp_ok( $formatted, 'eq', '16/06/2011 12:00', 'format_sqldatetime conversion' );
$formatted = format_sqldatetime( undef, 'metric' );
cmp_ok( $formatted, 'eq', q{},
'format_sqldatetime formats undef as empty string' );
# Test the as_due_date parameter
$dt = DateTime->new(
year => 2013,
month => 12,
day => 11,
hour => 23,
minute => 59,
);
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '24hr', as_due_date => 1 });
cmp_ok $date_string, 'eq', '11/12/2013', 'as_due_date with hours and timeformat 24hr';
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '24hr', dateonly => 1, as_due_date => 1});
cmp_ok $date_string, 'eq', '11/12/2013', 'as_due_date without hours and timeformat 24hr';
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '12hr', as_due_date => 1 });
cmp_ok $date_string, 'eq', '11/12/2013', 'as_due_date with hours and timeformat 12hr';
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '12hr', dateonly => 1, as_due_date => 1});
cmp_ok $date_string, 'eq', '11/12/2013', 'as_due_date without hours and timeformat 12hr';
# Test as_due_date for hourly loans
$dt = DateTime->new(
year => 2013,
month => 12,
day => 11,
hour => 18,
minute => 35,
);
$date_string = output_pref({ dt => $dt, dateformat => 'metric', timeformat => '24hr', as_due_date => 1 });
cmp_ok $date_string, 'eq', '11/12/2013 18:35', 'as_due_date with hours and timeformat 24hr (non-midnight time)';
$date_string = output_pref({ dt => $dt, dateformat => 'us', timeformat => '12hr', as_due_date => 1 });
cmp_ok $date_string, 'eq', '12/11/2013 06:35 PM', 'as_due_date with hours and timeformat 12hr (non-midnight time)';
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 {
return DateTime::TimeZone->new( name => 'Europe/Lisbon' );
}
);
$dt = dt_from_string('1979-04-01');
isa_ok( $dt, 'DateTime', 'dt_from_string should return a DateTime object if a DST is given' );
$module_context->mock(
'tz',
sub {
return DateTime::TimeZone->new( name => 'Europe/Paris' );
}
);
$dt = dt_from_string('2014-03-30 02:00:00');
isa_ok( $dt, 'DateTime', 'dt_from_string should return a DateTime object if a DST is given' );
# Test dt_from_string
t::lib::Mocks::mock_preference('dateformat', 'metric');
t::lib::Mocks::mock_preference('TimeFormat', '24hr');
# dt_from_string should take into account the dateformat pref, or the given parameter
$dt = dt_from_string('31/01/2015');
is( ref($dt), 'DateTime', '31/01/2015 is a correct date in metric format' );
is( output_pref( { dt => $dt, dateonly => 1 } ), '31/01/2015' );
$dt = eval { dt_from_string( '31/01/2015', 'iso' ); };
is( ref($dt), '', '31/01/2015 is not a correct date in iso format' );
$dt = eval { dt_from_string( '01/01/2015', 'iso' ); };
is( ref($dt), '', '01/01/2015 is not a correct date in iso format' );
$dt = eval { dt_from_string( '31/01/2015', 'us' ); };
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' );
# default value for hh and mm is 00:00
$dt = dt_from_string('31/01/2015');
is( output_pref( { dt => $dt } ), '31/01/2015 00:00', 'dt_from_string should generate a DT object with 00:00 as default hh:mm' );
$dt = dt_from_string('31/01/2015 12:34');
is( output_pref( { dt => $dt } ), '31/01/2015 12:34', 'dt_from_string should match hh:mm' );
$dt = dt_from_string('31/01/2015 12:34:56');
is( output_pref( { dt => $dt } ), '31/01/2015 12:34', 'dt_from_string should match hh:mm:ss' );
# 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' );