first pass RT4 merge, RT#13852
[freeside.git] / rt / t / web / ticket_owner_autocomplete.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use RT::Test nodata => 1, tests => 43;
7 use JSON qw(from_json);
8
9 my $queue = RT::Test->load_or_create_queue( Name => 'Regression' );
10 ok $queue && $queue->id, 'loaded or created queue';
11
12 my $user_a = RT::Test->load_or_create_user(
13     Name => 'user_a', Password => 'password',
14 );
15 ok $user_a && $user_a->id, 'loaded or created user';
16
17 my $user_b = RT::Test->load_or_create_user(
18     Name => 'user_b', Password => 'password',
19 );
20 ok $user_b && $user_b->id, 'loaded or created user';
21
22 RT->Config->Set( AutocompleteOwners => 1 );
23 my ($baseurl, $agent_a) = RT::Test->started_ok;
24
25 ok( RT::Test->set_rights(
26     { Principal => $user_a, Right => [qw(SeeQueue ShowTicket CreateTicket ReplyToTicket)] },
27     { Principal => $user_b, Right => [qw(SeeQueue ShowTicket OwnTicket)] },
28 ), 'set rights');
29
30 ok $agent_a->login('user_a', 'password'), 'logged in as user A';
31
32 diag "current user has no right to own, nobody selected as owner on create";
33 {
34     $agent_a->get_ok('/', 'open home page');
35     $agent_a->form_name('CreateTicketInQueue');
36     $agent_a->select( 'Queue', $queue->id );
37     $agent_a->submit;
38
39     $agent_a->content_contains('Create a new ticket', 'opened create ticket page');
40     my $form = $agent_a->form_name('TicketCreate');
41     is $form->value('Owner'), RT->Nobody->Name, 'correct owner selected';
42     autocomplete_lacks( 'RT::Queue-'.$queue->id, 'user_a' );
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";
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_contains('Create a new ticket', 'opened create ticket page');
63     my $form = $agent_a->form_name('TicketCreate');
64     is $form->value('Owner'), RT->Nobody->Name, 'correct owner selected';
65
66     autocomplete_contains( 'RT::Queue-'.$queue->id, 'user_b' );
67     $form->value('Owner', $user_b->Name);
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->Name, 'correct owner selected';
100         $form->value('Owner', RT->Nobody->Name);
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( { id => 'page-actions-reply' }, 'Reply' );
132
133     my $form = $agent_a->form_number(3);
134     is $form->value('Owner'), 'user_b', 'current user 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 sub autocomplete {
144     my $limit = shift;
145     my $agent = shift;
146     $agent->get_ok("/Helpers/Autocomplete/Owners?term=&limit=$limit&return=Name", "fetched autocomplete values");
147     return from_json($agent->content);
148 }
149
150 sub autocomplete_contains {
151     my $limit = shift;
152     my $expected = shift;
153     my $agent = shift;
154     
155     unless ( $agent ) {
156         $agent = RT::Test::Web->new;
157         $agent->login('user_a', 'password');
158     }
159     
160     my $results = autocomplete( $limit, $agent );
161
162     my %seen;
163     $seen{$_->{value}}++ for @$results;
164     $expected = [$expected] unless ref $expected eq 'ARRAY';
165     is((scalar grep { not $seen{$_} } @$expected), 0, "got all expected values");
166 }
167
168 sub autocomplete_lacks {
169     my $limit = shift;
170     my $lacks = shift;
171     my $agent = shift;
172     
173     unless ( $agent ) {
174         $agent = RT::Test::Web->new;
175         $agent->login('user_a', 'password');
176     }
177     
178     my $results = autocomplete( $limit, $agent );
179
180     my %seen;
181     $seen{$_->{value}}++ for @$results;
182     $lacks = [$lacks] unless ref $lacks eq 'ARRAY';
183     is((scalar grep { $seen{$_} } @$lacks), 0, "didn't get any unexpected values");
184 }
185