import rt 3.4.6
[freeside.git] / rt / lib / t / regression / 14linking.t
1 use Test::More  tests => '39';
2 use_ok('RT');
3 use_ok('RT::Ticket');
4 use_ok('RT::ScripConditions');
5 use_ok('RT::ScripActions');
6 use_ok('RT::Template');
7 use_ok('RT::Scrips');
8 use_ok('RT::Scrip');
9 RT::LoadConfig();
10 RT::Init();
11
12 use File::Temp qw/tempfile/;
13 my ($fh, $filename) = tempfile( UNLINK => 1, SUFFIX => '.rt');
14 my $link_scrips_orig = $RT::LinkTransactionsRun1Scrip;
15 $RT::LinkTransactionsRun1Scrip = 1;
16
17 my $condition = RT::ScripCondition->new( $RT::SystemUser );
18 $condition->Load('User Defined');
19 ok($condition->id);
20 my $action = RT::ScripAction->new( $RT::SystemUser );
21 $action->Load('User Defined');
22 ok($action->id);
23 my $template = RT::Template->new( $RT::SystemUser );
24 $template->Load('Blank');
25 ok($template->id);
26
27 my $q1 = RT::Queue->new($RT::SystemUser);
28 my ($id,$msg) = $q1->Create(Name => "LinkTest1.$$");
29 ok ($id,$msg);
30 my $q2 = RT::Queue->new($RT::SystemUser);
31 ($id,$msg) = $q2->Create(Name => "LinkTest2.$$");
32 ok ($id,$msg);
33
34 my $commit_code = <<END;
35 open(FILE, "<$filename");
36 my \$data = <FILE>;
37 chomp \$data;
38 close FILE;
39 open(FILE, ">$filename");
40 if (\$self->TransactionObj->Type eq 'AddLink') {
41     print FILE \$data+1, "\n";
42 }
43 else {
44     print FILE \$data-1, "\n";
45 }
46 close FILE;
47 1;
48 END
49
50 my $Scrips = RT::Scrips->new( $RT::SystemUser );
51 $Scrips->UnLimit;
52 while ( my $Scrip = $Scrips->Next ) {
53     $Scrip->Delete if $Scrip->Description =~ /Add or Delete Link \d+/;
54 }
55
56
57 my $scrip = RT::Scrip->new($RT::SystemUser);
58 ($id,$msg) = $scrip->Create( Description => "Add or Delete Link $$",
59                           ScripCondition => $condition->id,
60                           ScripAction    => $action->id,
61                           Template       => $template->id,
62                           Stage          => 'TransactionCreate',
63                           Queue          => 0,
64                   CustomIsApplicableCode => '$self->TransactionObj->Type =~ /(Add|Delete)Link/;',
65                        CustomPrepareCode => '1;',
66                        CustomCommitCode  => $commit_code,
67                            );
68 ok($id, "Scrip created");
69
70 my $u1 = RT::User->new($RT::SystemUser);
71 ($id,$msg) =$u1->Create(Name => "LinkTestUser.$$");
72
73 ok ($id,$msg);
74
75 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'CreateTicket');
76 ok ($id,$msg);
77 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q1, Right => 'ModifyTicket');
78 ok ($id,$msg);
79
80 my $tid;
81
82 my $creator = RT::CurrentUser->new($u1->id);
83
84 my $ticket = RT::Ticket->new( $creator);
85 ok($ticket->isa('RT::Ticket'));
86 ($id,$tid, $msg) = $ticket->Create(Subject => 'Link test 1', Queue => $q1->id);
87 ok ($id,$msg);
88
89
90 my $ticket2 = RT::Ticket->new($RT::SystemUser);
91 ($id, $tid, $msg) = $ticket2->Create(Subject => 'Link test 2', Queue => $q2->id);
92 ok ($id, $msg);
93
94 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
95 ok(!$id,$msg);
96 ok(link_count($filename) == 0, "scrips ok");
97 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'CreateTicket');
98 ok ($id,$msg);
99 ($id,$msg) = $u1->PrincipalObj->GrantRight ( Object => $q2, Right => 'ModifyTicket');
100 ok ($id,$msg);
101 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
102 ok($id,$msg);
103 ok(link_count($filename) == 1, "scrips ok");
104 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => -1);
105 ok(!$id,$msg);
106 ok(link_count($filename) == 1, "scrips ok");
107
108 my $transactions = $ticket2->Transactions;
109 $transactions->Limit( FIELD => 'Type', VALUE => 'AddLink' );
110 ok( $transactions->Count == 1, "Transaction found in other ticket" );
111 ok( $transactions->First->Field eq 'ReferredToBy');
112 ok( $transactions->First->NewValue eq $ticket->URI );
113
114 ($id,$msg) =$ticket->DeleteLink(Type => 'RefersTo', Target => $ticket2->id);
115 ok($id,$msg);
116 ok(link_count($filename) == 0, "scrips ok");
117 $transactions = $ticket2->Transactions;
118 $transactions->Limit( FIELD => 'Type', VALUE => 'DeleteLink' );
119 ok( $transactions->Count == 1, "Transaction found in other ticket" );
120 ok( $transactions->First->Field eq 'ReferredToBy');
121 ok( $transactions->First->OldValue eq $ticket->URI );
122
123 $RT::LinkTransactionsRun1Scrip = 0;
124 ($id,$msg) =$ticket->AddLink(Type => 'RefersTo', Target => $ticket2->id);
125 ok($id,$msg);
126 ok(link_count($filename) == 2, "scrips ok");
127 ($id,$msg) =$ticket->DeleteLink(Type => 'RefersTo', Target => $ticket2->id);
128 ok($id,$msg);
129 ok(link_count($filename) == 0, "scrips ok");
130
131 # restore
132 $RT::LinkTransactionsRun1Scrip = $link_scrips_orig;
133
134 sub link_count {
135
136     my $file = shift;
137     open(FILE, "<$file");
138     my $data = <FILE>;
139     chomp $data;
140     return $data + 0;
141     close FILE;
142
143 }