import rt 3.8.7
[freeside.git] / rt / t / web / ticket_owner.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use RT::Test tests => 91;
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 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 my $agent_a = RT::Test::Web->new;
29 ok $agent_a->login('user_a', 'password'), 'logged in as user A';
30
31 diag "current user has no right to own, nobody selected as owner on create" if $ENV{TEST_VERBOSE};
32 {
33     $agent_a->get_ok('/', 'open home page');
34     $agent_a->form_name('CreateTicketInQueue');
35     $agent_a->select( 'Queue', $queue->id );
36     $agent_a->submit;
37
38     $agent_a->content_like(qr/Create a new ticket/i, 'opened create ticket page');
39     my $form = $agent_a->form_name('TicketCreate');
40     is $form->value('Owner'), $RT::Nobody->id, 'correct owner selected';
41     ok !grep($_ == $user_a->id, $form->find_input('Owner')->possible_values),
42         'user A can not own tickets';
43     $agent_a->submit;
44
45     $agent_a->content_like(qr/Ticket \d+ created in queue/i, 'created ticket');
46     my ($id) = ($agent_a->content =~ /Ticket (\d+) created in queue/);
47     ok $id, 'found id of the ticket';
48
49     my $ticket = RT::Ticket->new( $RT::SystemUser );
50     $ticket->Load( $id );
51     ok $ticket->id, 'loaded the ticket';
52     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
53 }
54
55 diag "user can chose owner of a new ticket" if $ENV{TEST_VERBOSE};
56 {
57     $agent_a->get_ok('/', 'open home page');
58     $agent_a->form_name('CreateTicketInQueue');
59     $agent_a->select( 'Queue', $queue->id );
60     $agent_a->submit;
61
62     $agent_a->content_like(qr/Create a new ticket/i, 'opened create ticket page');
63     my $form = $agent_a->form_name('TicketCreate');
64     is $form->value('Owner'), $RT::Nobody->id, 'correct owner selected';
65
66     ok grep($_ == $user_b->id,  $form->find_input('Owner')->possible_values),
67         'user B is listed as potential owner';
68     $agent_a->select('Owner', $user_b->id);
69     $agent_a->submit;
70
71     $agent_a->content_like(qr/Ticket \d+ created in queue/i, 'created ticket');
72     my ($id) = ($agent_a->content =~ /Ticket (\d+) created in queue/);
73     ok $id, 'found id of the ticket';
74
75     my $ticket = RT::Ticket->new( $RT::SystemUser );
76     $ticket->Load( $id );
77     ok $ticket->id, 'loaded the ticket';
78     is $ticket->Owner, $user_b->id, 'correct owner';
79 }
80
81 my $agent_b = RT::Test::Web->new;
82 ok $agent_b->login('user_b', 'password'), 'logged in as user B';
83
84 diag "user A can not change owner after create" if $ENV{TEST_VERBOSE};
85 {
86     my $ticket = RT::Ticket->new( $user_a );
87     my ($id, $txn, $msg) = $ticket->Create(
88         Queue => $queue->id,
89         Owner => $user_b->id,
90         Subject => 'test',
91     );
92     ok $id, 'created a ticket #'. $id or diag "error: $msg";
93     is $ticket->Owner, $user_b->id, 'correct owner';
94
95     # try the following group of tests twice with different agents(logins)
96     my $test_cb = sub {
97         my $agent = shift;
98         $agent->goto_ticket( $id );
99         $agent->follow_link_ok({text => 'Basics'}, 'Ticket -> Basics');
100         my $form = $agent->form_number(3);
101         is $form->value('Owner'), $user_b->id, 'correct owner selected';
102         $agent->select('Owner', $RT::Nobody->id);
103         $agent->submit;
104
105         $agent->content_like(
106             qr/Permission denied/i,
107             'no way to change owner after create if you have no rights'
108         );
109
110         my $ticket = RT::Ticket->new( $RT::SystemUser );
111         $ticket->Load( $id );
112         ok $ticket->id, 'loaded the ticket';
113         is $ticket->Owner, $user_b->id, 'correct owner';
114     };
115
116     $test_cb->($agent_a);
117     diag "even owner(user B) can not change owner" if $ENV{TEST_VERBOSE};
118     $test_cb->($agent_b);
119 }
120
121 diag "on reply correct owner is selected" if $ENV{TEST_VERBOSE};
122 {
123     my $ticket = RT::Ticket->new( $user_a );
124     my ($id, $txn, $msg) = $ticket->Create(
125         Queue => $queue->id,
126         Owner => $user_b->id,
127         Subject => 'test',
128     );
129     ok $id, 'created a ticket #'. $id or diag "error: $msg";
130     is $ticket->Owner, $user_b->id, 'correct owner';
131
132     $agent_a->goto_ticket( $id );
133     $agent_a->follow_link_ok({text => 'Reply'}, 'Ticket -> Basics');
134
135     my $form = $agent_a->form_number(3);
136     is $form->value('Owner'), '', 'empty value selected';
137     $agent_a->submit;
138
139     $ticket = RT::Ticket->new( $RT::SystemUser );
140     $ticket->Load( $id );
141     ok $ticket->id, 'loaded the ticket';
142     is $ticket->Owner, $user_b->id, 'correct owner';
143 }
144
145 ok( RT::Test->set_rights(
146     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket)] },
147     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
148 ), 'set rights');
149
150 diag "Couldn't take without coresponding right" if $ENV{TEST_VERBOSE};
151 {
152     my $ticket = RT::Ticket->new( $user_a );
153     my ($id, $txn, $msg) = $ticket->Create(
154         Queue => $queue->id,
155         Subject => 'test',
156     );
157     ok $id, 'created a ticket #'. $id or diag "error: $msg";
158     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
159
160     $agent_a->goto_ticket( $id );
161     ok !($agent_a->find_all_links( text => 'Take' ))[0],
162         'no Take link';
163     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
164         'no Steal link as well';
165 }
166
167 diag "Couldn't steal without coresponding right" if $ENV{TEST_VERBOSE};
168 {
169     my $ticket = RT::Ticket->new( $user_a );
170     my ($id, $txn, $msg) = $ticket->Create(
171         Queue => $queue->id,
172         Owner => $user_b->id,
173         Subject => 'test',
174     );
175     ok $id, 'created a ticket #'. $id or diag "error: $msg";
176     is $ticket->Owner, $user_b->id, 'correct owner';
177
178     $agent_a->goto_ticket( $id );
179     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
180         'no Steal link';
181     ok !($agent_a->find_all_links( text => 'Take' ))[0],
182         'no Take link as well';
183 }
184
185 ok( RT::Test->set_rights(
186     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket TakeTicket)] },
187 ), 'set rights');
188
189 diag "TakeTicket require OwnTicket to work" if $ENV{TEST_VERBOSE};
190 {
191     my $ticket = RT::Ticket->new( $user_a );
192     my ($id, $txn, $msg) = $ticket->Create(
193         Queue => $queue->id,
194         Subject => 'test',
195     );
196     ok $id, 'created a ticket #'. $id or diag "error: $msg";
197     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
198
199     $agent_a->goto_ticket( $id );
200     ok !($agent_a->find_all_links( text => 'Take' ))[0],
201         'no Take link';
202     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
203         'no Steal link as well';
204 }
205
206 ok( RT::Test->set_rights(
207     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket TakeTicket)] },
208     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
209 ), 'set rights');
210
211 diag "TakeTicket+OwnTicket work" if $ENV{TEST_VERBOSE};
212 {
213     my $ticket = RT::Ticket->new( $user_a );
214     my ($id, $txn, $msg) = $ticket->Create(
215         Queue => $queue->id,
216         Subject => 'test',
217     );
218     ok $id, 'created a ticket #'. $id or diag "error: $msg";
219     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
220
221     $agent_a->goto_ticket( $id );
222     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
223         'no Steal link';
224     $agent_a->follow_link_ok({text => 'Take'}, 'Ticket -> Take');
225
226     $ticket = RT::Ticket->new( $RT::SystemUser );
227     $ticket->Load( $id );
228     ok $ticket->id, 'loaded the ticket';
229     is $ticket->Owner, $user_a->id, 'correct owner';
230 }
231
232 diag "TakeTicket+OwnTicket don't work when owner is not nobody" if $ENV{TEST_VERBOSE};
233 {
234     my $ticket = RT::Ticket->new( $user_a );
235     my ($id, $txn, $msg) = $ticket->Create(
236         Queue => $queue->id,
237         Owner => $user_b->id,
238         Subject => 'test',
239     );
240     ok $id, 'created a ticket #'. $id or diag "error: $msg";
241     is $ticket->Owner, $user_b->id, 'correct owner';
242
243     $agent_a->goto_ticket( $id );
244     ok !($agent_a->find_all_links( text => 'Take' ))[0],
245         'no Take link';
246     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
247         'no Steal link too';
248 }
249
250 ok( RT::Test->set_rights(
251     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket StealTicket)] },
252     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
253 ), 'set rights');
254
255 diag "StealTicket require OwnTicket to work" if $ENV{TEST_VERBOSE};
256 {
257     my $ticket = RT::Ticket->new( $user_a );
258     my ($id, $txn, $msg) = $ticket->Create(
259         Queue => $queue->id,
260         Owner => $user_b->id,
261         Subject => 'test',
262     );
263     ok $id, 'created a ticket #'. $id or diag "error: $msg";
264     is $ticket->Owner, $user_b->id, 'correct owner';
265
266     $agent_a->goto_ticket( $id );
267     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
268         'no Steal link';
269     ok !($agent_a->find_all_links( text => 'Take' ))[0],
270         'no Take link too';
271 }
272
273 ok( RT::Test->set_rights(
274     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket StealTicket)] },
275     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
276 ), 'set rights');
277
278 diag "StealTicket+OwnTicket work" if $ENV{TEST_VERBOSE};
279 {
280     my $ticket = RT::Ticket->new( $user_a );
281     my ($id, $txn, $msg) = $ticket->Create(
282         Queue => $queue->id,
283         Owner => $user_b->id,
284         Subject => 'test',
285     );
286     ok $id, 'created a ticket #'. $id or diag "error: $msg";
287     is $ticket->Owner, $user_b->id, 'correct owner';
288
289     $agent_a->goto_ticket( $id );
290     ok !($agent_a->find_all_links( text => 'Take' ))[0],
291         'but no Take link';
292     $agent_a->follow_link_ok({text => 'Steal'}, 'Ticket -> Steal');
293
294     $ticket = RT::Ticket->new( $RT::SystemUser );
295     $ticket->Load( $id );
296     ok $ticket->id, 'loaded the ticket';
297     is $ticket->Owner, $user_a->id, 'correct owner';
298 }
299
300 diag "StealTicket+OwnTicket don't work when owner is nobody" if $ENV{TEST_VERBOSE};
301 {
302     my $ticket = RT::Ticket->new( $user_a );
303     my ($id, $txn, $msg) = $ticket->Create(
304         Queue => $queue->id,
305         Subject => 'test',
306     );
307     ok $id, 'created a ticket #'. $id or diag "error: $msg";
308     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
309
310     $agent_a->goto_ticket( $id );
311     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
312         'no Steal link';
313     ok !($agent_a->find_all_links( text => 'Take' ))[0],
314         'no Take link as well (no right)';
315 }
316
317 ok( RT::Test->set_rights(
318     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket OwnTicket TakeTicket StealTicket)] },
319     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
320 ), 'set rights');
321
322 diag "no Steal link when owner nobody" if $ENV{TEST_VERBOSE};
323 {
324     my $ticket = RT::Ticket->new( $user_a );
325     my ($id, $txn, $msg) = $ticket->Create(
326         Queue => $queue->id,
327         Subject => 'test',
328     );
329     ok $id, 'created a ticket #'. $id or diag "error: $msg";
330     is $ticket->Owner, $RT::Nobody->id, 'correct owner';
331
332     $agent_a->goto_ticket( $id );
333     ok !($agent_a->find_all_links( text => 'Steal' ))[0],
334         'no Steal link';
335     ok( ($agent_a->find_all_links( text => 'Take' ))[0],
336         'but have Take link');
337 }
338
339 diag "no Take link when owner is not nobody" if $ENV{TEST_VERBOSE};
340 {
341     my $ticket = RT::Ticket->new( $user_a );
342     my ($id, $txn, $msg) = $ticket->Create(
343         Queue => $queue->id,
344         Owner => $user_b->id,
345         Subject => 'test',
346     );
347     ok $id, 'created a ticket #'. $id or diag "error: $msg";
348     is $ticket->Owner, $user_b->id, 'correct owner';
349
350     $agent_a->goto_ticket( $id );
351     ok !($agent_a->find_all_links( text => 'Take' ))[0],
352         'no Take link';
353     ok( ($agent_a->find_all_links( text => 'Steal' ))[0],
354         'but have Steal link');
355 }
356