first pass RT4 merge, RT#13852
[freeside.git] / rt / t / web / ticket_owner.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use RT::Test nodata => 1, tests => 105;
7
8 my $queue = RT::Test->load_or_create_queue( Name => 'Regression' );
9 ok $queue && $queue->id, 'loaded or created queue';
10
11 my $user_a = RT::Test->load_or_create_user(
12     Name => 'user_a', Password => 'password',
13 );
14 ok $user_a && $user_a->id, 'loaded or created user';
15
16 my $user_b = RT::Test->load_or_create_user(
17     Name => 'user_b', Password => 'password',
18 );
19 ok $user_b && $user_b->id, 'loaded or created user';
20
21 my ($baseurl, $agent_a) = RT::Test->started_ok;
22
23 ok( RT::Test->set_rights(
24     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket ReplyToTicket)] },
25     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
26 ), 'set rights');
27
28 ok $agent_a->login('user_a', 'password'), 'logged in as user A';
29
30 diag "current user has no right to own, nobody selected as owner on create";
31 {
32     $agent_a->get_ok('/', 'open home page');
33     $agent_a->form_name('CreateTicketInQueue');
34     $agent_a->select( 'Queue', $queue->id );
35     $agent_a->submit;
36
37     $agent_a->content_contains('Create a new ticket', 'opened create ticket page');
38     my $form = $agent_a->form_name('TicketCreate');
39     is $form->value('Owner'), RT->Nobody->id, 'correct owner selected';
40     ok !grep($_ == $user_a->id, $form->find_input('Owner')->possible_values),
41         'user A can not own tickets';
42     $agent_a->submit;
43
44     $agent_a->content_like(qr/Ticket \d+ created in queue/i, 'created ticket');
45     my ($id) = ($agent_a->content =~ /Ticket (\d+) created in queue/);
46     ok $id, 'found id of the ticket';
47
48     my $ticket = RT::Ticket->new( RT->SystemUser );
49     $ticket->Load( $id );
50     ok $ticket->id, 'loaded the ticket';
51     is $ticket->Owner, RT->Nobody->id, 'correct owner';
52 }
53
54 diag "user can chose owner of a new ticket";
55 {
56     $agent_a->get_ok('/', 'open home page');
57     $agent_a->form_name('CreateTicketInQueue');
58     $agent_a->select( 'Queue', $queue->id );
59     $agent_a->submit;
60
61     $agent_a->content_contains('Create a new ticket', 'opened create ticket page');
62     my $form = $agent_a->form_name('TicketCreate');
63     is $form->value('Owner'), RT->Nobody->id, 'correct owner selected';
64
65     ok grep($_ == $user_b->id,  $form->find_input('Owner')->possible_values),
66         'user B is listed as potential owner';
67     $agent_a->select('Owner', $user_b->id);
68     $agent_a->submit;
69
70     $agent_a->content_like(qr/Ticket \d+ created in queue/i, 'created ticket');
71     my ($id) = ($agent_a->content =~ /Ticket (\d+) created in queue/);
72     ok $id, 'found id of the ticket';
73
74     my $ticket = RT::Ticket->new( RT->SystemUser );
75     $ticket->Load( $id );
76     ok $ticket->id, 'loaded the ticket';
77     is $ticket->Owner, $user_b->id, 'correct owner';
78 }
79
80 my $agent_b = RT::Test::Web->new;
81 ok $agent_b->login('user_b', 'password'), 'logged in as user B';
82
83 diag "user A can not change owner after create";
84 {
85     my $ticket = RT::Ticket->new( $user_a );
86     my ($id, $txn, $msg) = $ticket->Create(
87         Queue => $queue->id,
88         Owner => $user_b->id,
89         Subject => 'test',
90     );
91     ok $id, 'created a ticket #'. $id or diag "error: $msg";
92     is $ticket->Owner, $user_b->id, 'correct owner';
93
94     # try the following group of tests twice with different agents(logins)
95     my $test_cb = sub {
96         my $agent = shift;
97         $agent->get("/Ticket/Modify.html?id=$id");
98         my $form = $agent->form_name('TicketModify');
99         is $form->value('Owner'), $user_b->id, 'correct owner selected';
100         $agent->select('Owner', RT->Nobody->id);
101         $agent->submit;
102
103         $agent->content_contains(
104             'Permission Denied',
105             'no way to change owner after create if you have no rights'
106         );
107
108         my $ticket = RT::Ticket->new( RT->SystemUser );
109         $ticket->Load( $id );
110         ok $ticket->id, 'loaded the ticket';
111         is $ticket->Owner, $user_b->id, 'correct owner';
112     };
113
114     $test_cb->($agent_a);
115     diag "even owner(user B) can not change owner";
116     $test_cb->($agent_b);
117 }
118
119 diag "on reply correct owner is selected";
120 {
121     my $ticket = RT::Ticket->new( $user_a );
122     my ($id, $txn, $msg) = $ticket->Create(
123         Queue => $queue->id,
124         Owner => $user_b->id,
125         Subject => 'test',
126     );
127     ok $id, 'created a ticket #'. $id or diag "error: $msg";
128     is $ticket->Owner, $user_b->id, 'correct owner';
129
130     $agent_a->goto_ticket( $id );
131     $agent_a->follow_link_ok({text => 'Reply'}, 'Ticket -> Reply');
132
133     my $form = $agent_a->form_name('TicketUpdate');
134     is $form->value('Owner'), '', 'empty value selected';
135     $agent_a->submit;
136
137     $ticket = RT::Ticket->new( RT->SystemUser );
138     $ticket->Load( $id );
139     ok $ticket->id, 'loaded the ticket';
140     is $ticket->Owner, $user_b->id, 'correct owner';
141 }
142
143 ok( RT::Test->set_rights(
144     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket)] },
145     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
146 ), 'set rights');
147
148 diag "Couldn't take without coresponding right";
149 {
150     my $ticket = RT::Ticket->new( $user_a );
151     my ($id, $txn, $msg) = $ticket->Create(
152         Queue => $queue->id,
153         Subject => 'test',
154     );
155     ok $id, 'created a ticket #'. $id or diag "error: $msg";
156     is $ticket->Owner, RT->Nobody->id, 'correct owner';
157
158     $agent_a->goto_ticket( $id );
159     ok !($agent_a->find_all_links( text => 'Take' ))[0],
160         'no Take link';
161     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
162         'no Steal link as well';
163 }
164
165 diag "Couldn't steal without coresponding right";
166 {
167     my $ticket = RT::Ticket->new( $user_a );
168     my ($id, $txn, $msg) = $ticket->Create(
169         Queue => $queue->id,
170         Owner => $user_b->id,
171         Subject => 'test',
172     );
173     ok $id, 'created a ticket #'. $id or diag "error: $msg";
174     is $ticket->Owner, $user_b->id, 'correct owner';
175
176     $agent_a->goto_ticket( $id );
177     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
178         'no Steal link';
179     ok !($agent_a->find_all_links( text => 'Take' ))[0],
180         'no Take link as well';
181 }
182
183 ok( RT::Test->set_rights(
184     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket TakeTicket)] },
185 ), 'set rights');
186
187 diag "TakeTicket require OwnTicket to work";
188 {
189     my $ticket = RT::Ticket->new( $user_a );
190     my ($id, $txn, $msg) = $ticket->Create(
191         Queue => $queue->id,
192         Subject => 'test',
193     );
194     ok $id, 'created a ticket #'. $id or diag "error: $msg";
195     is $ticket->Owner, RT->Nobody->id, 'correct owner';
196
197     $agent_a->goto_ticket( $id );
198     ok !($agent_a->find_all_links( text => 'Take' ))[0],
199         'no Take link';
200     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
201         'no Steal link as well';
202 }
203
204 ok( RT::Test->set_rights(
205     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket TakeTicket)] },
206     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
207 ), 'set rights');
208
209 diag "TakeTicket+OwnTicket work";
210 {
211     my $ticket = RT::Ticket->new( $user_a );
212     my ($id, $txn, $msg) = $ticket->Create(
213         Queue => $queue->id,
214         Subject => 'test',
215     );
216     ok $id, 'created a ticket #'. $id or diag "error: $msg";
217     is $ticket->Owner, RT->Nobody->id, 'correct owner';
218
219     $agent_a->goto_ticket( $id );
220     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
221         'no Steal link';
222     $agent_a->follow_link_ok({text => 'Take'}, 'Ticket -> Take');
223
224     $ticket = RT::Ticket->new( RT->SystemUser );
225     $ticket->Load( $id );
226     ok $ticket->id, 'loaded the ticket';
227     is $ticket->Owner, $user_a->id, 'correct owner';
228 }
229
230 diag "TakeTicket+OwnTicket don't work when owner is not nobody";
231 {
232     my $ticket = RT::Ticket->new( $user_a );
233     my ($id, $txn, $msg) = $ticket->Create(
234         Queue => $queue->id,
235         Owner => $user_b->id,
236         Subject => 'test',
237     );
238     ok $id, 'created a ticket #'. $id or diag "error: $msg";
239     is $ticket->Owner, $user_b->id, 'correct owner';
240
241     $agent_a->goto_ticket( $id );
242     ok !($agent_a->find_all_links( text => 'Take' ))[0],
243         'no Take link';
244     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
245         'no Steal link too';
246 }
247
248 ok( RT::Test->set_rights(
249     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket StealTicket)] },
250     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
251 ), 'set rights');
252
253 diag "StealTicket require OwnTicket to work";
254 {
255     my $ticket = RT::Ticket->new( $user_a );
256     my ($id, $txn, $msg) = $ticket->Create(
257         Queue => $queue->id,
258         Owner => $user_b->id,
259         Subject => 'test',
260     );
261     ok $id, 'created a ticket #'. $id or diag "error: $msg";
262     is $ticket->Owner, $user_b->id, 'correct owner';
263
264     $agent_a->goto_ticket( $id );
265     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
266         'no Steal link';
267     ok !($agent_a->find_all_links( text => 'Take' ))[0],
268         'no Take link too';
269 }
270
271 ok( RT::Test->set_rights(
272     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket StealTicket)] },
273     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
274 ), 'set rights');
275
276 diag "StealTicket+OwnTicket work";
277 {
278     my $ticket = RT::Ticket->new( $user_a );
279     my ($id, $txn, $msg) = $ticket->Create(
280         Queue => $queue->id,
281         Owner => $user_b->id,
282         Subject => 'test',
283     );
284     ok $id, 'created a ticket #'. $id or diag "error: $msg";
285     is $ticket->Owner, $user_b->id, 'correct owner';
286
287     $agent_a->goto_ticket( $id );
288     ok !($agent_a->find_all_links( text => 'Take' ))[0],
289         'but no Take link';
290     $agent_a->follow_link_ok({text => 'Steal'}, 'Ticket -> Steal');
291
292     $ticket = RT::Ticket->new( RT->SystemUser );
293     $ticket->Load( $id );
294     ok $ticket->id, 'loaded the ticket';
295     is $ticket->Owner, $user_a->id, 'correct owner';
296 }
297
298 diag "StealTicket+OwnTicket don't work when owner is nobody";
299 {
300     my $ticket = RT::Ticket->new( $user_a );
301     my ($id, $txn, $msg) = $ticket->Create(
302         Queue => $queue->id,
303         Subject => 'test',
304     );
305     ok $id, 'created a ticket #'. $id or diag "error: $msg";
306     is $ticket->Owner, RT->Nobody->id, 'correct owner';
307
308     $agent_a->goto_ticket( $id );
309     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
310         'no Steal link';
311     ok !($agent_a->find_all_links( text => 'Take' ))[0],
312         'no Take link as well (no right)';
313 }
314
315 ok( RT::Test->set_rights(
316     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket TakeTicket StealTicket)] },
317     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
318 ), 'set rights');
319
320 diag "no Steal link when owner nobody";
321 {
322     my $ticket = RT::Ticket->new( $user_a );
323     my ($id, $txn, $msg) = $ticket->Create(
324         Queue => $queue->id,
325         Subject => 'test',
326     );
327     ok $id, 'created a ticket #'. $id or diag "error: $msg";
328     is $ticket->Owner, RT->Nobody->id, 'correct owner';
329
330     $agent_a->goto_ticket( $id );
331     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
332         'no Steal link';
333     ok( ($agent_a->find_all_links( text => 'Take' ))[0],
334         'but have Take link');
335 }
336
337 diag "no Take link when owner is not nobody";
338 {
339     my $ticket = RT::Ticket->new( $user_a );
340     my ($id, $txn, $msg) = $ticket->Create(
341         Queue => $queue->id,
342         Owner => $user_b->id,
343         Subject => 'test',
344     );
345     ok $id, 'created a ticket #'. $id or diag "error: $msg";
346     is $ticket->Owner, $user_b->id, 'correct owner';
347
348     $agent_a->goto_ticket( $id );
349     ok !($agent_a->find_all_links( text => 'Take' ))[0],
350         'no Take link';
351     ok( ($agent_a->find_all_links( text => 'Steal' ))[0],
352         'but have Steal link');
353 }
354
355 ok(
356     RT::Test->set_rights(
357         {
358             Principal => $user_a,
359             Right     => [
360                 qw(SeeQueue ShowTicket CreateTicket ReplyToTicket OwnTicket TakeTicket StealTicket)
361             ]
362         },
363         { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
364     ),
365     'set rights'
366 );
367
368 diag
369 "action is Take if old owner is nobody and new owner is current user in update page";
370
371     my $ticket = RT::Ticket->new( $user_a );
372     my ( $id, $txn, $msg ) = $ticket->Create(
373         Queue   => $queue->id,
374         Subject => 'test',
375     );
376     ok $id, 'created a ticket #'. $id or diag "error: $msg";
377     is $ticket->Owner, RT->Nobody->id, 'correct owner';
378
379     $agent_a->goto_ticket( $id );
380     $agent_a->content_lacks('Taken', 'no Taken');
381     $agent_a->follow_link_ok({text => 'Reply'}, 'Ticket -> Reply');
382     $agent_a->submit_form(
383         form_name => 'TicketUpdate',
384         fields    => { Owner => $user_a->id },
385         button => 'SubmitTicket',
386     );
387     $agent_a->content_like( qr/user_a\s+-\s+Taken/, 'got user_a Taken message' );
388
389     $agent_b->goto_ticket($id);
390     $agent_b->content_like( qr/user_a\s+-\s+Taken/, 'got user_a Taken message for user b ' );
391 }
392
393 diag
394 "action is Take if old owner is nobody and new owner is current user in basics page";
395 {
396     my $ticket = RT::Ticket->new($user_a);
397     my ( $id, $txn, $msg ) = $ticket->Create(
398         Queue   => $queue->id,
399         Subject => 'test',
400     );
401     ok $id, 'created a ticket #' . $id or diag "error: $msg";
402     is $ticket->Owner, RT->Nobody->id, 'correct owner';
403
404     $agent_a->goto_ticket($id);
405     $agent_a->content_lacks('Taken', 'no Taken');
406     $agent_a->follow_link_ok( { text => 'Basics' }, 'Ticket -> Basics' );
407     $agent_a->submit_form(
408         form_name => 'TicketModify',
409         fields    => { Owner => $user_a->id },
410     );
411     $agent_a->content_contains( 'Owner changed from Nobody to user_a',
412         'got set message in Basics' );
413     $agent_a->goto_ticket($id);
414     $agent_a->content_like( qr/user_a\s+-\s+Taken/, 'got user_a Taken message' );
415
416     $agent_b->goto_ticket($id);
417     $agent_b->content_like( qr/user_a\s+-\s+Taken/, 'got user_a Taken message for user b ' );
418 }
419