import rt 3.6.4
[freeside.git] / rt / lib / t / regression / 14linking.t
index 6fdf614..c8e57ea 100644 (file)
@@ -1,4 +1,4 @@
-use Test::More  tests => '39';
+use Test::More  tests => '70';
 use_ok('RT');
 use_ok('RT::Ticket');
 use_ok('RT::ScripConditions');
@@ -12,7 +12,9 @@ RT::Init();
 use File::Temp qw/tempfile/;
 my ($fh, $filename) = tempfile( UNLINK => 1, SUFFIX => '.rt');
 my $link_scrips_orig = $RT::LinkTransactionsRun1Scrip;
+my $link_acl_chacks_orig = $RT::StrictLinkACL;
 $RT::LinkTransactionsRun1Scrip = 1;
+$RT::StrictLinkACL = 1;
 
 my $condition = RT::ScripCondition->new( $RT::SystemUser );
 $condition->Load('User Defined');
@@ -68,32 +70,123 @@ my $scrip = RT::Scrip->new($RT::SystemUser);
 ok($id, "Scrip created");
 
 my $u1 = RT::User->new($RT::SystemUser);
-($id,$msg) =$u1->Create(Name => "LinkTestUser.$$");
-
+($id,$msg) = $u1->Create(Name => "LinkTestUser.$$");
 ok ($id,$msg);
 
+my $creator = RT::CurrentUser->new($u1->id);
+
 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'CreateTicket');
 ok ($id,$msg);
+
+diag('Create tickets without rights to link') if $ENV{'TEST_VERBOSE'};
+{
+    # on q2 we have no rights, yet
+    my $parent = RT::Ticket->new( $RT::SystemUser );
+    ($id,$tid,$msg) = $parent->Create( Subject => 'Link test 1', Queue => $q2->id );
+    ok($id,$msg);
+    my $child = RT::Ticket->new( $creator );
+    ($id,$tid,$msg) = $child->Create( Subject => 'Link test 1', Queue => $q1->id, MemberOf => $parent->id );
+    ok($id,$msg);
+    $child->CurrentUser( $RT::SystemUser );
+    is($child->_Links('Base')->Count, 0, 'link was not created, no permissions');
+    is($child->_Links('Target')->Count, 0, 'link was not create, no permissions');
+}
+
+diag('Create tickets with rights checks on one end of a link') if $ENV{'TEST_VERBOSE'};
+{
+    # on q2 we have no rights, but use checking one only on thing
+    local $RT::StrictLinkACL = 0;
+    my $parent = RT::Ticket->new( $RT::SystemUser );
+    ($id,$tid,$msg) = $parent->Create( Subject => 'Link test 1', Queue => $q2->id );
+    ok($id,$msg);
+    my $child = RT::Ticket->new( $creator );
+    ($id,$tid,$msg) = $child->Create( Subject => 'Link test 1', Queue => $q1->id, MemberOf => $parent->id );
+    ok($id,$msg);
+    $child->CurrentUser( $RT::SystemUser );
+    is($child->_Links('Base')->Count, 1, 'link was created');
+    is($child->_Links('Target')->Count, 0, 'link was created only one');
+    # no scrip run on second ticket accroding to config option
+    is(link_count($filename), 0, "scrips ok"); 
+}
+
 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'ModifyTicket');
 ok ($id,$msg);
 
-my $tid;
+diag('try to add link without rights') if $ENV{'TEST_VERBOSE'};
+{
+    # on q2 we have no rights, yet
+    my $parent = RT::Ticket->new( $RT::SystemUser );
+    ($id,$tid,$msg) = $parent->Create( Subject => 'Link test 1', Queue => $q2->id );
+    ok($id,$msg);
+    my $child = RT::Ticket->new( $creator );
+    ($id,$tid,$msg) = $child->Create( Subject => 'Link test 1', Queue => $q1->id );
+    ok($id,$msg);
+    my ($id, $msg) = $child->AddLink(Type => 'MemberOf', Target => $parent->id);
+    ok(!$id, $msg);
+    is(link_count($filename), 0, "scrips ok");
+    $child->CurrentUser( $RT::SystemUser );
+    is($child->_Links('Base')->Count, 0, 'link was not created, no permissions');
+    is($child->_Links('Target')->Count, 0, 'link was not create, no permissions');
+}
 
-my $creator = RT::CurrentUser->new($u1->id);
+diag('add link with rights only on base') if $ENV{'TEST_VERBOSE'};
+{
+    # on q2 we have no rights, but use checking one only on thing
+    local $RT::StrictLinkACL = 0;
+    my $parent = RT::Ticket->new( $RT::SystemUser );
+    ($id,$tid,$msg) = $parent->Create( Subject => 'Link test 1', Queue => $q2->id );
+    ok($id,$msg);
+    my $child = RT::Ticket->new( $creator );
+    ($id,$tid,$msg) = $child->Create( Subject => 'Link test 1', Queue => $q1->id );
+    ok($id,$msg);
+    my ($id, $msg) = $child->AddLink(Type => 'MemberOf', Target => $parent->id);
+    ok($id, $msg);
+    is(link_count($filename), 1, "scrips ok");
+    $child->CurrentUser( $RT::SystemUser );
+    is($child->_Links('Base')->Count, 1, 'link was created');
+    is($child->_Links('Target')->Count, 0, 'link was created only one');
+    $child->CurrentUser( $creator );
+
+    # turn off feature and try to delete link, we should fail
+    $RT::StrictLinkACL = 1;
+    my ($id, $msg) = $child->AddLink(Type => 'MemberOf', Target => $parent->id);
+    ok(!$id, $msg);
+    is(link_count($filename), 1, "scrips ok");
+    $child->CurrentUser( $RT::SystemUser );
+    $child->_Links('Base')->_DoCount;
+    is($child->_Links('Base')->Count, 1, 'link was not deleted');
+    $child->CurrentUser( $creator );
+
+    # try to delete link, we should success as feature is active
+    $RT::StrictLinkACL = 0;
+    my ($id, $msg) = $child->DeleteLink(Type => 'MemberOf', Target => $parent->id);
+    ok($id, $msg);
+    is(link_count($filename), 0, "scrips ok");
+    $child->CurrentUser( $RT::SystemUser );
+    $child->_Links('Base')->_DoCount;
+    is($child->_Links('Base')->Count, 0, 'link was deleted');
+}
 
+my $tid;
 my $ticket = RT::Ticket->new( $creator);
 ok($ticket->isa('RT::Ticket'));
 ($id,$tid, $msg) = $ticket->Create(Subject => 'Link test 1', Queue => $q1->id);
 ok ($id,$msg);
 
+diag('try link to itself') if $ENV{'TEST_VERBOSE'};
+{
+    my ($id, $msg) = $ticket->AddLink(Type => 'RefersTo', Target => $ticket->id);
+    ok(!$id, $msg);
+    is(link_count($filename), 0, "scrips ok");
+}
 
 my $ticket2 = RT::Ticket->new($RT::SystemUser);
 ($id, $tid, $msg) = $ticket2->Create(Subject => 'Link test 2', Queue => $q2->id);
 ok ($id, $msg);
-
 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
 ok(!$id,$msg);
 ok(link_count($filename) == 0, "scrips ok");
+
 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'CreateTicket');
 ok ($id,$msg);
 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'ModifyTicket');
@@ -104,6 +197,9 @@ ok(link_count($filename) == 1, "scrips ok");
 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => -1);
 ok(!$id,$msg);
 ok(link_count($filename) == 1, "scrips ok");
+($id,$msg) = $ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
+ok($id,$msg);
+is(link_count($filename), 1, "scrips ok");
 
 my $transactions = $ticket2->Transactions;
 $transactions->Limit( FIELD => 'Type', VALUE => 'AddLink' );
@@ -121,6 +217,7 @@ ok( $transactions->First->Field eq 'ReferredToBy');
 ok( $transactions->First->OldValue eq $ticket->URI );
 
 $RT::LinkTransactionsRun1Scrip = 0;
+
 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
 ok($id,$msg);
 ok(link_count($filename) == 2, "scrips ok");
@@ -130,6 +227,9 @@ ok(link_count($filename) == 0, "scrips ok");
 
 # restore
 $RT::LinkTransactionsRun1Scrip = $link_scrips_orig;
+$RT::StrictLinkACL = $link_acl_checks_orig;
+
+exit(0);
 
 sub link_count {