fix A/R report
[freeside.git] / rt / t / api / date.t
index 6fcaa49..dd22943 100644 (file)
@@ -1,10 +1,10 @@
-#!/usr/bin/perl
 
 use Test::MockTime qw(set_fixed_time restore_time);
 use DateTime;
 
-use warnings; use strict;
-use RT::Test tests => 173;
+use warnings;
+use strict;
+use RT::Test tests => undef;
 use RT::User;
 use Test::Warn;
 
@@ -57,7 +57,7 @@ my $current_user;
     is($date->Timezone('user'),
        'Europe/Moscow',
        "in user context still returns user's timezone");
-    
+
     $current_user->UserObj->__Set( Field => 'Timezone', Value => '');
     is_empty($current_user->UserObj->Timezone,
        "successfuly changed user's timezone");
@@ -83,6 +83,7 @@ my $current_user;
 
 {
     my $date = RT::Date->new(RT->SystemUser);
+    is($date->IsSet,0, "new date isn't set");
     is($date->Unix, 0, "new date returns 0 in Unix format");
     is($date->Get, '1970-01-01 00:00:00', "default is ISO format");
     warning_like {
@@ -94,7 +95,7 @@ my $current_user;
        '1970-01-01T00:00:00Z',
        "W3CDTF format with defaults");
     is($date->Get(Format =>'RFC2822'),
-       'Thu, 1 Jan 1970 00:00:00 +0000',
+       'Thu, 01 Jan 1970 00:00:00 +0000',
        "RFC2822 format with defaults");
     is($date->Get(Format =>'LocalizedDateTime'),
        'Thu, Jan 1, 1970 12:00:00 AM',
@@ -107,7 +108,7 @@ my $current_user;
        '1970-01-01',
        "W3CDTF format without time part");
     is($date->RFC2822(Time => 0),
-       'Thu, 1 Jan 1970',
+       'Thu, 01 Jan 1970',
        "RFC2822 format without time part");
     is($date->LocalizedDateTime(Time => 0),
        'Thu, Jan 1, 1970',
@@ -137,7 +138,7 @@ my $current_user;
        "RFC2822 format without date part and seconds");
 
     is($date->RFC2822(DayOfWeek => 0),
-       '1 Jan 1970 00:00:00 +0000',
+       '01 Jan 1970 00:00:00 +0000',
        "RFC2822 format without 'day of week' part");
     is($date->RFC2822(DayOfWeek => 0, Date => 0),
        '00:00:00 +0000',
@@ -163,7 +164,7 @@ my $current_user;
        '1970-01-01',
        "'Date' method, W3CDTF format");
     is($date->Date(Format => 'RFC2822'),
-       'Thu, 1 Jan 1970',
+       'Thu, 01 Jan 1970',
        "'Date' method, RFC2822 format");
     is($date->Date(Time => 1),
        '1970-01-01',
@@ -195,7 +196,7 @@ my $current_user;
        '1970-01-01T00:00:00Z',
        "'DateTime' method, W3CDTF format");
     is($date->DateTime(Format =>'RFC2822'),
-       'Thu, 1 Jan 1970 00:00:00 +0000',
+       'Thu, 01 Jan 1970 00:00:00 +0000',
        "'DateTime' method, RFC2822 format");
     is($date->DateTime(Date => 0, Time => 0),
        '1970-01-01 00:00:00',
@@ -207,16 +208,17 @@ my $current_user;
     $current_user->UserObj->__Set( Field => 'Timezone', Value => 'Europe/Moscow');
     my $date = RT::Date->new( $current_user );
     $date->Set( Format => 'ISO', Timezone => 'utc', Value => '2005-01-01 15:10:00' );
+    is($date->IsSet,1,"Date has been set");
     is($date->ISO( Timezone => 'user' ), '2005-01-01 18:10:00', "ISO");
     is($date->W3CDTF( Timezone => 'user' ), '2005-01-01T18:10:00+03:00', "W3C DTF");
-    is($date->RFC2822( Timezone => 'user' ), 'Sat, 1 Jan 2005 18:10:00 +0300', "RFC2822");
+    is($date->RFC2822( Timezone => 'user' ), 'Sat, 01 Jan 2005 18:10:00 +0300', "RFC2822");
 
     # DST
     $date = RT::Date->new( $current_user );
     $date->Set( Format => 'ISO', Timezone => 'utc', Value => '2005-07-01 15:10:00' );
     is($date->ISO( Timezone => 'user' ), '2005-07-01 19:10:00', "ISO");
     is($date->W3CDTF( Timezone => 'user' ), '2005-07-01T19:10:00+04:00', "W3C DTF");
-    is($date->RFC2822( Timezone => 'user' ), 'Fri, 1 Jul 2005 19:10:00 +0400', "RFC2822");
+    is($date->RFC2822( Timezone => 'user' ), 'Fri, 01 Jul 2005 19:10:00 +0400', "RFC2822");
 }
 
 { # negative timezone
@@ -225,21 +227,21 @@ my $current_user;
     $date->Set( Format => 'ISO', Timezone => 'utc', Value => '2005-01-01 15:10:00' );
     is($date->ISO( Timezone => 'user' ), '2005-01-01 10:10:00', "ISO");
     is($date->W3CDTF( Timezone => 'user' ), '2005-01-01T10:10:00-05:00', "W3C DTF");
-    is($date->RFC2822( Timezone => 'user' ), 'Sat, 1 Jan 2005 10:10:00 -0500', "RFC2822");
+    is($date->RFC2822( Timezone => 'user' ), 'Sat, 01 Jan 2005 10:10:00 -0500', "RFC2822");
 
     # DST
     $date = RT::Date->new( $current_user );
     $date->Set( Format => 'ISO', Timezone => 'utc', Value => '2005-07-01 15:10:00' );
     is($date->ISO( Timezone => 'user' ), '2005-07-01 11:10:00', "ISO");
     is($date->W3CDTF( Timezone => 'user' ), '2005-07-01T11:10:00-04:00', "W3C DTF");
-    is($date->RFC2822( Timezone => 'user' ), 'Fri, 1 Jul 2005 11:10:00 -0400', "RFC2822");
+    is($date->RFC2822( Timezone => 'user' ), 'Fri, 01 Jul 2005 11:10:00 -0400', "RFC2822");
 }
 
 warning_like
 { # bad format
     my $date = RT::Date->new(RT->SystemUser);
     $date->Set( Format => 'bad' );
-    is($date->Unix, 0, "bad format");
+    ok(!$date->IsSet, "bad format");
 } qr{Unknown Date format: bad};
 
 
@@ -248,13 +250,26 @@ warning_like
     $date->Unix(1);
     is($date->ISO, '1970-01-01 00:00:01', "correct value");
 
-    foreach (undef, 0, ''){
+    foreach (undef, 0, '', -5){
         $date->Unix(1);
         is($date->ISO, '1970-01-01 00:00:01', "correct value");
+        is($date->IsSet,1,"Date has been set to a value");
 
         $date->Set(Format => 'unix', Value => $_);
         is($date->ISO, '1970-01-01 00:00:00', "Set a date to midnight 1/1/1970 GMT due to wrong call");
         is($date->Unix, 0, "unix is 0 => unset");
+        is($date->IsSet,0,"Date has been unset");
+    }
+
+    foreach (undef, 0, '', -5){
+        $date->Unix(1);
+        is($date->ISO, '1970-01-01 00:00:01', "correct value");
+        is($date->IsSet,1,"Date has been set to a value");
+
+        $date->Unix($_);
+        is($date->ISO, '1970-01-01 00:00:00', "Set a date to midnight 1/1/1970 GMT due to wrong call");
+        is($date->Unix, 0, "unix is 0 => unset");
+        is($date->IsSet,0,"Date has been unset");
     }
 }
 
@@ -265,7 +280,7 @@ my $year = (localtime(time))[5] + 1900;
     warning_like {
         $date->Set(Format => 'ISO', Value => 'weird date');
     } qr/Couldn't parse date 'weird date' as a ISO format/;
-    is($date->Unix, 0, "date was wrong => unix == 0");
+    ok(!$date->IsSet, "date was wrong => unix == 0");
 
     # XXX: ISO format has more feature than we suport
     # http://www.cl.cam.ac.uk/~mgk25/iso-time.html
@@ -294,20 +309,22 @@ my $year = (localtime(time))[5] + 1900;
     $date->Set(Format => 'ISO', Value => '112815:10:00');
     is($date->ISO, $year .'-11-28 15:10:00', "DDMMhh:mm:ss");
 
-    $date->Set(Format => 'ISO', Value => '2005-13-28 15:10:00');
-    is($date->Unix, 0, "wrong month value");
+    warning_like {
+        $date->Set(Format => 'ISO', Value => '2005-13-28 15:10:00');
+    } qr/Invalid date/;
+    ok(!$date->IsSet, "wrong month value");
 
-    $date->Set(Format => 'ISO', Value => '2005-00-28 15:10:00');
-    is($date->Unix, 0, "wrong month value");
+    warning_like {
+        $date->Set(Format => 'ISO', Value => '2005-00-28 15:10:00');
+    } qr/Invalid date/;
+    ok(!$date->IsSet, "wrong month value");
 
     $date->Set(Format => 'ISO', Value => '1960-01-28 15:10:00');
-    is($date->Unix, 0, "too old, we don't support");
+    ok(!$date->IsSet, "too old, we don't support");
 }
 
 { # set+datemanip format(Time::ParseDate)
     my $date = RT::Date->new(RT->SystemUser);
-    $date->Set(Format => 'unknown', Value => 'weird date');
-    is($date->Unix, 0, "date was wrong");
 
     RT->Config->Set( Timezone => 'Europe/Moscow' );
     $date->Set(Format => 'datemanip', Value => '2005-11-28 15:10:00');
@@ -325,8 +342,10 @@ my $year = (localtime(time))[5] + 1900;
 
 { # set+unknown format(Time::ParseDate)
     my $date = RT::Date->new(RT->SystemUser);
-    $date->Set(Format => 'unknown', Value => 'weird date');
-    is($date->Unix, 0, "date was wrong");
+    warnings_like {
+        $date->Set(Format => 'unknown', Value => 'weird date');
+    } qr{Couldn't parse date 'weird date' by Time::ParseDate};
+    ok(!$date->IsSet, "date was wrong");
 
     RT->Config->Set( Timezone => 'Europe/Moscow' );
     $date->Set(Format => 'unknown', Value => '2005-11-28 15:10:00');
@@ -360,6 +379,34 @@ my $year = (localtime(time))[5] + 1900;
     is($date->ISO, '2005-11-28 15:10:00', "YYYY-DD-MM hh:mm:ss");
 }
 
+{ # 'tomorrow 10am' with TZ
+    $current_user->UserObj->__Set( Field => 'Timezone', Value => 'Europe/Moscow');
+
+    set_fixed_time("2012-06-14T15:10:00Z"); # 14th in UTC and Moscow
+    my $date = RT::Date->new( $current_user );
+    $date->Set(Format => 'unknown', Value => 'tomorrow 10am');
+    is($date->ISO, '2012-06-15 06:00:00', "YYYY-DD-MM hh:mm:ss");
+
+    set_fixed_time("2012-06-13T23:10:00Z"); # 13th in UTC and 14th in Moscow
+    $date = RT::Date->new( $current_user );
+    $date->Set(Format => 'unknown', Value => 'tomorrow 10am');
+    is($date->ISO, '2012-06-15 06:00:00', "YYYY-DD-MM hh:mm:ss");
+
+    $current_user->UserObj->__Set( Field => 'Timezone', Value => 'US/Hawaii');
+
+    set_fixed_time("2012-06-14T20:10:00Z"); # 14th in UTC and Hawaii
+    $date = RT::Date->new( $current_user );
+    $date->Set(Format => 'unknown', Value => 'tomorrow 10am');
+    is($date->ISO, '2012-06-15 20:00:00', "YYYY-DD-MM hh:mm:ss");
+
+    set_fixed_time("2012-06-15T05:10:00Z"); # 15th in UTC and 14th in Hawaii
+    $date = RT::Date->new( $current_user );
+    $date->Set(Format => 'unknown', Value => 'tomorrow 10am');
+    is($date->ISO, '2012-06-15 20:00:00', "YYYY-DD-MM hh:mm:ss");
+
+    restore_time();
+}
+
 { # SetToMidnight
     my $date = RT::Date->new(RT->SystemUser);
 
@@ -440,6 +487,14 @@ my $year = (localtime(time))[5] + 1900;
     $date->Unix(0);
     $date->AddDays(31);
     is($date->ISO, '1970-02-01 00:00:00', "added one month");
+
+    $date->Unix(0);
+    $date->AddDays(0);
+    is($date->ISO, '1970-01-01 00:00:00', "added no days");
+
+    $date->Unix(0);
+    $date->AddDays();
+    is($date->ISO, '1970-01-02 00:00:00', "added one day with no argument");
 }
 
 {
@@ -456,22 +511,22 @@ my $year = (localtime(time))[5] + 1900;
 
     RT->Config->Set( DateTimeFormat => 'RFC2822' );
     $date->Unix(1);
-    is($date->AsString, 'Thu, 1 Jan 1970 00:00:01 +0000', "correct string");
+    is($date->AsString, 'Thu, 01 Jan 1970 00:00:01 +0000', "correct string");
 
     RT->Config->Set( DateTimeFormat => { Format => 'RFC2822', Seconds => 0 } );
     $date->Unix(1);
-    is($date->AsString, 'Thu, 1 Jan 1970 00:00 +0000', "correct string");
-    is($date->AsString(Seconds => 1), 'Thu, 1 Jan 1970 00:00:01 +0000', "correct string");
+    is($date->AsString, 'Thu, 01 Jan 1970 00:00 +0000', "correct string");
+    is($date->AsString(Seconds => 1), 'Thu, 01 Jan 1970 00:00:01 +0000', "correct string");
 }
 
 { # DurationAsString
     my $date = RT::Date->new(RT->SystemUser);
 
-    is($date->DurationAsString(1), '1 sec', '1 sec');
-    is($date->DurationAsString(59), '59 sec', '59 sec');
-    is($date->DurationAsString(60), '1 min', '1 min');
-    is($date->DurationAsString(60*119), '119 min', '119 min');
-    is($date->DurationAsString(60*60*2-1), '120 min', '120 min');
+    is($date->DurationAsString(1), '1 second', '1 sec');
+    is($date->DurationAsString(59), '59 seconds', '59 sec');
+    is($date->DurationAsString(60), '1 minute', '1 min');
+    is($date->DurationAsString(60*119), '119 minutes', '119 min');
+    is($date->DurationAsString(60*60*2-1), '120 minutes', '120 min');
     is($date->DurationAsString(60*60*2), '2 hours', '2 hours');
     is($date->DurationAsString(60*60*48-1), '48 hours', '48 hours');
     is($date->DurationAsString(60*60*48), '2 days', '2 days');
@@ -480,9 +535,9 @@ my $year = (localtime(time))[5] + 1900;
     is($date->DurationAsString(60*60*24*7*8-1), '8 weeks', '8 weeks');
     is($date->DurationAsString(60*60*24*61), '2 months', '2 months');
     is($date->DurationAsString(60*60*24*365-1), '12 months', '12 months');
-    is($date->DurationAsString(60*60*24*366), '1 years', '1 years');
+    is($date->DurationAsString(60*60*24*366), '1 year', '1 year');
 
-    is($date->DurationAsString(-1), '1 sec ago', '1 sec ago');
+    is($date->DurationAsString(-1), '1 second ago', '1 sec ago');
 }
 
 { # DiffAsString
@@ -494,13 +549,13 @@ my $year = (localtime(time))[5] + 1900;
     $date->Unix(2);
     is($date->DiffAsString(-1), '', 'no diff, wrong input');
 
-    is($date->DiffAsString(3), '1 sec ago', 'diff: 1 sec ago');
-    is($date->DiffAsString(1), '1 sec', 'diff: 1 sec');
+    is($date->DiffAsString(3), '1 second ago', 'diff: 1 sec ago');
+    is($date->DiffAsString(1), '1 second', 'diff: 1 sec');
 
     my $ndate = RT::Date->new(RT->SystemUser);
     is($date->DiffAsString($ndate), '', 'no diff, wrong input');
     $ndate->Unix(3);
-    is($date->DiffAsString($ndate), '1 sec ago', 'diff: 1 sec ago');
+    is($date->DiffAsString($ndate), '1 second ago', 'diff: 1 sec ago');
 }
 
 { # Diff
@@ -515,7 +570,7 @@ my $year = (localtime(time))[5] + 1900;
     my $date = RT::Date->new(RT->SystemUser);
     $date->SetToNow;
     my $diff = $date->AgeAsString;
-    like($diff, qr/^(0 sec|[1-5] sec ago)$/, 'close enought');
+    like($diff, qr/^(0 seconds|(1 second|[2-5] seconds) ago)$/, 'close enought');
 }
 
 { # GetWeekday
@@ -542,15 +597,16 @@ my $year = (localtime(time))[5] + 1900;
     # set unknown format: edge cases
     my $date = RT::Date->new(RT->SystemUser);
     $date->Set( Value => 0, Format => 'unknown' );
-    is( $date->Unix(), 0, "unix is 0 with Value => 0, Format => 'unknown'" );
+    ok( !$date->IsSet, "unix is 0 with Value => 0, Format => 'unknown'" );
 
     $date->Set( Value => '', Format => 'unknown' );
-    is( $date->Unix(), 0, "unix is 0 with Value => '', Format => 'unknown'" );
+    ok( !$date->IsSet, "unix is 0 with Value => '', Format => 'unknown'" );
 
     $date->Set( Value => ' ', Format => 'unknown' );
-    is( $date->Unix(), 0, "unix is 0 with Value => ' ', Format => 'unknown'" );
+    ok( !$date->IsSet, "unix is 0 with Value => ' ', Format => 'unknown'" );
 }
 
 #TODO: AsString
 #TODO: RFC2822, W3CDTF with Timezones
 
+done_testing;