import rt 3.8.10
[freeside.git] / rt / t / web / command_line.t
1 #!/usr/bin/perl -w
2
3 use strict;
4 use File::Spec ();
5 use Test::Expect;
6 use RT::Test tests => 295;
7 my ($baseurl, $m) = RT::Test->started_ok;
8
9 use RT::User;
10 use RT::Queue;
11
12 my $rt_tool_path = "$RT::BinPath/rt";
13
14 # {{{  test configuration options
15
16 # config directives:
17 #    (in $CWD/.rtrc)
18 #    - server <URL>          URL to RT server.
19 #    - user <username>       RT username.
20 #    - passwd <passwd>       RT user's password.
21 #    - query <RT Query>      Default RT Query for list action
22 #    - orderby <order>       Default RT order for list action
23 #
24 #    Blank and #-commented lines are ignored.
25
26 # environment variables
27 #    The following environment variables override any corresponding
28 #    values defined in configuration files:
29 #
30 #    - RTUSER
31 $ENV{'RTUSER'} = 'root';
32 #    - RTPASSWD
33 $ENV{'RTPASSWD'} = 'password';
34 #    - RTSERVER
35 $RT::Logger->debug("Connecting to server at ".RT->Config->Get('WebBaseURL'));
36 $ENV{'RTSERVER'} =RT->Config->Get('WebBaseURL') ;
37 #    - RTDEBUG       Numeric debug level. (Set to 3 for full logs.)
38 $ENV{'RTDEBUG'} = '1';
39 #    - RTCONFIG      Specifies a name other than ".rtrc" for the
40 #                    configuration file.
41 #
42 #    - RTQUERY       Default RT Query for rt list
43 #    - RTORDERBY     Default order for rt list
44
45
46 # }}}
47
48 # {{{ test ticket manipulation
49
50 # create a ticket
51 expect_run(
52     command => "$rt_tool_path shell",
53     prompt => 'rt> ',
54     quit => 'quit',
55 );
56 expect_send(q{create -t ticket set subject='new ticket' add cc=foo@example.com}, "Creating a ticket...");
57 expect_like(qr/Ticket \d+ created/, "Created the ticket");
58 expect_handle->before() =~ /Ticket (\d+) created/;
59 my $ticket_id = $1;
60 ok($ticket_id, "Got ticket id=$ticket_id");
61 expect_send(q{create -t ticket set subject='new ticket'}, "Creating a ticket as just a subject...");
62 expect_like(qr/Ticket \d+ created/, "Created the ticket");
63
64 # make sure we can request things as 'rt foo'
65 expect_send(q{rt create -t ticket set subject='rt ticket'}, "Creating a ticket with 'rt create'...");
66 expect_like(qr/Ticket \d+ created/, "Created the ticket");
67
68 # {{{ test queue manipulation
69
70 # creating queues
71 expect_send("create -t queue set Name='NewQueue$$'", 'Creating a queue...');
72 expect_like(qr/Queue \d+ created/, 'Created the queue');
73 expect_handle->before() =~ /Queue (\d+) created/;
74 my $queue_id = $1;
75 ok($queue_id, "Got queue id=$queue_id");
76 # updating users
77 expect_send("edit queue/$queue_id set Name='EditedQueue$$'", 'Editing the queue');
78 expect_like(qr/Queue $queue_id updated/, 'Edited the queue');
79 expect_send("show queue/$queue_id", 'Showing the queue...');
80 expect_like(qr/id: queue\/$queue_id/, 'Saw the queue');
81 expect_like(qr/Name: EditedQueue$$/, 'Saw the modification');
82 TODO: { 
83     todo_skip "Listing non-ticket items doesn't work", 2;
84     expect_send("list -t queue 'id > 0'", 'Listing the queues...');
85     expect_like(qr/$queue_id: EditedQueue$$/, 'Found the queue');
86 }
87
88 # }}}
89
90
91 # Set up a custom field for editing tests
92 my $cf = RT::CustomField->new($RT::SystemUser);
93 my ($val,$msg) = $cf->Create(Name => 'MyCF'.$$, Type => 'FreeformSingle', Queue => $queue_id);
94 ok($val,$msg);
95
96 my $othercf = RT::CustomField->new($RT::SystemUser);
97 ($val,$msg) = $othercf->Create(Name => 'My CF'.$$, Type => 'FreeformSingle', Queue => $queue_id);
98 ok($val,$msg);
99
100 my $multiple_cf = RT::CustomField->new($RT::SystemUser);
101 ($val,$msg) = $multiple_cf->Create(Name => 'MultipleCF'.$$, Type =>
102         'FreeformMultiple', Queue => $queue_id);
103 ok($val,$msg);
104
105
106 # add a comment to ticket
107     expect_send("comment -m 'comment-$$' $ticket_id", "Adding a comment...");
108     expect_like(qr/Message recorded/, "Added the comment");
109     ### should test to make sure it actually got added
110     # add correspondance to ticket (?)
111     expect_send("correspond -m 'correspond-$$' $ticket_id", "Adding correspondence...");
112     expect_like(qr/Message recorded/, "Added the correspondence");
113     ### should test to make sure it actually got added
114
115     my $test_email = RT::Test::get_relocatable_file('lorem-ipsum',
116         (File::Spec->updir(), 'data', 'emails'));
117     # add attachments to a ticket
118     # text attachment
119     check_attachment($test_email);
120     # binary attachment
121     check_attachment($RT::MasonComponentRoot.'/NoAuth/images/bplogo.gif');
122
123 # change a ticket's Owner
124 expect_send("edit ticket/$ticket_id set owner=root", 'Changing owner...');
125 expect_like(qr/Ticket $ticket_id updated/, 'Changed owner');
126 expect_send("show ticket/$ticket_id -f owner", 'Verifying change...');
127 expect_like(qr/Owner: root/, 'Verified change');
128 # change a ticket's Requestor
129 expect_send("edit ticket/$ticket_id set requestors=foo\@example.com", 'Changing Requestor...');
130 expect_like(qr/Ticket $ticket_id updated/, 'Changed Requestor');
131 expect_send("show ticket/$ticket_id -f requestors", 'Verifying change...');
132 expect_like(qr/Requestors: foo\@example.com/, 'Verified change');
133 # change a ticket's Cc
134 expect_send("edit ticket/$ticket_id set cc=bar\@example.com", 'Changing Cc...');
135 expect_like(qr/Ticket $ticket_id updated/, 'Changed Cc');
136 expect_send("show ticket/$ticket_id -f cc", 'Verifying change...');
137 expect_like(qr/Cc: bar\@example.com/, 'Verified change');
138 # change a ticket's priority
139 expect_send("edit ticket/$ticket_id set priority=10", 'Changing priority...');
140 expect_like(qr/Ticket $ticket_id updated/, 'Changed priority');
141 expect_send("show ticket/$ticket_id -f priority", 'Verifying change...');
142 expect_like(qr/Priority: 10/, 'Verified change');
143 # move a ticket to a different queue
144 expect_send("edit ticket/$ticket_id set queue=EditedQueue$$", 'Changing queue...');
145 expect_like(qr/Ticket $ticket_id updated/, 'Changed queue');
146 expect_send("show ticket/$ticket_id -f queue", 'Verifying change...');
147 expect_like(qr/Queue: EditedQueue$$/, 'Verified change');
148 # cannot move ticket to a nonexistent queue
149 expect_send("edit ticket/$ticket_id set queue=nonexistent-$$", 'Changing to nonexistent queue...');
150 expect_like(qr/queue does not exist/i, 'Errored out');
151 expect_send("show ticket/$ticket_id -f queue", 'Verifying lack of change...');
152 expect_like(qr/Queue: EditedQueue$$/, 'Verified lack of change');
153
154 # Test reading and setting custom fields without spaces
155 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking initial value');
156 expect_like(qr/CF\.{myCF$$}:/i, 'Verified initial empty value (CF-x syntax)');
157 expect_send("show ticket/$ticket_id -f CF.{myCF$$}", 'Checking initial value');
158 expect_like(qr/CF\.{myCF$$}:/i, 'Verified initial empty value (CF.{x} syntax)');
159
160 expect_send("edit ticket/$ticket_id set 'CF-myCF$$=VALUE' ", 'Changing CF...');
161 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
162 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value');
163 expect_like(qr/CF\.{myCF$$}: VALUE/i, 'Verified change');
164 # Test setting 0 as value of the custom field
165 expect_send("edit ticket/$ticket_id set 'CF-myCF$$=0' ", 'Changing CF...');
166 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
167 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value');
168 expect_like(qr/CF\.{myCF$$}: 0/i, 'Verified change');
169
170 expect_send("edit ticket/$ticket_id set 'CF.{myCF$$}=VALUE' ",'Changing CF...');
171 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
172 expect_send("show ticket/$ticket_id -f CF.{myCF$$}", 'Checking new value');
173 expect_like(qr/CF\.{myCF$$}: VALUE/i, 'Verified change');
174 # Test setting 0 as value of the custom field
175 expect_send("edit ticket/$ticket_id set 'CF.{myCF$$}=0' ", 'Changing CF...');
176 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
177 expect_send("show ticket/$ticket_id -f CF.{myCF$$}", 'Checking new value');
178 expect_like(qr/CF\.{myCF$$}: 0/i, 'Verified change');
179
180 # Test reading and setting custom fields with spaces
181 expect_send("show ticket/$ticket_id -f 'CF-my CF$$'", 'Checking initial value');
182 expect_like(qr/CF\.{my CF$$}:/i, 'Verified change');
183 expect_send("edit ticket/$ticket_id set 'CF-my CF$$=VALUE' ", 'Changing CF...');
184 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
185 expect_send("show ticket/$ticket_id -f 'CF-my CF$$'", 'Checking new value');
186 expect_like(qr/CF\.{my CF$$}: VALUE/i, 'Verified change');
187 expect_send("ls -l 'id = $ticket_id' -f 'CF-my CF$$'", 'Checking new value');
188 expect_like(qr/CF\.{my CF$$}: VALUE/i, 'Verified change');
189
190 expect_send("show ticket/$ticket_id -f 'CF.{my CF$$}'", 'Checking initial value');
191 expect_like(qr/CF\.{my CF$$}: VALUE/i, 'Verified change');
192 expect_send("edit ticket/$ticket_id set 'CF.{my CF$$}=NEW' ", 'Changing CF...');
193 expect_send("show ticket/$ticket_id -f 'CF.{my CF$$}'", 'Checking new value');
194 expect_like(qr/CF\.{my CF$$}: NEW/i, 'Verified change');
195 expect_send("ls -l 'id = $ticket_id' -f 'CF.{my CF$$}'", 'Checking new value');
196 expect_like(qr/CF\.{my CF$$}: NEW/i, 'Verified change');
197
198 # Test reading and setting single value custom field with commas or quotes
199 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking initial value');
200 expect_like(qr/CF\.{myCF$$}:/i, 'Verified change');
201 expect_send("edit ticket/$ticket_id set CF-myCF$$=1,2,3", 'Changing CF...');
202 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
203 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value');
204 expect_like(qr/CF\.{myCF$$}: 1,2,3/i, 'Verified change');
205 expect_send("edit ticket/$ticket_id set CF-myCF$$=\"1's,2,3\"", 'Changing CF...');
206 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
207 expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value');
208 expect_like(qr/CF\.{myCF$$}: 1's,2,3/i, 'Verified change');
209
210 # Test reading and setting custom fields with multiple values
211 expect_send("show ticket/$ticket_id -f CF-MultipleCF$$", 'Checking initial value');
212 expect_like(qr/CF\.{MultipleCF$$}:/i, 'Verified multiple cf change');
213 expect_send("edit ticket/$ticket_id set CF.{MultipleCF$$}=1,2,3 ", 'Changing CF...');
214 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
215 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
216 expect_like(qr/CF\.{MultipleCF$$}: 1,\s*2,\s*3/i, 'Verified multiple cf change');
217 expect_send("edit ticket/$ticket_id set CF.{MultipleCF$$}=a,b,c ", 'Changing CF...');
218 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
219 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
220 expect_like(qr/CF\.{MultipleCF$$}: a,\s*b,\s*c/i, 'Verified change');
221 expect_send("edit ticket/$ticket_id del CF.{MultipleCF$$}=a", 'Changing CF...');
222 expect_like(qr/Ticket $ticket_id updated/, 'del multiple cf');
223 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
224 expect_like(qr/CF\.{MultipleCF$$}: b,\s*c/i, 'Verified multiple cf change');
225 expect_send("edit ticket/$ticket_id add CF.{MultipleCF$$}=o", 'Changing CF...');
226 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
227 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
228 expect_like(qr/CF\.{MultipleCF$$}: b,\s*c,\s*o/i, 'Verified multiple cf change');
229
230 expect_send("edit ticket/$ticket_id set CF.{MultipleCF$$}=\"'a,b,c'\" ", 'Changing CF...');
231 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
232 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
233 expect_like(qr/CF\.{MultipleCF$$}: 'a,b,c'/i, 'Verified change');
234 expect_send("edit ticket/$ticket_id del CF.{MultipleCF$$}=a", 'Changing CF...');
235 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
236 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
237 expect_like(qr/CF\.{MultipleCF$$}: 'a,b,c'/i, 'Verified change');
238
239 expect_send("edit ticket/$ticket_id set CF.{MultipleCF$$}=q{a,b,c}", 'Changing CF...');
240 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
241 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
242 expect_like(qr/CF\.{MultipleCF$$}: 'a,b,c'/i, 'Verified change');
243 expect_send("edit ticket/$ticket_id del CF.{MultipleCF$$}=a", 'Changing CF...');
244 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
245 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
246 expect_like(qr/CF\.{MultipleCF$$}: 'a,b,c'/i, 'Verified change');
247 expect_send("edit ticket/$ticket_id del CF.{MultipleCF$$}=\"'a,b,c'\"", 'Changing CF...');
248 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
249 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
250 expect_like(qr/CF\.{MultipleCF$$}: \s*$/i, 'Verified change');
251
252 expect_send("edit ticket/$ticket_id set CF.{MultipleCF$$}=\"q{1,2's,3}\"", 'Changing CF...');
253 expect_like(qr/Ticket $ticket_id updated/, 'Changed multiple cf');
254 expect_send("show ticket/$ticket_id -f CF.{MultipleCF$$}", 'Checking new value');
255 expect_like(qr/CF\.{MultipleCF$$}: '1,2\\'s,3'/i, 'Verified change');
256
257 # ...
258 # change a ticket's ...[other properties]...
259 # ...
260 # stall a ticket
261 expect_send("edit ticket/$ticket_id set status=stalled", 'Changing status to "stalled"...');
262 expect_like(qr/Ticket $ticket_id updated/, 'Changed status');
263 expect_send("show ticket/$ticket_id -f status", 'Verifying change...');
264 expect_like(qr/Status: stalled/, 'Verified change');
265 # resolve a ticket
266 expect_send("edit ticket/$ticket_id set status=resolved", 'Changing status to "resolved"...');
267 expect_like(qr/Ticket $ticket_id updated/, 'Changed status');
268 expect_send("show ticket/$ticket_id -f status", 'Verifying change...');
269 expect_like(qr/Status: resolved/, 'Verified change');
270 # try to set status to an illegal value
271 expect_send("edit ticket/$ticket_id set status=quux", 'Changing status to an illegal value...');
272 expect_like(qr/illegal value/i, 'Errored out');
273 expect_send("show ticket/$ticket_id -f status", 'Verifying lack of change...');
274 expect_like(qr/Status: resolved/, 'Verified change');
275
276 # }}}
277
278 # {{{ display
279
280 # show ticket list
281 expect_send("ls -s -t ticket -o +id \"Status='resolved'\"", 'Listing resolved tickets...');
282 expect_like(qr/$ticket_id: new ticket/, 'Found our ticket');
283 # show ticket list verbosely
284 expect_send("ls -l -t ticket -o +id \"Status='resolved'\"", 'Listing resolved tickets verbosely...');
285 expect_like(qr/id: ticket\/$ticket_id/, 'Found our ticket');
286 # show ticket
287 expect_send("show -s -t ticket $ticket_id", 'Showing our ticket...');
288 expect_like(qr/id: ticket\/$ticket_id/, 'Got our ticket');
289 # show ticket history
290 expect_send("show ticket/$ticket_id/history", 'Showing our ticket\'s history...');
291 expect_like(qr/Ticket created by root/, 'Got our history');
292
293 expect_send("show -v ticket/$ticket_id/history", 'Showing our ticket\'s history verbosely...');
294 TODO: {
295     local $TODO = "Cannot show verbose ticket history right now";
296     # show ticket history verbosely
297     expect_like(qr/Ticket created by root/, 'Got our history');
298 }
299 # get attachments from a ticket
300 expect_send("show -s ticket/$ticket_id/attachments", 'Showing ticket attachments...');
301 expect_like(qr/id: ticket\/$ticket_id\/attachments/, 'Got our ticket\'s attachments');
302 expect_like(qr/Attachments: \d+: \(Unnamed\) \(\S+ \/ \d+\w+\)/, 'Our ticket has an attachment');
303 expect_handle->before() =~ /Attachments: (\d+): \(Unnamed\) \((\S+)/;
304 my $attachment_id = $1;
305 my $attachment_type = $2;
306 ok($attachment_id, "Got attachment id=$attachment_id $attachment_type");
307 expect_send("show -s ticket/$ticket_id/attachments/$attachment_id", "Showing attachment $attachment_id...");
308 expect_like(qr/ContentType: $attachment_type/, 'Got the attachment');
309
310 # }}}
311
312 # {{{ test user manipulation
313
314 # creating users
315 expect_send("create -t user set Name='NewUser$$' EmailAddress='fbar$$\@example.com'", 'Creating a user...');
316 expect_like(qr/User \d+ created/, 'Created the user');
317 expect_handle->before() =~ /User (\d+) created/;
318 my $user_id = $1;
319 ok($user_id, "Got user id=$user_id");
320 # updating users
321 expect_send("edit user/$user_id set Name='EditedUser$$'", 'Editing the user');
322 expect_like(qr/User $user_id updated/, 'Edited the user');
323 expect_send("show user/$user_id", 'Showing the user...');
324 expect_like(qr/id: user\/$user_id/, 'Saw the user');
325 expect_like(qr/Name: EditedUser$$/, 'Saw the modification');
326 TODO: { 
327     todo_skip "Listing non-ticket items doesn't work", 2;
328     expect_send("list -t user 'id > 0'", 'Listing the users...');
329     expect_like(qr/$user_id: EditedUser$$/, 'Found the user');
330 }
331
332 # }}}
333
334 # {{{ test group manipulation
335
336 TODO: {
337 todo_skip "Group manipulation doesn't work right now", 8;
338 # creating groups
339 expect_send("create -t group set Name='NewGroup$$'", 'Creating a group...');
340 expect_like(qr/Group \d+ created/, 'Created the group');
341 expect_handle->before() =~ /Group (\d+) created/;
342 my $group_id = $1;
343 ok($group_id, "Got group id=$group_id");
344 # updating groups
345 expect_send("edit group/$group_id set Name='EditedGroup$$'", 'Editing the group');
346 expect_like(qr/Group $group_id updated/, 'Edited the group');
347 expect_send("show group/$group_id", 'Showing the group...');
348 expect_like(qr/id: group\/$group_id/, 'Saw the group');
349 expect_like(qr/Name: EditedGroup$$/, 'Saw the modification');
350 TODO: { 
351     local $TODO = "Listing non-ticket items doesn't work";
352     expect_send("list -t group 'id > 0'", 'Listing the groups...');
353     expect_like(qr/$group_id: EditedGroup$$/, 'Found the group');
354 }
355 }
356
357 # }}}
358
359 TODO: {
360 todo_skip "Custom field manipulation not yet implemented", 8;
361 # {{{ test custom field manipulation
362
363 # creating custom fields
364 expect_send("create -t custom_field set Name='NewCF$$'", 'Creating a custom field...');
365 expect_like(qr/Custom Field \d+ created/, 'Created the custom field');
366 expect_handle->before() =~ /Custom Field (\d+) created/;
367 my $cf_id = $1;
368 ok($cf_id, "Got custom field id=$cf_id");
369 # updating custom fields
370 expect_send("edit cf/$cf_id set Name='EditedCF$$'", 'Editing the custom field');
371 expect_like(qr/Custom field $cf_id updated/, 'Edited the custom field');
372 expect_send("show cf/$cf_id", 'Showing the queue...');
373 expect_like(qr/id: custom_field\/$cf_id/, 'Saw the custom field');
374 expect_like(qr/Name: EditedCF$$/, 'Saw the modification');
375 TODO: { 
376     todo_skip "Listing non-ticket items doesn't work", 2;
377     expect_send("list -t custom_field 'id > 0'", 'Listing the CFs...');
378     expect_like(qr/$cf_id: EditedCF$$/, 'Found the custom field');
379 }
380 }
381
382 # }}}
383
384 # {{{ test merging tickets
385 expect_send("create -t ticket set subject='CLIMergeTest1-$$'", 'Creating first ticket to merge...');
386 expect_like(qr/Ticket \d+ created/, 'Created first ticket');
387 expect_handle->before() =~ /Ticket (\d+) created/;
388 my $merge_ticket_A = $1;
389 ok($merge_ticket_A, "Got first ticket to merge id=$merge_ticket_A");
390 expect_send("create -t ticket set subject='CLIMergeTest2-$$'", 'Creating second ticket to merge...');
391 expect_like(qr/Ticket \d+ created/, 'Created second ticket');
392 expect_handle->before() =~ /Ticket (\d+) created/;
393 my $merge_ticket_B = $1;
394 ok($merge_ticket_B, "Got second ticket to merge id=$merge_ticket_B");
395 expect_send("merge $merge_ticket_B $merge_ticket_A", 'Merging the tickets...');
396 expect_like(qr/Merge completed/, 'Merged the tickets');
397
398 TODO: {
399     local $TODO = "we generate a spurious warning here";
400     $m->no_warnings_ok;
401 }
402
403 expect_send("show ticket/$merge_ticket_A/history", 'Checking merge on first ticket');
404 expect_like(qr/Merged into ticket #$merge_ticket_A by root/, 'Merge recorded in first ticket');
405 expect_send("show ticket/$merge_ticket_B/history", 'Checking merge on second ticket');
406 expect_like(qr/Merged into ticket #$merge_ticket_A by root/, 'Merge recorded in second ticket');
407 # }}}
408
409 # {{{ test taking/stealing tickets
410 {
411     # create a user; give them privileges to take and steal
412     ### TODO: implement 'grant' in the CLI tool; use that here instead.
413     ###       this breaks the abstraction barrier, like, a lot.
414     my $steal_user = RT::User->new($RT::SystemUser);
415     my ($steal_user_id, $msg) = $steal_user->Create( Name => "fooser$$",
416                                           EmailAddress => "fooser$$\@localhost",
417                                           Privileged => 1,
418                                           Password => 'foobar',
419                                         );
420     ok($steal_user_id, "Created the user? $msg");
421     my $steal_queue = RT::Queue->new($RT::SystemUser);
422     my $steal_queue_id;
423     ($steal_queue_id, $msg) = $steal_queue->Create( Name => "Steal$$" );
424     ok($steal_queue_id, "Got the queue? $msg");
425     ok($steal_queue->id, "queue obj has id");
426     my $status;
427     ($status, $msg) = $steal_user->PrincipalObj->GrantRight( Right => 'ShowTicket', Object => $steal_queue );
428     ok($status, "Gave 'ShowTicket' to our user? $msg");
429     ($status, $msg) = $steal_user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $steal_queue );
430     ok($status, "Gave 'OwnTicket' to our user? $msg");
431     ($status, $msg) = $steal_user->PrincipalObj->GrantRight( Right => 'StealTicket', Object => $steal_queue );
432     ok($status, "Gave 'StealTicket' to our user? $msg");
433     ($status, $msg) = $steal_user->PrincipalObj->GrantRight( Right => 'TakeTicket', Object => $steal_queue );
434     ok($status, "Gave 'TakeTicket' to our user? $msg");
435
436     # create a ticket to take/steal
437     expect_send("create -t ticket set queue=$steal_queue_id subject='CLIStealTest-$$'", 'Creating ticket to steal...');
438     expect_like(qr/Ticket \d+ created/, 'Created ticket');
439     expect_handle->before() =~ /Ticket (\d+) created/;
440     my $steal_ticket_id = $1;
441     ok($steal_ticket_id, "Got ticket to steal id=$steal_ticket_id");
442
443     # root takes the ticket
444     expect_send("take $steal_ticket_id", 'root takes the ticket...');
445     expect_like(qr/Owner changed from Nobody to root/, 'root took the ticket');
446     expect_quit();
447
448     # log in as the non-root user
449     $ENV{'RTUSER'} = "fooser$$";
450     $ENV{'RTPASSWD'} = 'foobar';
451     expect_run( command => "$rt_tool_path shell", prompt => 'rt> ', quit => 'quit',);
452
453     # user tries to take the ticket, fails
454     # shouldn't be able to 'take' a ticket which someone else has taken out from
455     # under you; that should produce an error.  should have to explicitly 
456     # 'steal' it back from them.  'steal' can automatically 'take' a ticket,
457     # though.
458     expect_send("take $steal_ticket_id", 'user tries to take the ticket...');
459     expect_like(qr/You can only take tickets that are unowned/, '...and fails.');
460     expect_send("show ticket/$steal_ticket_id -f owner", 'Double-checking...');
461     expect_like(qr/Owner: root/, '...no change.');
462
463     # user steals the ticket
464     expect_send("steal $steal_ticket_id", 'user tries to *steal* the ticket...');
465     expect_like(qr/Owner changed from root to fooser$$/, '...and succeeds!');
466     expect_send("show ticket/$steal_ticket_id -f owner", 'Double-checking...');
467     expect_like(qr/Owner: fooser$$/, '...yup, it worked.');
468     expect_quit();
469
470     # log back in as root
471     $ENV{'RTUSER'} = 'root';
472     $ENV{'RTPASSWD'} = 'password';
473     expect_run( command => "$rt_tool_path shell", prompt => 'rt> ', quit => 'quit',);
474
475     # root steals the ticket back
476     expect_send("steal $steal_ticket_id", 'root steals the ticket back...');
477     expect_like(qr/Owner changed from fooser$$ to root/, '...and succeeds.');
478 }
479 # }}}
480
481 # {{{ test ticket linking
482     my @link_relns = ( 'DependsOn', 'DependedOnBy', 'RefersTo', 'ReferredToBy',
483                        'MemberOf', 'HasMember', );
484     my %display_relns = map { $_ => $_ } @link_relns;
485     $display_relns{HasMember} = 'Members';
486
487     my $link1_id = ok_create_ticket( "LinkTicket1-$$" );
488     my $link2_id = ok_create_ticket( "LinkTicket2-$$" );
489
490     foreach my $reln (@link_relns) {
491         # create link
492         expect_send("link $link1_id $reln $link2_id", "Link by $reln...");
493         expect_like(qr/Created link $link1_id $reln $link2_id/, 'Linked');
494         expect_send("show -s ticket/$link1_id/links", "Checking creation of $reln...");
495         expect_like(qr/$display_relns{$reln}: [\w\d\.\-]+:\/\/[\w\d\.]+\/ticket\/$link2_id/, "Created link $reln");
496
497         # delete link
498         expect_send("link -d $link1_id $reln $link2_id", "Delete $reln...");
499         expect_like(qr/Deleted link $link1_id $reln $link2_id/, 'Deleted');
500         expect_send("show ticket/$link1_id/links", "Checking removal of $reln...");
501         ok( expect_handle->before() !~ /\Q$display_relns{$reln}: \E[\w\d\.\-]+:\/\/[w\d\.]+\/ticket\/$link2_id/, "Removed link $reln" );
502         #expect_unlike(qr/\Q$reln: \E[\w\d\.]+\Q://\E[w\d\.]+\/ticket\/$link2_id/, "Removed link $reln");
503
504     }
505 # }}}
506
507 expect_quit(); # We need to do this ourselves, so that we quit
508                # *before* we tear down the webserver.
509
510 # helper function
511 sub ok_create_ticket {
512     my $subject = shift;
513
514     expect_send("create -t ticket set subject='$subject'", 'Creating ticket...');
515     expect_like(qr/Ticket \d+ created/, "Created ticket '$subject'");
516     expect_handle->before() =~ /Ticket (\d+) created/;
517     my $id = $1;
518     ok($id, "Got ticket id=$id");
519     
520     return $id;
521 }
522
523 # wrap up all the file handling stuff for attachment testing
524 sub check_attachment {
525     my $attachment_path = shift;
526     (my $filename = $attachment_path) =~ s/.*\/(.*)$/$1/;
527     expect_send("comment -m 'attach file' -a $attachment_path $ticket_id", "Adding an attachment ($filename)");
528     expect_like(qr/Message recorded/, "Added the attachment");
529     expect_send("show ticket/$ticket_id/attachments","Finding Attachment");
530     my $attachment_regex = qr/(\d+):\s+$filename/;
531     expect_like($attachment_regex,"Attachment Uploaded");
532     expect_handle->before() =~ $attachment_regex;
533     my $attachment_id = $1;
534     expect_send("show ticket/$ticket_id/attachments/$attachment_id/content","Fetching Attachment");
535     open( my $fh, '<', $attachment_path ) or die "Can't open $attachment_path: $!";
536     my $attachment_content = do { local($/); <$fh> };
537     close $fh;
538     chomp $attachment_content;
539     expect_is($attachment_content,"Attachment contains original text");
540 }
541
542
543
544 1;