rt 4.2.14 (#13852)
[freeside.git] / rt / t / api / ticket.t
1
2 use strict;
3 use warnings;
4 use RT;
5 use RT::Test tests => undef;
6
7
8 {
9
10 use_ok ('RT::Queue');
11 ok(my $testqueue = RT::Queue->new(RT->SystemUser));
12 ok($testqueue->Create( Name => 'ticket tests'));
13 isnt($testqueue->Id , 0);
14 use_ok('RT::CustomField');
15 ok(my $testcf = RT::CustomField->new(RT->SystemUser));
16 my ($ret, $cmsg) = $testcf->Create( Name => 'selectmulti',
17                     Queue => $testqueue->id,
18                                Type => 'SelectMultiple');
19 ok($ret,"Created the custom field - ".$cmsg);
20 ($ret,$cmsg) = $testcf->AddValue ( Name => 'Value1',
21                         SortOrder => '1',
22                         Description => 'A testing value');
23
24 ok($ret, "Added a value - ".$cmsg);
25
26 ok($testcf->AddValue ( Name => 'Value2',
27                         SortOrder => '2',
28                         Description => 'Another testing value'));
29 ok($testcf->AddValue ( Name => 'Value3',
30                         SortOrder => '3',
31                         Description => 'Yet Another testing value'));
32                        
33 is($testcf->Values->Count , 3);
34
35 use_ok('RT::Ticket');
36
37 my $u = RT::User->new(RT->SystemUser);
38 $u->Load("root");
39 ok ($u->Id, "Found the root user");
40 ok(my $t = RT::Ticket->new(RT->SystemUser));
41 ok(my ($id, $msg) = $t->Create( Queue => $testqueue->Id,
42                Subject => 'Testing',
43                Owner => $u->Id
44               ));
45 isnt($id , 0);
46 is ($t->OwnerObj->Id , $u->Id, "Root is the ticket owner");
47 ok(my ($cfv, $cfm) =$t->AddCustomFieldValue(Field => $testcf->Id,
48                            Value => 'Value1'));
49 isnt($cfv , 0, "Custom field creation didn't return an error: $cfm");
50 is($t->CustomFieldValues($testcf->Id)->Count , 1);
51 ok($t->CustomFieldValues($testcf->Id)->First &&
52     $t->CustomFieldValues($testcf->Id)->First->Content eq 'Value1');
53
54 ok(my ($cfdv, $cfdm) = $t->DeleteCustomFieldValue(Field => $testcf->Id,
55                         Value => 'Value1'));
56 isnt ($cfdv , 0, "Deleted a custom field value: $cfdm");
57 is($t->CustomFieldValues($testcf->Id)->Count , 0);
58
59 ok(my $t2 = RT::Ticket->new(RT->SystemUser));
60 ok($t2->Load($id));
61 is($t2->Subject, 'Testing');
62 is($t2->QueueObj->Id, $testqueue->id);
63 is($t2->OwnerObj->Id, $u->Id);
64
65 my $t3 = RT::Ticket->new(RT->SystemUser);
66 my ($id3, $msg3) = $t3->Create( Queue => $testqueue->Id,
67                                 Subject => 'Testing',
68                                 Owner => $u->Id);
69 my ($cfv1, $cfm1) = $t->AddCustomFieldValue(Field => $testcf->Id,
70  Value => 'Value1');
71 isnt($cfv1 , 0, "Adding a custom field to ticket 1 is successful: $cfm");
72 my ($cfv2, $cfm2) = $t3->AddCustomFieldValue(Field => $testcf->Id,
73  Value => 'Value2');
74 isnt($cfv2 , 0, "Adding a custom field to ticket 2 is successful: $cfm");
75 my ($cfv3, $cfm3) = $t->AddCustomFieldValue(Field => $testcf->Id,
76  Value => 'Value3');
77 isnt($cfv3 , 0, "Adding a custom field to ticket 1 is successful: $cfm");
78 is($t->CustomFieldValues($testcf->Id)->Count , 2,
79    "This ticket has 2 custom field values");
80 is($t3->CustomFieldValues($testcf->Id)->Count , 1,
81    "This ticket has 1 custom field value");
82
83
84 }
85
86 {
87
88
89 ok(require RT::Ticket, "Loading the RT::Ticket library");
90
91
92 }
93
94 {
95
96 my $t = RT::Ticket->new(RT->SystemUser);
97
98 ok( $t->Create(Queue => 'General', Due => '2002-05-21 00:00:00', ReferredToBy => 'http://www.cpan.org', RefersTo => 'http://fsck.com', Subject => 'This is a subject'), "Ticket Created");
99
100 ok ( my $id = $t->Id, "Got ticket id");
101 like ($t->RefersTo->First->Target , qr/fsck.com/, "Got refers to");
102 like ($t->ReferredToBy->First->Base , qr/cpan.org/, "Got referredtoby");
103 ok (!$t->ResolvedObj->IsSet, "It hasn't been resolved");
104
105
106 }
107
108 {
109
110 my $ticket = RT::Ticket->new(RT->SystemUser);
111 my ($id, $msg) = $ticket->Create(Subject => "Foo",
112                 Owner => RT->SystemUser->Id,
113                 Status => 'open',
114                 Requestor => ['jesse@example.com'],
115                 Queue => '1'
116                 );
117 ok ($id, "Ticket $id was created");
118 ok(my $group = $ticket->RoleGroup('Requestor'));
119 ok ($group->Id, "Found the requestors object for this ticket");
120
121 ok(my $jesse = RT::User->new(RT->SystemUser), "Creating a jesse rt::user");
122 $jesse->LoadByEmail('jesse@example.com');
123 ok($jesse->Id,  "Found the jesse rt user");
124
125
126 ok ($ticket->IsWatcher(Type => 'Requestor', PrincipalId => $jesse->PrincipalId), "The ticket actually has jesse at fsck.com as a requestor");
127 ok (my ($add_id, $add_msg) = $ticket->AddWatcher(Type => 'Requestor', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
128 ok ($add_id, "Add succeeded: ($add_msg)");
129 ok(my $bob = RT::User->new(RT->SystemUser), "Creating a bob rt::user");
130 $bob->LoadByEmail('bob@fsck.com');
131 ok($bob->Id,  "Found the bob rt user");
132 ok ($ticket->IsWatcher(Type => 'Requestor', PrincipalId => $bob->PrincipalId), "The ticket actually has bob at fsck.com as a requestor");
133 ok ( ($add_id, $add_msg) = $ticket->DeleteWatcher(Type =>'Requestor', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
134 ok (!$ticket->IsWatcher(Type => 'Requestor', PrincipalId => $bob->PrincipalId), "The ticket no longer has bob at fsck.com as a requestor");
135
136
137 $group = $ticket->RoleGroup('Cc');
138 ok ($group->Id, "Found the cc object for this ticket");
139 $group = $ticket->RoleGroup('AdminCc');
140 ok ($group->Id, "Found the AdminCc object for this ticket");
141 $group = $ticket->RoleGroup('Owner');
142 ok ($group->Id, "Found the Owner object for this ticket");
143 ok($group->HasMember(RT->SystemUser->UserObj->PrincipalObj), "the owner group has the member 'RT_System'");
144
145
146 }
147
148 {
149
150 my $t = RT::Ticket->new(RT->SystemUser);
151 ok($t->Create(Queue => 'general', Subject => 'SquelchTest', SquelchMailTo => 'nobody@example.com'));
152
153 my @returned = $t->SquelchMailTo();
154 is($#returned, 0, "The ticket has one squelched recipients");
155
156 my ($ret, $msg) = $t->UnsquelchMailTo('nobody@example.com');
157 ok($ret, "Removed nobody as a squelched recipient - ".$msg);
158 @returned = $t->SquelchMailTo();
159 is($#returned, -1, "The ticket has no squelched recipients". join(',',@returned));
160
161
162
163 @returned = $t->SquelchMailTo('nobody@example.com');
164 is($#returned, 0, "The ticket has one squelched recipients");
165
166 my @names = $t->Attributes->Names;
167 is(shift @names, 'SquelchMailTo', "The attribute we have is SquelchMailTo");
168 @returned = $t->SquelchMailTo('nobody@example.com');
169
170
171 is($#returned, 0, "The ticket has one squelched recipients");
172
173 @names = $t->Attributes->Names;
174 is(shift @names, 'SquelchMailTo', "The attribute we have is SquelchMailTo");
175
176
177 ($ret, $msg) = $t->UnsquelchMailTo('nobody@example.com');
178 ok($ret, "Removed nobody as a squelched recipient - ".$msg);
179 @returned = $t->SquelchMailTo();
180 is($#returned, -1, "The ticket has no squelched recipients". join(',',@returned));
181
182 @returned = $t->SquelchMailTo('somebody@example.com','nobody@example.com');
183 is($#returned, 1, "The ticket has two squelched recipients, multiple args");
184
185 @returned = $t->SquelchMailTo('third@example.com');
186 is($#returned, 2, "The ticket has three squelched recipients, additive calls");
187
188 my $t2 = RT::Ticket->new(RT->SystemUser);
189 ok($t2->Create(Queue => 'general', Subject => 'SquelchTest', SquelchMailTo => [ 'nobody@example.com', 'test@example.com' ]));
190 my @returned2 = $t2->SquelchMailTo();
191 is($#returned2,1, "The ticket has two squelched recipients");
192
193 $t2->SquelchMailTo('test@example.com');
194 my @returned3 = $t2->SquelchMailTo();
195 is($#returned2,1, "The ticket still has two squelched recipients, no duplicate squelchers");
196
197 }
198
199 {
200
201 my $t1 = RT::Ticket->new(RT->SystemUser);
202 $t1->Create ( Subject => 'Merge test 1', Queue => 'general', Requestor => 'merge1@example.com');
203 my $t1id = $t1->id;
204 my $t2 = RT::Ticket->new(RT->SystemUser);
205 $t2->Create ( Subject => 'Merge test 2', Queue => 'general', Requestor => 'merge2@example.com');
206 my $t2id = $t2->id;
207 my ($msg, $val) = $t1->MergeInto($t2->id);
208 ok ($msg,$val);
209 $t1 = RT::Ticket->new(RT->SystemUser);
210 is ($t1->id, undef, "ok. we've got a blank ticket1");
211 $t1->Load($t1id);
212
213 is ($t1->id, $t2->id);
214
215 is ($t1->Requestors->MembersObj->Count, 2);
216
217
218
219 }
220
221 diag "Test owner changes";
222 {
223
224 my $root = RT::User->new(RT->SystemUser);
225 $root->Load('root');
226 ok ($root->Id, "Loaded the root user");
227 my $t = RT::Ticket->new(RT->SystemUser);
228 my ($val, $msg) = $t->Create( Subject => 'Owner test 1', Queue => 'General');
229 ok( $t->Id, "Created a new ticket with id $val: $msg");
230
231 ($val, $msg) = $t->SetOwner('bogususer');
232 ok( !$val, "Can't set owner to bogus user");
233 is( $msg, "That user does not exist", "Got message: $msg");
234
235 ($val, $msg) = $t->SetOwner('root');
236 is ($t->OwnerObj->Name, 'root' , "Root owns the ticket");
237
238 ($val, $msg) = $t->SetOwner('root');
239 ok( !$val, "User already owns ticket");
240 is( $msg, "That user already owns that ticket", "Got message: $msg");
241
242 $t->Steal();
243 is ($t->OwnerObj->id, RT->SystemUser->id , "SystemUser owns the ticket");
244 my $txns = RT::Transactions->new(RT->SystemUser);
245 $txns->OrderBy(FIELD => 'id', ORDER => 'DESC');
246 $txns->Limit(FIELD => 'ObjectId', VALUE => $t->Id);
247 $txns->Limit(FIELD => 'ObjectType', VALUE => 'RT::Ticket');
248 $txns->Limit(FIELD => 'Type', OPERATOR => '!=',  VALUE => 'EmailRecord');
249
250 my $steal  = $txns->First;
251 is($steal->OldValue , $root->Id , "Stolen from root");
252 is($steal->NewValue , RT->SystemUser->Id , "Stolen by the systemuser");
253
254 ok(my $user1 = RT::User->new(RT->SystemUser), "Creating a user1 rt::user");
255 ($val, $msg) = $user1->Create(Name => 'User1', EmailAddress => 'user1@example.com');
256 ok( $val, "Created new user with id: $val");
257 ok( $user1->Id,  "Found the user1 rt user");
258
259 my $t1 = RT::Ticket->new($user1);
260 ($val, $msg) = $t1->Load($t->Id);
261 ok( $t1->Id, "Loaded ticket with id $val");
262
263 ($val, $msg) = $t1->SetOwner('root');
264 ok( !$val, "user1 can't set owner to root: $msg");
265 is ($t->OwnerObj->id, RT->SystemUser->id , "SystemUser still owns ticket " . $t1->Id);
266
267 my $queue = RT::Queue->new(RT->SystemUser);
268 $queue->Load("General");
269
270 ($val, $msg) = $user1->PrincipalObj->GrantRight(
271          Object => $queue, Right => 'ModifyTicket'
272      );
273
274 ($val, $msg) = $t1->SetOwner('root');
275 ok( !$val, "With ModifyTicket user1 can't set owner to root: $msg");
276 is ($t->OwnerObj->id, RT->SystemUser->id , "SystemUser still owns ticket " . $t1->Id);
277
278 ($val, $msg) = $user1->PrincipalObj->GrantRight(
279          Object => $queue, Right => 'ReassignTicket'
280      );
281
282 ($val, $msg) = $t1->SetOwner('root');
283 ok( $val, "With ReassignTicket user1 reassigned ticket " . $t1->Id . " to root: $msg");
284 is ($t1->OwnerObj->Name, 'root' , "Root owns ticket " . $t1->Id);
285
286 }
287
288 {
289
290 my $tt = RT::Ticket->new(RT->SystemUser);
291 my ($id, $tid, $msg)= $tt->Create(Queue => 'general',
292             Subject => 'test');
293 ok($id, $msg);
294 is($tt->Status, 'new', "New ticket is created as new");
295
296 ($id, $msg) = $tt->SetStatus('open');
297 ok($id, $msg);
298 like($msg, qr/open/i, "Status message is correct");
299 ($id, $msg) = $tt->SetStatus('resolved');
300 ok($id, $msg);
301 like($msg, qr/resolved/i, "Status message is correct");
302 ($id, $msg) = $tt->SetStatus('resolved');
303 ok(!$id,$msg);
304
305 my $dep = RT::Ticket->new( RT->SystemUser );
306 my ( $dep_id, undef, $dep_msg ) = $dep->Create(
307     Queue          => 'general',
308     Subject        => 'dep ticket',
309     'DependedOnBy' => $tt->id,
310 );
311 ok( $dep->id, $dep_msg );
312
313 ($id, $msg) = $tt->SetStatus('rejected');
314 ok( $id, $msg );
315
316 }
317
318 diag("Test ticket types with different cases");
319 {
320     my $t = RT::Ticket->new(RT->SystemUser);
321     my ($ok) = $t->Create(
322         Queue => 'general',
323         Subject => 'type test',
324         Type => 'Ticket',
325     );
326     ok($ok, "Ticket allows passing upper-case Ticket as type during Create");
327     is($t->Type, "ticket", "Ticket type is lowercased during create");
328
329     ($ok) = $t->SetType("REMINDER");
330     ok($ok, "Ticket allows passing upper-case REMINDER to SetType");
331     is($t->Type, "reminder", "Ticket type is lowercased during set");
332
333     ($ok) = $t->SetType("OTHER");
334     ok($ok, "Allows setting Type to non-RT types");
335     is($t->Type, "OTHER", "Non-RT types are case-insensitive");
336
337     ($ok) = $t->Create(
338         Queue => 'general',
339         Subject => 'type test',
340         Type => 'Approval',
341     );
342     ok($ok, "Tickets can be created with an upper-case Approval type");
343     is($t->Type, "approval", "Approvals, the third and final internal type, are also lc'd during Create");
344 }
345
346 done_testing;