RT 4.0.13
[freeside.git] / rt / t / web / ticket_owner_autocomplete.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test nodata => 1, tests => 43;
6 use JSON qw(from_json);
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->Config->Set( AutocompleteOwners => 1 );
22 my ($baseurl, $agent_a) = RT::Test->started_ok;
23
24 ok( RT::Test->set_rights(
25     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket ReplyToTicket)] },
26     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
27 ), 'set rights');
28
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";
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_contains('Create a new ticket', 'opened create ticket page');
39     my $form = $agent_a->form_name('TicketCreate');
40     is $form->value('Owner'), RT->Nobody->Name, 'correct owner selected';
41     autocomplete_lacks( 'RT::Queue-'.$queue->id, 'user_a' );
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->Name, 'correct owner selected';
64
65     autocomplete_contains( 'RT::Queue-'.$queue->id, 'user_b' );
66     $form->value('Owner', $user_b->Name);
67     $agent_a->submit;
68
69     $agent_a->content_like(qr/Ticket \d+ created in queue/i, 'created ticket');
70     my ($id) = ($agent_a->content =~ /Ticket (\d+) created in queue/);
71     ok $id, 'found id of the ticket';
72
73     my $ticket = RT::Ticket->new( RT->SystemUser );
74     $ticket->Load( $id );
75     ok $ticket->id, 'loaded the ticket';
76     is $ticket->Owner, $user_b->id, 'correct owner';
77 }
78
79 my $agent_b = RT::Test::Web->new;
80 ok $agent_b->login('user_b', 'password'), 'logged in as user B';
81
82 diag "user A can not change owner after create";
83 {
84     my $ticket = RT::Ticket->new( $user_a );
85     my ($id, $txn, $msg) = $ticket->Create(
86         Queue => $queue->id,
87         Owner => $user_b->id,
88         Subject => 'test',
89     );
90     ok $id, 'created a ticket #'. $id or diag "error: $msg";
91     is $ticket->Owner, $user_b->id, 'correct owner';
92
93     # try the following group of tests twice with different agents(logins)
94     my $test_cb = sub {
95         my $agent = shift;
96         $agent->get("/Ticket/Modify.html?id=$id");
97         my $form = $agent->form_name('TicketModify');
98         is $form->value('Owner'), $user_b->Name, 'correct owner selected';
99         $form->value('Owner', RT->Nobody->Name);
100         $agent->submit;
101
102         $agent->content_contains(
103             'Permission Denied',
104             'no way to change owner after create if you have no rights'
105         );
106
107         my $ticket = RT::Ticket->new( RT->SystemUser );
108         $ticket->Load( $id );
109         ok $ticket->id, 'loaded the ticket';
110         is $ticket->Owner, $user_b->id, 'correct owner';
111     };
112
113     $test_cb->($agent_a);
114     diag "even owner(user B) can not change owner";
115     $test_cb->($agent_b);
116 }
117
118 diag "on reply correct owner is selected";
119 {
120     my $ticket = RT::Ticket->new( $user_a );
121     my ($id, $txn, $msg) = $ticket->Create(
122         Queue => $queue->id,
123         Owner => $user_b->id,
124         Subject => 'test',
125     );
126     ok $id, 'created a ticket #'. $id or diag "error: $msg";
127     is $ticket->Owner, $user_b->id, 'correct owner';
128
129     $agent_a->goto_ticket( $id );
130     $agent_a->follow_link_ok( { id => 'page-actions-reply' }, 'Reply' );
131
132     my $form = $agent_a->form_number(3);
133     is $form->value('Owner'), 'user_b', 'current user selected';
134     $agent_a->submit;
135
136     $ticket = RT::Ticket->new( RT->SystemUser );
137     $ticket->Load( $id );
138     ok $ticket->id, 'loaded the ticket';
139     is $ticket->Owner, $user_b->id, 'correct owner';
140 }
141
142 sub autocomplete {
143     my $limit = shift;
144     my $agent = shift;
145     $agent->get_ok("/Helpers/Autocomplete/Owners?term=&limit=$limit&return=Name", "fetched autocomplete values");
146     return from_json($agent->content);
147 }
148
149 sub autocomplete_contains {
150     my $limit = shift;
151     my $expected = shift;
152     my $agent = shift;
153     
154     unless ( $agent ) {
155         $agent = RT::Test::Web->new;
156         $agent->login('user_a', 'password');
157     }
158     
159     my $results = autocomplete( $limit, $agent );
160
161     my %seen;
162     $seen{$_->{value}}++ for @$results;
163     $expected = [$expected] unless ref $expected eq 'ARRAY';
164     is((scalar grep { not $seen{$_} } @$expected), 0, "got all expected values");
165 }
166
167 sub autocomplete_lacks {
168     my $limit = shift;
169     my $lacks = shift;
170     my $agent = shift;
171     
172     unless ( $agent ) {
173         $agent = RT::Test::Web->new;
174         $agent->login('user_a', 'password');
175     }
176     
177     my $results = autocomplete( $limit, $agent );
178
179     my %seen;
180     $seen{$_->{value}}++ for @$results;
181     $lacks = [$lacks] unless ref $lacks eq 'ARRAY';
182     is((scalar grep { $seen{$_} } @$lacks), 0, "didn't get any unexpected values");
183 }
184