diff options
Diffstat (limited to 'rt/t/lifecycles/basics.t')
-rw-r--r-- | rt/t/lifecycles/basics.t | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/rt/t/lifecycles/basics.t b/rt/t/lifecycles/basics.t new file mode 100644 index 000000000..5825a105d --- /dev/null +++ b/rt/t/lifecycles/basics.t @@ -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), '-deleted-open', 'only default, current and open 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'], + ); +} + |