first pass RT4 merge, RT#13852
[freeside.git] / rt / t / lifecycles / dates.t
diff --git a/rt/t/lifecycles/dates.t b/rt/t/lifecycles/dates.t
new file mode 100644 (file)
index 0000000..d8a27f6
--- /dev/null
@@ -0,0 +1,317 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+BEGIN {require 't/lifecycles/utils.pl'};
+
+my $general = RT::Test->load_or_create_queue(
+    Name => 'General',
+);
+ok $general && $general->id, 'loaded or created a queue';
+
+my $delivery = RT::Test->load_or_create_queue(
+    Name => 'delivery',
+    Lifecycle => 'delivery',
+);
+ok $delivery && $delivery->id, 'loaded or created a queue';
+
+my $tstatus = sub {
+    DBIx::SearchBuilder::Record::Cachable->FlushCache;
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    $ticket->Load( $_[0] );
+    return $ticket->Status;
+};
+
+my ($baseurl, $m) = RT::Test->started_ok;
+ok $m->login, 'logged in';
+
+diag "check basic API";
+{
+    my $schema = $general->Lifecycle;
+    isa_ok($schema, 'RT::Lifecycle');
+    is $schema->Name, 'default', "it's a default schema";
+
+    $schema = $delivery->Lifecycle;
+    isa_ok($schema, 'RT::Lifecycle');
+    is $schema->Name, 'delivery', "it's a delivery schema";
+}
+
+diag "dates on create for default schema";
+{
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'new',
+        );
+        ok $id, 'created a ticket';
+        ok $ticket->StartedObj->Unix <= 0, 'started is not set';
+        ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'open',
+        );
+        ok $id, 'created a ticket';
+        ok $ticket->StartedObj->Unix > 0, 'started is set';
+        ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'resolved',
+        );
+        ok $id, 'created a ticket';
+        ok $ticket->StartedObj->Unix > 0, 'started is set';
+        ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
+    }
+
+    my $test_date = '2008-11-28 12:00:00';
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'new',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'open',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'resolved',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+    }
+}
+
+diag "dates on create for delivery schema";
+{
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+            Status => 'ordered',
+        );
+        ok $id, 'created a ticket';
+        is $ticket->StartedObj->Unix , 0, 'started is not set';
+        is $ticket->ResolvedObj->Unix, 0, 'resolved is not set';
+
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $txn, $msg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+        );
+        ok $id, 'created a ticket';
+        diag($msg);
+        is $ticket->Status, 'ordered', "Status is ordered";
+        my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
+        ok($statusval,$statusmsg);
+        ok $ticket->StartedObj->Unix > 0, 'started is set to ' .$ticket->StartedObj->AsString ;
+        is $ticket->ResolvedObj->Unix, 0, 'resolved is not set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+        );
+        ok $id, 'created a ticket';
+
+        my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
+        ok($statusval,$statusmsg);
+
+        ($statusval,$statusmsg) = $ticket->SetStatus('delivered');
+        ok($statusval,$statusmsg);
+
+        ok $ticket->StartedObj->Unix > 0, 'started is set';
+        ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
+    }
+
+    my $test_date = '2008-11-28 12:00:00';
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $statusmsg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+            Status => 'ordered',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+            Status => 'ordered',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
+        ok($statusval,$statusmsg);
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $delivery->id,
+            Subject => 'test',
+            Started => $test_date,
+            Resolved => $test_date,
+        );
+        ok $id, 'created a ticket';
+        my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
+        ok($statusval,$statusmsg);
+        ($statusval,$statusmsg) = $ticket->SetStatus('delivered');
+        ok($statusval,$statusmsg);
+        is $ticket->StartedObj->ISO, $test_date, 'started is set';
+        TODO: {
+            local $TODO = "we should decide if we set resolved repeatedly";
+            is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
+        };
+    }
+}
+
+diag "dates on status change for default schema";
+{
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    my ($id, $msg) = $ticket->Create(
+        Queue => $general->id,
+        Subject => 'test',
+        Status => 'new',
+    );
+    ok $id, 'created a ticket';
+    ok $ticket->StartedObj->Unix <= 0, 'started is not set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    (my $status, $msg) = $ticket->SetStatus('open');
+    ok $status, 'changed status' or diag "error: $msg";
+    ok $ticket->StartedObj->Unix > 0, 'started is set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    my $started = $ticket->StartedObj->Unix;
+
+    ($status, $msg) = $ticket->SetStatus('stalled');
+    ok $status, 'changed status' or diag "error: $msg";
+    is $ticket->StartedObj->Unix, $started, 'started is set and the same';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    ($status, $msg) = $ticket->SetStatus('open');
+    ok $status, 'changed status' or diag "error: $msg";
+    is $ticket->StartedObj->Unix, $started, 'started is set and the same';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    ($status, $msg) = $ticket->SetStatus('resolved');
+    ok $status, 'changed status' or diag "error: $msg";
+    is $ticket->StartedObj->Unix, $started, 'started is set and the same';
+    ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
+}
+
+diag "dates on status change for delivery schema";
+{
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    my ($id, $msg) = $ticket->Create(
+        Queue => $delivery->id,
+        Subject => 'test',
+        Status => 'ordered',
+    );
+    ok $id, 'created a ticket';
+    ok $ticket->StartedObj->Unix <= 0, 'started is not set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    (my $status, $msg) = $ticket->SetStatus('delayed');
+    ok $status, 'changed status' or diag "error: $msg";
+    ok $ticket->StartedObj->Unix > 0, 'started is set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    my $started = $ticket->StartedObj->Unix;
+
+    ($status, $msg) = $ticket->SetStatus('on way');
+    ok $status, 'changed status' or diag "error: $msg";
+    is $ticket->StartedObj->Unix, $started, 'started is set and the same';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    ($status, $msg) = $ticket->SetStatus('delivered');
+    ok $status, 'changed status' or diag "error: $msg";
+    is $ticket->StartedObj->Unix, $started, 'started is set and the same';
+    ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
+}
+
+diag "add partial map between general->delivery";
+{
+    my $schemas = RT->Config->Get('Lifecycles');
+    $schemas->{'__maps__'} = {
+        'default -> delivery' => {
+            new => 'on way',
+        },
+        'delivery -> default' => {
+            'on way' => 'resolved',
+        },
+    };
+    RT::Lifecycle->FillCache;
+}
+
+diag "check date changes on moving a ticket";
+{
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    my ($id, $msg) = $ticket->Create(
+        Queue => $general->id,
+        Subject => 'test',
+        Status => 'new',
+    );
+    ok $id, 'created a ticket';
+    ok $ticket->StartedObj->Unix <= 0, 'started is not set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    (my $status, $msg) = $ticket->SetQueue( $delivery->id );
+    ok $status, "moved ticket between queues with different schemas";
+    is $ticket->Status, 'on way', 'status has been changed';
+    ok $ticket->StartedObj->Unix > 0, 'started is set';
+    ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
+
+    ($status, $msg) = $ticket->SetQueue( $general->id );
+    ok $status, "moved ticket between queues with different schemas";
+    is $ticket->Status, 'resolved', 'status has been changed';
+    ok $ticket->StartedObj->Unix > 0, 'started is set';
+    ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
+}