first pass RT4 merge, RT#13852
[freeside.git] / rt / t / lifecycles / basics.t
diff --git a/rt/t/lifecycles/basics.t b/rt/t/lifecycles/basics.t
new file mode 100644 (file)
index 0000000..40e2391
--- /dev/null
@@ -0,0 +1,247 @@
+#!/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 $tstatus = sub {
+    DBIx::SearchBuilder::Record::Cachable->FlushCache;
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    $ticket->Load( $_[0] );
+    return $ticket->Status;
+};
+
+diag "check basic API";
+{
+    my $schema = $general->Lifecycle;
+    isa_ok($schema, 'RT::Lifecycle');
+    is $schema->Name, 'default', "it's a default schema";
+    is_deeply [$schema->Valid],
+        [qw(new open stalled resolved rejected deleted)],
+        'this is the default set from our config file';
+
+    foreach my $s ( qw(new open stalled resolved rejected deleted) ) {
+        ok $schema->IsValid($s), "valid";
+    }
+    ok !$schema->IsValid(), 'invalid';
+    ok !$schema->IsValid(''), 'invalid';
+    ok !$schema->IsValid(undef), 'invalid';
+    ok !$schema->IsValid('foo'), 'invalid';
+
+    is_deeply [$schema->Initial], ['new'], 'initial set';
+    ok $schema->IsInitial('new'), "initial";
+    ok !$schema->IsInitial('open'), "not initial";
+    ok !$schema->IsInitial, "not initial";
+    ok !$schema->IsInitial(''), "not initial";
+    ok !$schema->IsInitial(undef), "not initial";
+    ok !$schema->IsInitial('foo'), "not initial";
+
+    is_deeply [$schema->Active], [qw(open stalled)], 'active set';
+    ok( $schema->IsActive($_), "active" )
+        foreach qw(open stalled);
+    ok !$schema->IsActive('new'), "not active";
+    ok !$schema->IsActive, "not active";
+    ok !$schema->IsActive(''), "not active";
+    ok !$schema->IsActive(undef), "not active";
+    ok !$schema->IsActive('foo'), "not active";
+
+    is_deeply [$schema->Inactive], [qw(resolved rejected deleted)], 'inactive set';
+    ok( $schema->IsInactive($_), "inactive" )
+        foreach qw(resolved rejected deleted);
+    ok !$schema->IsInactive('new'), "not inactive";
+    ok !$schema->IsInactive, "not inactive";
+    ok !$schema->IsInactive(''), "not inactive";
+    ok !$schema->IsInactive(undef), "not inactive";
+    ok !$schema->IsInactive('foo'), "not inactive";
+
+    is_deeply [$schema->Transitions('')], [qw(new open resolved)], 'on create transitions';
+    ok $schema->IsTransition('' => $_), 'good transition'
+        foreach qw(new open resolved);
+}
+
+my ($baseurl, $m) = RT::Test->started_ok;
+ok $m->login, 'logged in';
+
+diag "check status input on create";
+{
+    $m->goto_create_ticket( $general );
+
+    my $form = $m->form_name('TicketCreate');
+    ok my $input = $form->find_input('Status'), 'found status selector';
+
+    my @form_values = $input->possible_values;
+    ok scalar @form_values, 'some options in the UI';
+
+    my $valid = 1;
+    foreach ( @form_values ) {
+        next if $general->Lifecycle->IsValid($_);
+        $valid = 0;
+        diag("$_ doesn't appear to be a valid status, but it was in the form");
+    }
+
+
+    ok $valid, 'all statuses in the form are valid';
+}
+
+diag "create a ticket";
+my $tid;
+{
+    my $ticket = RT::Ticket->new( RT->SystemUser );
+    ($tid) = $ticket->Create( Queue => $general->id, Subject => 'test' );
+    ok $tid, "created a ticket #$tid";
+    is $ticket->Status, 'new', 'correct status';
+}
+
+diag "new ->(open it)-> open";
+{
+    ok $m->goto_ticket( $tid ), 'opened a ticket';
+    $m->check_links(
+        has => ['Open It', 'Resolve', 'Reject', 'Delete'],
+        has_no => ['Stall', 'Re-open', 'Undelete'],
+    );
+
+    $m->follow_link_ok({text => 'Open It'});
+    $m->form_name('TicketUpdate');
+    $m->click('SubmitTicket');
+
+    is $tstatus->($tid), 'open', 'changed status';
+}
+
+diag "open ->(stall)-> stalled";
+{
+    is $tstatus->($tid), 'open', 'ticket is open';
+
+    ok $m->goto_ticket( $tid ), 'opened a ticket';
+
+    $m->check_links(
+        has => ['Stall', 'Resolve', 'Reject'],
+        has_no => ['Open It', 'Delete', 'Re-open', 'Undelete'],
+    );
+
+    $m->follow_link_ok({text => 'Stall'});
+    $m->form_name('TicketUpdate');
+    $m->click('SubmitTicket');
+
+    is $tstatus->($tid), 'stalled', 'changed status';
+}
+
+diag "stall ->(open it)-> open";
+{
+    is $tstatus->($tid), 'stalled', 'ticket is stalled';
+
+    ok $m->goto_ticket( $tid ), 'opened a ticket';
+    $m->check_links(
+        has => ['Open It'],
+        has_no => ['Delete', 'Re-open', 'Undelete', 'Stall', 'Resolve', 'Reject'],
+    );
+
+    $m->follow_link_ok({text => 'Open It'});
+
+    is $tstatus->($tid), 'open', 'changed status';
+}
+
+diag "open -> deleted, only via modify";
+{
+    is $tstatus->($tid), 'open', 'ticket is open';
+
+    $m->get_ok( '/Ticket/Modify.html?id='. $tid );
+    my $form = $m->form_name('TicketModify');
+    ok my $input = $form->find_input('Status'), 'found status selector';
+
+    my @form_values = $input->possible_values;
+    ok scalar @form_values, 'some options in the UI';
+
+    ok grep($_ eq 'deleted', @form_values), "has deleted";
+
+    $m->select( Status => 'deleted' );
+    $m->submit;
+
+    is $tstatus->($tid), 'deleted', 'deleted ticket';
+}
+
+diag "deleted -> X via modify, only open is available";
+{
+    is $tstatus->($tid), 'deleted', 'ticket is deleted';
+
+    $m->get_ok( '/Ticket/Modify.html?id='. $tid );
+    my $form = $m->form_name('TicketModify');
+    ok my $input = $form->find_input('Status'), 'found status selector';
+
+    my @form_values = $input->possible_values;
+    ok scalar @form_values, 'some options in the UI';
+
+    is join('-', @form_values), '-open', 'only open and default available';
+}
+
+diag "check illegal values and transitions";
+{
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'illegal',
+        );
+        ok !$id, 'have not created 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';
+    }
+    {
+        my $ticket = RT::Ticket->new( RT->SystemUser );
+        my ($id, $msg) = $ticket->Create(
+            Queue => $general->id,
+            Subject => 'test',
+            Status => 'new',
+        );
+        ok $id, 'created a ticket';
+
+        (my $status, $msg) = $ticket->SetStatus( 'illeagal' );
+        ok !$status, "couldn't set illeagal status";
+        is $ticket->Status, 'new', 'status is steal the same';
+
+        ($status, $msg) = $ticket->SetStatus( 'stalled' );
+        ok !$status, "couldn't set status, transition is illeagal";
+        is $ticket->Status, 'new', 'status is steal the same';
+    }
+}
+
+diag "'!inactive -> inactive' actions are shown even if ticket has unresolved dependencies";
+{
+    my $child_ticket = RT::Test->create_ticket(
+        Queue => $general->id,
+        Subject => 'child',
+    );
+    my $cid = $child_ticket->id;
+    my $parent_ticket = RT::Test->create_ticket(
+        Queue => $general->id,
+        Subject => 'parent',
+        DependsOn => $child_ticket->id,
+    );
+    my $pid = $parent_ticket->id;
+
+    ok $m->goto_ticket( $pid ), 'opened a ticket';
+    $m->check_links(
+        has => ['Open It', 'Resolve', 'Reject', 'Delete' ],
+        has_no => ['Stall', 'Re-open', 'Undelete', ],
+    );
+    ok $m->goto_ticket( $cid ), 'opened a ticket';
+    $m->check_links(
+        has => ['Open It', 'Resolve', 'Reject', 'Delete'],
+        has_no => ['Stall', 'Re-open', 'Undelete'],
+    );
+}
+