diff options
author | Ivan Kohler <ivan@freeside.biz> | 2015-07-09 22:18:55 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2015-07-09 22:18:55 -0700 |
commit | 1c538bfabc2cd31f27067505f0c3d1a46cba6ef0 (patch) | |
tree | 96922ad4459eda1e649327fd391d60c58d454c53 /rt/t/shredder | |
parent | 4f5619288413a185e9933088d9dd8c5afbc55dfa (diff) |
RT 4.2.11, ticket#13852
Diffstat (limited to 'rt/t/shredder')
-rw-r--r-- | rt/t/shredder/00load.t | 10 | ||||
-rw-r--r-- | rt/t/shredder/00skeleton.t | 18 | ||||
-rw-r--r-- | rt/t/shredder/01basics.t | 20 | ||||
-rw-r--r-- | rt/t/shredder/01ticket.t | 55 | ||||
-rw-r--r-- | rt/t/shredder/02group_member.t | 211 | ||||
-rw-r--r-- | rt/t/shredder/02queue.t | 75 | ||||
-rw-r--r-- | rt/t/shredder/02template.t | 45 | ||||
-rw-r--r-- | rt/t/shredder/02user.t | 32 | ||||
-rw-r--r-- | rt/t/shredder/03plugin.t | 10 | ||||
-rw-r--r-- | rt/t/shredder/03plugin_summary.t | 11 | ||||
-rw-r--r-- | rt/t/shredder/03plugin_tickets.t | 30 | ||||
-rw-r--r-- | rt/t/shredder/03plugin_users.t | 24 | ||||
-rw-r--r-- | rt/t/shredder/utils.pl | 394 |
13 files changed, 257 insertions, 678 deletions
diff --git a/rt/t/shredder/00load.t b/rt/t/shredder/00load.t index a78e5e4c3..2d78da45c 100644 --- a/rt/t/shredder/00load.t +++ b/rt/t/shredder/00load.t @@ -1,14 +1,6 @@ use strict; use warnings; -use File::Spec; -use Test::More tests => 11 + 1; # plus one for warnings check -use RT::Test nodb => 1; - -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} +use RT::Test nodb => 1, tests => 11; use_ok("RT::Shredder"); diff --git a/rt/t/shredder/00skeleton.t b/rt/t/shredder/00skeleton.t index 9c6e3a1c0..86f6fa9c7 100644 --- a/rt/t/shredder/00skeleton.t +++ b/rt/t/shredder/00skeleton.t @@ -3,22 +3,14 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 1 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); +use RT::Test::Shredder tests => 1; +my $test = "RT::Test::Shredder"; - -create_savepoint('clean'); # backup of the clean RT DB -my $shredder = shredder_new(); # new shredder object +$test->create_savepoint('clean'); # backup of the clean RT DB +my $shredder = $test->shredder_new(); # new shredder object # .... # create and wipe RT objects # -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); diff --git a/rt/t/shredder/01basics.t b/rt/t/shredder/01basics.t index 1fa9f75ba..368c9ba74 100644 --- a/rt/t/shredder/01basics.t +++ b/rt/t/shredder/01basics.t @@ -3,18 +3,10 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 3 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); +use RT::Test::Shredder tests => 4; +my $test = "RT::Test::Shredder"; - -create_savepoint(); +$test->create_savepoint(); use RT::Tickets; my $ticket = RT::Ticket->new( RT->SystemUser ); @@ -25,7 +17,9 @@ $ticket = RT::Ticket->new( RT->SystemUser ); my ($status, $msg) = $ticket->Load( $id ); ok( $id, "load ticket" ) or diag( "error: $msg" ); -my $shredder = shredder_new(); +my $shredder = $test->shredder_new(); $shredder->Wipeout( Object => $ticket ); -cmp_deeply( dump_current_and_savepoint(), "current DB equal to savepoint"); +$test->db_is_valid; + +cmp_deeply( $test->dump_current_and_savepoint(), "current DB equal to savepoint"); diff --git a/rt/t/shredder/01ticket.t b/rt/t/shredder/01ticket.t index 0a9da413e..57179bc0b 100644 --- a/rt/t/shredder/01ticket.t +++ b/rt/t/shredder/01ticket.t @@ -3,19 +3,10 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 15 + 1; # plus one for warnings check -use RT::Test (); +use RT::Test::Shredder tests => 20; +my $test = "RT::Test::Shredder"; - -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} - -init_db(); -create_savepoint('clean'); +$test->create_savepoint('clean'); use RT::Ticket; use RT::Tickets; @@ -26,23 +17,25 @@ use RT::Tickets; ok( $id, "created new ticket" ); $ticket->Delete; is( $ticket->Status, 'deleted', "successfuly changed status" ); + $ticket->ApplyTransactionBatch; my $tickets = RT::Tickets->new( RT->SystemUser ); $tickets->{'allow_deleted_search'} = 1; $tickets->LimitStatus( VALUE => 'deleted' ); is( $tickets->Count, 1, "found one deleted ticket" ); - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => $tickets ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); { my $parent = RT::Ticket->new( RT->SystemUser ); my ($pid) = $parent->Create( Subject => 'test', Queue => 1 ); ok( $pid, "created new ticket" ); - create_savepoint('parent_ticket'); + $test->create_savepoint('parent_ticket'); my $child = RT::Ticket->new( RT->SystemUser ); my ($cid) = $child->Create( Subject => 'test', Queue => 1 ); @@ -50,15 +43,21 @@ cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint" my ($status, $msg) = $parent->AddLink( Type => 'MemberOf', Target => $cid ); ok( $status, "Added link between tickets") or diag("error: $msg"); - my $shredder = shredder_new(); + + $parent->ApplyTransactionBatch; + $child->ApplyTransactionBatch; + + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => $child ); $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('parent_ticket'), "current DB equal to savepoint"); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('parent_ticket'), "current DB equal to savepoint"); $shredder->PutObjects( Objects => $parent ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); { my $parent = RT::Ticket->new( RT->SystemUser ); @@ -66,24 +65,26 @@ cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint" ok( $pid, "created new ticket" ); my ($status, $msg) = $parent->Delete; ok( $status, 'deleted parent ticket'); - create_savepoint('parent_ticket'); + $test->create_savepoint('parent_ticket'); my $child = RT::Ticket->new( RT->SystemUser ); my ($cid) = $child->Create( Subject => 'test', Queue => 1 ); - ok( $cid, "created new ticket" ); + ok( $cid, "created new ticket #$cid" ); ($status, $msg) = $parent->AddLink( Type => 'DependsOn', Target => $cid ); ok( $status, "Added link between tickets") or diag("error: $msg"); - my $shredder = shredder_new(); + + $parent->ApplyTransactionBatch; + $child->ApplyTransactionBatch; + + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => $child ); $shredder->WipeoutAll; - - TODO: { - local $TODO = "Shredder doesn't delete all links and transactions"; - cmp_deeply( dump_current_and_savepoint('parent_ticket'), "current DB equal to savepoint"); - } + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('parent_ticket'), "current DB equal to savepoint"); $shredder->PutObjects( Objects => $parent ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); diff --git a/rt/t/shredder/02group_member.t b/rt/t/shredder/02group_member.t index 9dc4f6126..87d1e3ce7 100644 --- a/rt/t/shredder/02group_member.t +++ b/rt/t/shredder/02group_member.t @@ -3,100 +3,133 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 22 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); - +use RT::Test::Shredder tests => 34; +my $test = "RT::Test::Shredder"; ### nested membership check { - create_savepoint('clean'); - my $pgroup = RT::Group->new( RT->SystemUser ); - my ($pgid) = $pgroup->CreateUserDefinedGroup( Name => 'Parent group' ); - ok( $pgid, "created parent group" ); - is( $pgroup->id, $pgid, "id is correct" ); - - my $cgroup = RT::Group->new( RT->SystemUser ); - my ($cgid) = $cgroup->CreateUserDefinedGroup( Name => 'Child group' ); - ok( $cgid, "created child group" ); - is( $cgroup->id, $cgid, "id is correct" ); - - my ($status, $msg) = $pgroup->AddMember( $cgroup->id ); - ok( $status, "added child group to parent") or diag "error: $msg"; - - create_savepoint('bucreate'); # before user create - my $user = RT::User->new( RT->SystemUser ); - my $uid; - ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); - ok( $uid, "created new user" ) or diag "error: $msg"; - is( $user->id, $uid, "id is correct" ); - - create_savepoint('buadd'); # before group add - ($status, $msg) = $cgroup->AddMember( $user->id ); - ok( $status, "added user to child group") or diag "error: $msg"; - - my $members = RT::GroupMembers->new( RT->SystemUser ); - $members->Limit( FIELD => 'MemberId', VALUE => $uid ); - $members->Limit( FIELD => 'GroupId', VALUE => $cgid ); - is( $members->Count, 1, "find membership record" ); - - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $members ); - $shredder->WipeoutAll(); - cmp_deeply( dump_current_and_savepoint('buadd'), "current DB equal to savepoint"); - - $shredder->PutObjects( Objects => $user ); - $shredder->WipeoutAll(); - cmp_deeply( dump_current_and_savepoint('bucreate'), "current DB equal to savepoint"); - - $shredder->PutObjects( Objects => [$pgroup, $cgroup] ); - $shredder->WipeoutAll(); - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + $test->create_savepoint('clean'); + my $pgroup = RT::Group->new( RT->SystemUser ); + my ($pgid) = $pgroup->CreateUserDefinedGroup( Name => 'Parent group' ); + ok( $pgid, "created parent group" ); + is( $pgroup->id, $pgid, "id is correct" ); + + my $cgroup = RT::Group->new( RT->SystemUser ); + my ($cgid) = $cgroup->CreateUserDefinedGroup( Name => 'Child group' ); + ok( $cgid, "created child group" ); + is( $cgroup->id, $cgid, "id is correct" ); + + my ($status, $msg) = $pgroup->AddMember( $cgroup->id ); + ok( $status, "added child group to parent") or diag "error: $msg"; + + $test->create_savepoint('bucreate'); # before user create + my $user = RT::User->new( RT->SystemUser ); + my $uid; + ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); + ok( $uid, "created new user" ) or diag "error: $msg"; + is( $user->id, $uid, "id is correct" ); + + $test->create_savepoint('buadd'); # before group add + ($status, $msg) = $cgroup->AddMember( $user->id ); + ok( $status, "added user to child group") or diag "error: $msg"; + + my $members = RT::GroupMembers->new( RT->SystemUser ); + $members->Limit( FIELD => 'MemberId', VALUE => $uid ); + $members->Limit( FIELD => 'GroupId', VALUE => $cgid ); + is( $members->Count, 1, "find membership record" ); + + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $members ); + $shredder->WipeoutAll(); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('buadd'), "current DB equal to savepoint"); + + $shredder->PutObjects( Objects => $user ); + $shredder->WipeoutAll(); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('bucreate'), "current DB equal to savepoint"); + + $shredder->PutObjects( Objects => [$pgroup, $cgroup] ); + $shredder->WipeoutAll(); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +} + +### deleting member of the ticket AdminCc role group +{ + $test->restore_savepoint('clean'); + + my $user = RT::User->new( RT->SystemUser ); + my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); + ok( $uid, "created new user" ) or diag "error: $msg"; + is( $user->id, $uid, "id is correct" ); + + use RT::Queue; + my $queue = RT::Queue->new( RT->SystemUser ); + $queue->Load('general'); + ok( $queue->id, "queue loaded succesfully" ); + + use RT::Tickets; + my $ticket = RT::Ticket->new( RT->SystemUser ); + my ($id) = $ticket->Create( Subject => 'test', Queue => $queue->id ); + ok( $id, "created new ticket" ); + $ticket = RT::Ticket->new( RT->SystemUser ); + my $status; + ($status, $msg) = $ticket->Load( $id ); + ok( $id, "load ticket" ) or diag( "error: $msg" ); + + ($status, $msg) = $ticket->AddWatcher( Type => "AdminCc", PrincipalId => $user->id ); + ok( $status, "AdminCC successfuly added") or diag( "error: $msg" ); + + my $member = $ticket->AdminCc->MembersObj->First; + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $member ); + $shredder->WipeoutAll(); + $test->db_is_valid; + + $shredder->PutObjects( Objects => $user ); + $shredder->WipeoutAll(); + $test->db_is_valid; } ### deleting member of the ticket Owner role group { - restore_savepoint('clean'); - - my $user = RT::User->new( RT->SystemUser ); - my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); - ok( $uid, "created new user" ) or diag "error: $msg"; - is( $user->id, $uid, "id is correct" ); - - use RT::Queue; - my $queue = RT::Queue->new( RT->SystemUser ); - $queue->Load('general'); - ok( $queue->id, "queue loaded succesfully" ); - - $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue ); - - use RT::Tickets; - my $ticket = RT::Ticket->new( RT->SystemUser ); - my ($id) = $ticket->Create( Subject => 'test', Queue => $queue->id ); - ok( $id, "created new ticket" ); - $ticket = RT::Ticket->new( RT->SystemUser ); - my $status; - ($status, $msg) = $ticket->Load( $id ); - ok( $id, "load ticket" ) or diag( "error: $msg" ); - - ($status, $msg) = $ticket->SetOwner( $user->id ); - ok( $status, "owner successfuly set") or diag( "error: $msg" ); - is( $ticket->Owner, $user->id, "owner successfuly set") or diag( "error: $msg" ); - - my $member = $ticket->OwnerGroup->MembersObj->First; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $member ); - $shredder->WipeoutAll(); - - $ticket = RT::Ticket->new( RT->SystemUser ); - ($status, $msg) = $ticket->Load( $id ); - ok( $id, "load ticket" ) or diag( "error: $msg" ); - is( $ticket->Owner, RT->Nobody->id, "owner switched back to nobody" ); - is( $ticket->OwnerGroup->MembersObj->First->MemberId, RT->Nobody->id, "and owner role group member is nobody"); + $test->restore_savepoint('clean'); + + my $user = RT::User->new( RT->SystemUser ); + my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); + ok( $uid, "created new user" ) or diag "error: $msg"; + is( $user->id, $uid, "id is correct" ); + + use RT::Queue; + my $queue = RT::Queue->new( RT->SystemUser ); + $queue->Load('general'); + ok( $queue->id, "queue loaded succesfully" ); + + $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue ); + + use RT::Tickets; + my $ticket = RT::Ticket->new( RT->SystemUser ); + my ($id) = $ticket->Create( Subject => 'test', Queue => $queue->id ); + ok( $id, "created new ticket" ); + $ticket = RT::Ticket->new( RT->SystemUser ); + my $status; + ($status, $msg) = $ticket->Load( $id ); + ok( $id, "load ticket" ) or diag( "error: $msg" ); + + ($status, $msg) = $ticket->SetOwner( $user->id ); + ok( $status, "owner successfuly set") or diag( "error: $msg" ); + is( $ticket->Owner, $user->id, "owner successfuly set") or diag( "error: $msg" ); + + my $member = $ticket->OwnerGroup->MembersObj->First; + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $member ); + $shredder->WipeoutAll(); + $test->db_is_valid; + + $ticket = RT::Ticket->new( RT->SystemUser ); + ($status, $msg) = $ticket->Load( $id ); + ok( $id, "load ticket" ) or diag( "error: $msg" ); + is( $ticket->Owner, RT->Nobody->id, "owner switched back to nobody" ); + is( $ticket->OwnerGroup->MembersObj->First->MemberId, RT->Nobody->id, "and owner role group member is nobody"); } diff --git a/rt/t/shredder/02queue.t b/rt/t/shredder/02queue.t index dd5581754..0c65c5daf 100644 --- a/rt/t/shredder/02queue.t +++ b/rt/t/shredder/02queue.t @@ -3,33 +3,26 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 16 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); - +use RT::Test::Shredder tests => 21; +my $test = "RT::Test::Shredder"; diag 'simple queue' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $queue = RT::Queue->new( RT->SystemUser ); my ($id, $msg) = $queue->Create( Name => 'my queue' ); ok($id, 'created queue') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $queue ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $queue ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'queue with scrip' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $queue = RT::Queue->new( RT->SystemUser ); my ($id, $msg) = $queue->Create( Name => 'my queue' ); ok($id, 'created queue') or diag "error: $msg"; @@ -44,15 +37,16 @@ diag 'queue with scrip' if $ENV{TEST_VERBOSE}; ); ok($id, 'created scrip') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $queue ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $queue ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'queue with template' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $queue = RT::Queue->new( RT->SystemUser ); my ($id, $msg) = $queue->Create( Name => 'my queue' ); ok($id, 'created queue') or diag "error: $msg"; @@ -65,15 +59,16 @@ diag 'queue with template' if $ENV{TEST_VERBOSE}; ); ok($id, 'created template') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $queue ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $queue ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'queue with a right granted' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $queue = RT::Queue->new( RT->SystemUser ); my ($id, $msg) = $queue->Create( Name => 'my queue' ); ok($id, 'created queue') or diag "error: $msg"; @@ -88,21 +83,22 @@ diag 'queue with a right granted' if $ENV{TEST_VERBOSE}; ); ok($id, 'granted right') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $queue ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $queue ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'queue with a watcher' if $ENV{TEST_VERBOSE}; { # XXX, FIXME: if uncomment these lines then we'll get 'Bizarre...' -# create_savepoint('clean'); +# $test->create_savepoint('clean'); my $group = RT::Group->new( RT->SystemUser ); my ($id, $msg) = $group->CreateUserDefinedGroup(Name => 'my group'); ok($id, 'created group') or diag "error: $msg"; - create_savepoint('bqcreate'); + $test->create_savepoint('bqcreate'); my $queue = RT::Queue->new( RT->SystemUser ); ($id, $msg) = $queue->Create( Name => 'my queue' ); ok($id, 'created queue') or diag "error: $msg"; @@ -113,12 +109,13 @@ diag 'queue with a watcher' if $ENV{TEST_VERBOSE}; ); ok($id, 'added watcher') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $queue ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('bqcreate'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $queue ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('bqcreate'), "current DB equal to savepoint"); -# $shredder->PutObjects( Objects => $group ); -# $shredder->WipeoutAll; -# cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +# $shredder->PutObjects( Objects => $group ); +# $shredder->WipeoutAll; +# cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diff --git a/rt/t/shredder/02template.t b/rt/t/shredder/02template.t index aeb318ed6..56dd852ed 100644 --- a/rt/t/shredder/02template.t +++ b/rt/t/shredder/02template.t @@ -3,20 +3,12 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 7 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); - +use RT::Test::Shredder tests => 10; +my $test = "RT::Test::Shredder"; diag 'global template' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $template = RT::Template->new( RT->SystemUser ); my ($id, $msg) = $template->Create( Name => 'my template', @@ -24,15 +16,16 @@ diag 'global template' if $ENV{TEST_VERBOSE}; ); ok($id, 'created template') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $template ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $template ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'local template' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $template = RT::Template->new( RT->SystemUser ); my ($id, $msg) = $template->Create( Name => 'my template', @@ -41,15 +34,16 @@ diag 'local template' if $ENV{TEST_VERBOSE}; ); ok($id, 'created template') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $template ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $template ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diag 'template used in scrip' if $ENV{TEST_VERBOSE}; { - create_savepoint('clean'); + $test->create_savepoint('clean'); my $template = RT::Template->new( RT->SystemUser ); my ($id, $msg) = $template->Create( Name => 'my template', @@ -68,8 +62,9 @@ diag 'template used in scrip' if $ENV{TEST_VERBOSE}; ); ok($id, 'created scrip') or diag "error: $msg"; - my $shredder = shredder_new(); - $shredder->PutObjects( Objects => $template ); - $shredder->WipeoutAll; - cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); + my $shredder = $test->shredder_new(); + $shredder->PutObjects( Objects => $template ); + $shredder->WipeoutAll; + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); } diff --git a/rt/t/shredder/02user.t b/rt/t/shredder/02user.t index 9f1577015..620c2c587 100644 --- a/rt/t/shredder/02user.t +++ b/rt/t/shredder/02user.t @@ -3,18 +3,10 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 8 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} -init_db(); - +use RT::Test::Shredder tests => 10; +my $test = "RT::Test::Shredder"; -create_savepoint('clean'); +$test->create_savepoint('clean'); my $queue = RT::Queue->new( RT->SystemUser ); my ($qid) = $queue->Load( 'General' ); @@ -24,38 +16,40 @@ my $ticket = RT::Ticket->new( RT->SystemUser ); my ($tid) = $ticket->Create( Queue => $qid, Subject => 'test' ); ok( $tid, "ticket created" ); -create_savepoint('bucreate'); # berfore user create +$test->create_savepoint('bucreate'); # berfore user create my $user = RT::User->new( RT->SystemUser ); my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 ); ok( $uid, "created new user" ) or diag "error: $msg"; is( $user->id, $uid, "id is correct" ); # HACK: set ticket props to enable VARIABLE dependencies $ticket->__Set( Field => 'LastUpdatedBy', Value => $uid ); -create_savepoint('aucreate'); # after user create +$test->create_savepoint('aucreate'); # after user create { my $resolver = sub { my %args = (@_); - my $t = $args{'TargetObject'}; + my $t = $args{'TargetObject'}; my $resolver_uid = RT->SystemUser->id; foreach my $method ( qw(Creator LastUpdatedBy) ) { next unless $t->_Accessible( $method => 'read' ); $t->__Set( Field => $method, Value => $resolver_uid ); } }; - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); $shredder->PutResolver( BaseClass => 'RT::User', Code => $resolver ); $shredder->Wipeout( Object => $user ); - cmp_deeply( dump_current_and_savepoint('bucreate'), "current DB equal to savepoint"); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('bucreate'), "current DB equal to savepoint"); } { - restore_savepoint('aucreate'); + $test->restore_savepoint('aucreate'); my $user = RT::User->new( RT->SystemUser ); $user->Load($uid); ok($user->id, "loaded user after restore"); - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); eval { $shredder->Wipeout( Object => $user ) }; ok($@, "wipeout throw exception if no resolvers"); - cmp_deeply( dump_current_and_savepoint('aucreate'), "current DB equal to savepoint"); + $test->db_is_valid; + cmp_deeply( $test->dump_current_and_savepoint('aucreate'), "current DB equal to savepoint"); } diff --git a/rt/t/shredder/03plugin.t b/rt/t/shredder/03plugin.t index 15766cd2e..de5d44fa7 100644 --- a/rt/t/shredder/03plugin.t +++ b/rt/t/shredder/03plugin.t @@ -3,14 +3,8 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 28 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} +use RT::Test::Shredder nodb => 1, tests => 28; +my $test = "RT::Test::Shredder"; my @PLUGINS = sort qw(Attachments Base Objects SQLDump Summary Tickets Users); diff --git a/rt/t/shredder/03plugin_summary.t b/rt/t/shredder/03plugin_summary.t index d450c70a2..7da8bb454 100644 --- a/rt/t/shredder/03plugin_summary.t +++ b/rt/t/shredder/03plugin_summary.t @@ -2,16 +2,7 @@ use strict; use warnings; -use Test::Deep; -use File::Spec; -use Test::More tests => 4 + 1; # plus one for warnings check -use RT::Test nodb => 1; -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} - +use RT::Test::Shredder nodb => 1, tests => 4; use_ok('RT::Shredder::Plugin'); my $plugin_obj = RT::Shredder::Plugin->new; diff --git a/rt/t/shredder/03plugin_tickets.t b/rt/t/shredder/03plugin_tickets.t index 1579bc54b..dd2b120c4 100644 --- a/rt/t/shredder/03plugin_tickets.t +++ b/rt/t/shredder/03plugin_tickets.t @@ -3,15 +3,10 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 44 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} +use RT::Test::Shredder tests => 49; +my $test = "RT::Test::Shredder"; +use_ok('RT::Shredder'); use_ok('RT::Shredder::Plugin::Tickets'); { @@ -21,8 +16,7 @@ use_ok('RT::Shredder::Plugin::Tickets'); is(lc $plugin->Type, 'search', 'correct type'); } -init_db(); -create_savepoint('clean'); +$test->create_savepoint('clean'); use_ok('RT::Ticket'); use_ok('RT::Tickets'); @@ -59,11 +53,12 @@ use_ok('RT::Tickets'); ok($has{$pid}, "parent is in the result set"); ok($has{$cid}, "child is in the result set"); - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => \@objs ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); { # create parent and child and link them reqursively to check that we don't hang my $parent = RT::Ticket->new( RT->SystemUser ); @@ -103,11 +98,12 @@ cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint" ok($has{$pid}, "parent is in the result set"); ok($has{$cid}, "child is in the result set"); - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => \@objs ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); { # create parent and child and check functionality of 'apply_query_to_linked' arg my $parent = RT::Ticket->new( RT->SystemUser ); @@ -141,9 +137,10 @@ cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint" ok(!$has{$cid1}, "first child is in the result set"); ok($has{$cid2}, "second child is in the result set"); - my $shredder = shredder_new(); + my $shredder = $test->shredder_new(); $shredder->PutObjects( Objects => \@objs ); $shredder->WipeoutAll; + $test->db_is_valid; my $ticket = RT::Ticket->new( RT->SystemUser ); $ticket->Load( $cid1 ); @@ -151,5 +148,6 @@ cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint" $shredder->PutObjects( Objects => $ticket ); $shredder->WipeoutAll; + $test->db_is_valid; } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); diff --git a/rt/t/shredder/03plugin_users.t b/rt/t/shredder/03plugin_users.t index 131ffa0c3..477f1474f 100644 --- a/rt/t/shredder/03plugin_users.t +++ b/rt/t/shredder/03plugin_users.t @@ -3,17 +3,10 @@ use strict; use warnings; use Test::Deep; -use File::Spec; -use Test::More tests => 21 + 1; # plus one for warnings check -use RT::Test (); -BEGIN { - my $shredder_utils = RT::Test::get_relocatable_file('utils.pl', - File::Spec->curdir()); - require $shredder_utils; -} - +use RT::Test::Shredder tests => 21; +my $test = "RT::Test::Shredder"; -my @ARGS = sort qw(limit status name member_of email replace_relations no_tickets); +my @ARGS = sort qw(limit status name member_of not_member_of email replace_relations no_tickets); use_ok('RT::Shredder::Plugin::Users'); { @@ -37,13 +30,11 @@ use_ok('RT::Shredder::Plugin::Users'); ok(!$status, "bad 'status' arg value"); } -init_db(); - RT::Test->set_rights( { Principal => 'Everyone', Right => [qw(CreateTicket)] }, ); -create_savepoint('clean'); +$test->create_savepoint('clean'); { # Create two users and a ticket. Shred second user and replace relations with first user my ($uidA, $uidB, $msg); @@ -59,6 +50,7 @@ create_savepoint('clean'); my $ticket = RT::Ticket->new( RT::CurrentUser->new($userB) ); ($tid, $trid, $msg) = $ticket->Create( Subject => 'UserB Ticket', Queue => 1 ); ok( $tid, "created new ticket") or diag "error: $msg"; + $ticket->ApplyTransactionBatch; my $transaction = RT::Transaction->new( RT->SystemUser ); $transaction->Load($trid); @@ -71,14 +63,14 @@ create_savepoint('clean'); ($status, $msg) = $plugin->TestArgs( status => 'any', name => 'userB', replace_relations => $uidA ); ok($status, "plugin arguments are ok") or diag "error: $msg"; + my $shredder = $test->shredder_new(); + my @objs; ($status, @objs) = $plugin->Run; ok($status, "executed plugin successfully") or diag "error: @objs"; @objs = RT::Shredder->CastObjectsToRecords( Objects => \@objs ); is(scalar @objs, 1, "one object in the result set"); - my $shredder = shredder_new(); - ($status, $msg) = $plugin->SetResolvers( Shredder => $shredder ); ok($status, "set conflicts resolver") or diag "error: $msg"; @@ -94,4 +86,4 @@ create_savepoint('clean'); $shredder->Wipeout( Object => $ticket ); $shredder->Wipeout( Object => $userA ); } -cmp_deeply( dump_current_and_savepoint('clean'), "current DB equal to savepoint"); +cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint"); diff --git a/rt/t/shredder/utils.pl b/rt/t/shredder/utils.pl deleted file mode 100644 index a3d0cf59a..000000000 --- a/rt/t/shredder/utils.pl +++ /dev/null @@ -1,394 +0,0 @@ - -use strict; -use warnings; - -require File::Copy; -require Cwd; -require RT::Test; - -BEGIN { -### after: push @INC, qw(@RT_LIB_PATH@); - - use RT; - RT->LoadConfig; - RT->InitPluginPaths; - RT->InitClasses; -} - -require RT::Shredder; - -=head1 DESCRIPTION - -RT::Shredder test suite utilities - -=head1 TESTING - -Since RT:Shredder 0.01_03 we have a test suite. You -can run tests and see if everything works as expected -before you try shredder on your actual data. -Tests also help in the development process. - -The test suite uses SQLite databases to store data in individual files, -so you could sun tests on your production servers without risking -damage to your production data. - -You'll want to run the test suite almost every time you install or update -the shredder distribution, especialy if you have local customizations of -the DB schema and/or RT code. - -Tests are one thing you can write even if you don't know much perl, -but want to learn more about RT's internals. New tests are very welcome. - -=head2 WRITING TESTS - -The shredder distribution has several files to help write new tests. - - t/shredder/utils.pl - this file, utilities - t/00skeleton.t - skeleteton .t file for new tests - -All tests follow this algorithm: - - require "t/shredder/utils.pl"; # plug in utilities - init_db(); # create new tmp RT DB and init RT API - # create RT data you want to be always in the RT DB - # ... - create_savepoint('mysp'); # create DB savepoint - # create data you want delete with shredder - # ... - # run shredder on the objects you've created - # ... - # check that shredder deletes things you want - # this command will compare savepoint DB with current - cmp_deeply( dump_current_and_savepoint('mysp'), "current DB equal to savepoint"); - # then you can create another object and delete it, then check again - -Savepoints are named and you can create two or more savepoints. - -=head1 FUNCTIONS - -=head2 RT CONFIG - -=head3 rewrite_rtconfig - -Call this sub after C<RT::LoadConfig>. It changes the RT config -options necessary to switch to a local SQLite database. - -=cut - -sub rewrite_rtconfig -{ - # database - config_set( '$DatabaseType' , 'SQLite' ); - config_set( '$DatabaseHost' , 'localhost' ); - config_set( '$DatabaseRTHost' , 'localhost' ); - config_set( '$DatabasePort' , '' ); - config_set( '$DatabaseUser' , 'rt_user' ); - config_set( '$DatabasePassword' , 'rt_pass' ); - config_set( '$DatabaseRequireSSL' , undef ); - # database file name - config_set( '$DatabaseName' , db_name() ); - - # generic logging - config_set( '$LogToSyslog' , undef ); - config_set( '$LogToScreen' , 'error' ); - config_set( '$LogStackTraces' , 'crit' ); - # logging to standalone file - config_set( '$LogToFile' , 'debug' ); - my $fname = File::Spec->catfile(RT::Test->temp_directory(), test_name() .".log"); - config_set( '$LogToFileNamed' , $fname ); - config_set('@LexiconLanguages', qw(en)); -} - -=head3 config_set - -This sub is a helper used by C<rewrite_rtconfig>. You shouldn't -need to use it elsewhere unless you need to change other RT -configuration variables. - -=cut - -sub config_set { - my $opt = shift; - $opt =~ s/^[\$\%\@]//; - RT->Config->Set($opt, @_) -} - -=head2 DATABASES - -=head3 init_db - -Creates a new RT DB with initial data in a new test tmp dir. -Also runs RT::Init() and RT::InitLogging(). - -This is all you need to call to setup a testing environment -in most situations. - -=cut - -sub init_db -{ - RT::Test->bootstrap_tempdir() unless RT::Test->temp_directory(); - RT::LoadConfig(); - rewrite_rtconfig(); - RT::InitLogging(); - - _init_db(); - - RT::Init(); - $SIG{__WARN__} = sub { $RT::Logger->warning( @_ ); warn @_ }; - $SIG{__DIE__} = sub { $RT::Logger->crit( @_ ) unless $^S; die @_ }; -} - -use IPC::Open2; -sub _init_db -{ - - - foreach ( qw(Type Host Port Name User Password) ) { - $ENV{ "RT_DB_". uc $_ } = RT->Config->Get("Database$_"); - } - my $rt_setup_database = RT::Test::get_relocatable_file( - 'rt-setup-database', (File::Spec->updir(), File::Spec->updir(), 'sbin')); - my $cmd = "$^X $rt_setup_database --action init 2>&1"; - - my ($child_out, $child_in); - my $pid = open2($child_out, $child_in, $cmd); - close $child_in; - my $result = do { local $/; <$child_out> }; - return $result; -} - -=head3 db_name - -Returns the absolute file path to the current DB. -It is <<RT::Test->temp_directory . test_name() .'.db'>>. - -See also the C<test_name> function. - -=cut - -sub db_name { return File::Spec->catfile(RT::Test->temp_directory(), test_name() .".db") } - -=head3 connect_sqlite - -Returns connected DBI DB handle. - -Takes path to sqlite db. - -=cut - -sub connect_sqlite -{ - return DBI->connect("dbi:SQLite:dbname=". shift, "", ""); -} - -=head2 SHREDDER - -=head3 shredder_new - -Creates and returns a new RT::Shredder object. - -=cut - -sub shredder_new -{ - my $obj = RT::Shredder->new; - - my $file = File::Spec->catfile( RT::Test->temp_directory, test_name() .'.XXXX.sql' ); - $obj->AddDumpPlugin( Arguments => { - file_name => $file, - from_storage => 0, - } ); - - return $obj; -} - - -=head2 TEST FILES - -=head3 test_name - -Returns name of the test file running now with file extension and -directory names stripped. - -For example, it returns '00load' for the test file 't/00load.t'. - -=cut - -sub test_name -{ - my $name = $0; - $name =~ s/^.*[\\\/]//; - $name =~ s/\..*$//; - return $name; -} - -=head2 SAVEPOINTS - -=head3 savepoint_name - -Returns the absolute path to the named savepoint DB file. -Takes one argument - savepoint name, by default C<sp>. - -=cut - -sub savepoint_name -{ - my $name = shift || 'sp'; - return File::Spec->catfile( RT::Test->temp_directory, test_name() .".$name.db" ); -} - -=head3 create_savepoint - -Creates savepoint DB from the current DB. -Takes name of the savepoint as argument. - -=head3 restore_savepoint - -Restores current DB to savepoint state. -Takes name of the savepoint as argument. - -=cut - -sub create_savepoint { return __cp_db( db_name() => savepoint_name( shift ) ) } -sub restore_savepoint { return __cp_db( savepoint_name( shift ) => db_name() ) } -sub __cp_db -{ - my( $orig, $dest ) = @_; - RT::Test::__disconnect_rt(); - File::Copy::copy( $orig, $dest ) or die "Couldn't copy '$orig' => '$dest': $!"; - RT::Test::__reconnect_rt(); - return; -} - - -=head2 DUMPS - -=head3 dump_sqlite - -Returns DB dump as a complex hash structure: - { - TableName => { - #id => { - lc_field => 'value', - } - } - } - -Takes named argument C<CleanDates>. If true, clean all date fields from -dump. True by default. - -=cut - -sub dump_sqlite -{ - my $dbh = shift; - my %args = ( CleanDates => 1, @_ ); - - my $old_fhkn = $dbh->{'FetchHashKeyName'}; - $dbh->{'FetchHashKeyName'} = 'NAME_lc'; - - my @tables = $RT::Handle->_TableNames( $dbh ); - - my $res = {}; - foreach my $t( @tables ) { - next if lc($t) eq 'sessions'; - $res->{$t} = $dbh->selectall_hashref("SELECT * FROM $t".dump_sqlite_exceptions($t), 'id'); - clean_dates( $res->{$t} ) if $args{'CleanDates'}; - die $DBI::err if $DBI::err; - } - - $dbh->{'FetchHashKeyName'} = $old_fhkn; - return $res; -} - -=head3 dump_sqlite_exceptions - -If there are parts of the DB which can change from creating and deleting -a queue, skip them when doing the comparison. One example is the global -queue cache attribute on RT::System which will be updated on Queue creation -and can't be rolled back by the shredder. It may actually make sense for -Shredder to be updating this at some point in the future. - -=cut - -sub dump_sqlite_exceptions { - my $table = shift; - - my $special_wheres = { - attributes => " WHERE Name != 'QueueCacheNeedsUpdate'" - }; - - return $special_wheres->{lc $table}||''; - -} - -=head3 dump_current_and_savepoint - -Returns dump of the current DB and of the named savepoint. -Takes one argument - savepoint name. - -=cut - -sub dump_current_and_savepoint -{ - my $orig = savepoint_name( shift ); - die "Couldn't find savepoint file" unless -f $orig && -r _; - my $odbh = connect_sqlite( $orig ); - return ( dump_sqlite( $RT::Handle->dbh, @_ ), dump_sqlite( $odbh, @_ ) ); -} - -=head3 dump_savepoint_and_current - -Returns the same data as C<dump_current_and_savepoint> function, -but in reversed order. - -=cut - -sub dump_savepoint_and_current { return reverse dump_current_and_savepoint(@_) } - -sub clean_dates -{ - my $h = shift; - my $date_re = qr/^\d\d\d\d\-\d\d\-\d\d\s*\d\d\:\d\d(\:\d\d)?$/i; - foreach my $id ( keys %{ $h } ) { - next unless $h->{ $id }; - foreach ( keys %{ $h->{ $id } } ) { - delete $h->{$id}{$_} if $h->{$id}{$_} && - $h->{$id}{$_} =~ /$date_re/; - } - } -} - -=head2 NOTES - -Function that returns debug notes. - -=head3 note_on_fail - -Returns a note about debug info that you can display if tests fail. - -=cut - -sub note_on_fail -{ - my $name = test_name(); - my $tmpdir = RT::Test->temp_directory(); - return <<END; -Some tests in '$0' file failed. -You can find debug info in '$tmpdir' dir. -There should be: - $name.log - RT debug log file - $name.db - latest RT DB used while testing - $name.*.db - savepoint databases -See also perldoc t/shredder/utils.pl for how to use this info. -END -} - -END { - if ( ! RT::Test->builder->is_passing ) { - diag( note_on_fail() ); - } -} - -1; |