summaryrefslogtreecommitdiff
path: root/rt/t/lifecycles
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2012-04-24 11:35:56 -0700
committerIvan Kohler <ivan@freeside.biz>2012-04-24 11:35:56 -0700
commit6587f6ba7d047ddc1686c080090afe7d53365bd4 (patch)
treeec77342668e8865aca669c9b4736e84e3077b523 /rt/t/lifecycles
parent47153aae5c2fc00316654e7277fccd45f72ff611 (diff)
first pass RT4 merge, RT#13852
Diffstat (limited to 'rt/t/lifecycles')
-rw-r--r--rt/t/lifecycles/basics.t247
-rw-r--r--rt/t/lifecycles/dates.t317
-rw-r--r--rt/t/lifecycles/moving.t97
-rw-r--r--rt/t/lifecycles/unresolved-deps.t45
-rw-r--r--rt/t/lifecycles/utils.pl73
5 files changed, 779 insertions, 0 deletions
diff --git a/rt/t/lifecycles/basics.t b/rt/t/lifecycles/basics.t
new file mode 100644
index 000000000..40e239186
--- /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), '-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'],
+ );
+}
+
diff --git a/rt/t/lifecycles/dates.t b/rt/t/lifecycles/dates.t
new file mode 100644
index 000000000..d8a27f613
--- /dev/null
+++ b/rt/t/lifecycles/dates.t
@@ -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';
+}
diff --git a/rt/t/lifecycles/moving.t b/rt/t/lifecycles/moving.t
new file mode 100644
index 000000000..6e0d64bbf
--- /dev/null
+++ b/rt/t/lifecycles/moving.t
@@ -0,0 +1,97 @@
+#!/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;
+};
+
+diag "check moving without a map";
+{
+ 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->SetQueue( $delivery->id );
+ ok !$status, "couldn't change queue when there is no maps between schemas";
+ is $ticket->Queue, $general->id, 'queue is steal the same';
+ is $ticket->Status, 'new', 'status is steal the same';
+}
+
+diag "add partial map";
+{
+ my $schemas = RT->Config->Get('Lifecycles');
+ $schemas->{'__maps__'} = {
+ 'default -> delivery' => {
+ new => 'ordered',
+ },
+ };
+ RT::Lifecycle->FillCache;
+}
+
+diag "check moving with a partial map";
+{
+ {
+ 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->SetQueue( $delivery->id );
+ ok $status, "moved ticket between queues with different schemas";
+ is $ticket->Queue, $delivery->id, 'queue has been changed'
+ or diag "error: $msg";
+ is $ticket->Status, 'ordered', 'status has been changed';
+ }
+ {
+ my $ticket = RT::Ticket->new( RT->SystemUser );
+ my ($id, $msg) = $ticket->Create(
+ Queue => $general->id,
+ Subject => 'test',
+ Status => 'open',
+ );
+ ok $id, 'created a ticket';
+ (my $status, $msg) = $ticket->SetQueue( $delivery->id );
+ ok !$status, "couldn't change queue when map is not complete";
+ is $ticket->Queue, $general->id, 'queue is steal the same';
+ is $ticket->Status, 'open', 'status is steal the same';
+ }
+}
+
+diag "one way map doesn't work backwards";
+{
+ my $ticket = RT::Ticket->new( RT->SystemUser );
+ my ($id, $msg) = $ticket->Create(
+ Queue => $delivery->id,
+ Subject => 'test',
+ Status => 'ordered',
+ );
+ ok $id, 'created a ticket';
+ (my $status, $msg) = $ticket->SetQueue( $general->id );
+ ok !$status, "couldn't change queue when there is no maps between schemas";
+ is $ticket->Queue, $delivery->id, 'queue is steal the same';
+ is $ticket->Status, 'ordered', 'status is steal the same';
+}
diff --git a/rt/t/lifecycles/unresolved-deps.t b/rt/t/lifecycles/unresolved-deps.t
new file mode 100644
index 000000000..aff9a1a56
--- /dev/null
+++ b/rt/t/lifecycles/unresolved-deps.t
@@ -0,0 +1,45 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+use Test::More tests => 15;
+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';
+
+# different value tested in basics
+RT->Config->Set('HideResolveActionsWithDependencies' => 1);
+
+my ($baseurl, $m) = RT::Test->started_ok;
+ok $m->login, 'logged in';
+
+{
+ 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'],
+ has_no => ['Stall', 'Re-open', 'Undelete', 'Resolve', 'Reject', 'Delete'],
+ );
+ ok $m->goto_ticket( $cid ), 'opened a ticket';
+ $m->check_links(
+ has => ['Open It', 'Resolve', 'Reject', 'Delete'],
+ has_no => ['Stall', 'Re-open', 'Undelete'],
+ );
+}
+
diff --git a/rt/t/lifecycles/utils.pl b/rt/t/lifecycles/utils.pl
new file mode 100644
index 000000000..6fb229390
--- /dev/null
+++ b/rt/t/lifecycles/utils.pl
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+
+my $config;
+BEGIN {
+$config = <<END;
+Set(\%Lifecycles,
+ default => {
+ initial => [qw(new)],
+ active => [qw(open stalled)],
+ inactive => [qw(resolved rejected deleted)],
+ defaults => {
+ on_create => 'new',
+ on_merge => 'resolved',
+ },
+ transitions => {
+ '' => [qw(new open resolved)],
+ new => [qw(open resolved rejected deleted)],
+ open => [qw(stalled resolved rejected deleted)],
+ stalled => [qw(open)],
+ resolved => [qw(open)],
+ rejected => [qw(open)],
+ deleted => [qw(open)],
+ },
+ actions => {
+ 'new -> open' => {label => 'Open It', update => 'Respond'},
+ 'new -> resolved' => {label => 'Resolve', update => 'Comment'},
+ 'new -> rejected' => {label => 'Reject', update => 'Respond'},
+ 'new -> deleted' => {label => 'Delete', update => ''},
+
+ 'open -> stalled' => {label => 'Stall', update => 'Comment'},
+ 'open -> resolved' => {label => 'Resolve', update => 'Comment'},
+ 'open -> rejected' => {label => 'Reject', update => 'Respond'},
+
+ 'stalled -> open' => {label => 'Open It', update => ''},
+ 'resolved -> open' => {label => 'Re-open', update => 'Comment'},
+ 'rejected -> open' => {label => 'Re-open', update => 'Comment'},
+ 'deleted -> open' => {label => 'Undelete', update => ''},
+ },
+ },
+ delivery => {
+ initial => ['ordered'],
+ active => ['on way', 'delayed'],
+ inactive => ['delivered'],
+ defaults => {
+ on_create => 'ordered',
+ on_merge => 'delivered',
+ },
+ transitions => {
+ '' => ['ordered'],
+ ordered => ['on way', 'delayed'],
+ 'on way' => ['delivered'],
+ delayed => ['on way'],
+ delivered => [],
+ },
+ actions => {
+ 'ordered -> on way' => {label => 'Put On Way', update => 'Respond'},
+ 'ordered -> delayed' => {label => 'Delay', update => 'Respond'},
+
+ 'on way -> delivered' => {label => 'Done', update => 'Respond'},
+ 'delayed -> on way' => {label => 'Put On Way', update => 'Respond'},
+ },
+ },
+);
+END
+}
+
+use RT::Test config => $config;
+
+1;