Merge branch 'master' of https://github.com/jgoodman/Freeside
[freeside.git] / rt / t / api / rights_show_ticket.t
1
2 use RT::Test nodata => 1, tests => 264;
3
4 use strict;
5 use warnings;
6
7
8 my $queue_a = RT::Test->load_or_create_queue( Name => 'A' );
9 ok $queue_a && $queue_a->id, 'loaded or created queue_a';
10 my $qa_id = $queue_a->id;
11
12 my $queue_b = RT::Test->load_or_create_queue( Name => 'B' );
13 ok $queue_b && $queue_b->id, 'loaded or created queue_b';
14 my $qb_id = $queue_b->id;
15
16 my $user_a = RT::Test->load_or_create_user(
17     Name => 'user_a', Password => 'password',
18 );
19 ok $user_a && $user_a->id, 'loaded or created user';
20
21 my $user_b = RT::Test->load_or_create_user(
22     Name => 'user_b', Password => 'password',
23 );
24 ok $user_b && $user_b->id, 'loaded or created user';
25
26 foreach my $option (0 .. 1 ) { RT->Config->Set( 'UseSQLForACLChecks' => $option );
27
28 diag "Testing with UseSQLForACLChecks => $option";
29
30 # Global Cc has right, a User is nobody
31 {
32     cleanup();
33     RT::Test->set_rights(
34         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
35         { Principal => 'Cc',       Right => [qw(ShowTicket)] },
36     );
37     create_tickets_set();
38     have_no_rights($user_a, $user_b);
39 }
40
41 # Global Cc has right, a User is Queue Cc
42 {
43     cleanup();
44     RT::Test->set_rights(
45         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
46         { Principal => 'Cc',       Right => [qw(ShowTicket)] },
47     );
48     create_tickets_set();
49     have_no_rights($user_a, $user_b);
50
51     my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
52     ok($status, "user A is now queue A watcher");
53
54     foreach my $q (
55         '',
56         "Queue = $qa_id OR Queue = $qb_id",
57         "Queue = $qb_id OR Queue = $qa_id",
58     ) {
59         my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
60         $q? $tickets->FromSQL($q) : $tickets->UnLimit;
61         my $found = 0;
62         while ( my $t = $tickets->Next ) {
63             $found++;
64             is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
65         }
66         is($found, 2, "user sees tickets");
67     }
68     have_no_rights( $user_b );
69 }
70
71 # global Cc has right, a User is ticket Cc
72 {
73     cleanup();
74     RT::Test->set_rights(
75         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
76         { Principal => 'Cc',       Right => [qw(ShowTicket)] },
77     );
78     my @tickets = create_tickets_set();
79     have_no_rights($user_a, $user_b);
80
81     my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
82     ok($status, "user A is now queue A watcher");
83
84     foreach my $q (
85         '',
86         "Queue = $qa_id OR Queue = $qb_id",
87         "Queue = $qb_id OR Queue = $qa_id",
88     ) {
89         my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
90         $q? $tickets->FromSQL($q) : $tickets->UnLimit;
91         my $found = 0;
92         while ( my $t = $tickets->Next ) {
93             $found++;
94             is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
95             is( $t->id, $tickets[1]->id, "correct ticket");
96         }
97         is($found, 1, "user sees tickets");
98     }
99     have_no_rights($user_b);
100 }
101
102 # Queue Cc has right, a User is nobody
103 {
104     cleanup();
105     RT::Test->set_rights(
106         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
107         { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
108     );
109     create_tickets_set();
110     have_no_rights($user_a, $user_b);
111 }
112
113 # Queue Cc has right, Users are Queue Ccs
114 {
115     cleanup();
116     RT::Test->set_rights(
117         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
118         { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
119     );
120     create_tickets_set();
121     have_no_rights($user_a, $user_b);
122
123     my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
124     ok($status, "user A is now queue A watcher");
125
126     ($status, $msg) = $queue_b->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
127     ok($status, "user B is now queue B watcher");
128
129     foreach my $q (
130         '',
131         "Queue = $qa_id OR Queue = $qb_id",
132         "Queue = $qb_id OR Queue = $qa_id",
133     ) {
134         my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
135         $q? $tickets->FromSQL($q) : $tickets->UnLimit;
136         my $found = 0;
137         while ( my $t = $tickets->Next ) {
138             $found++;
139             is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
140         }
141         is($found, 2, "user sees tickets");
142     }
143     have_no_rights( $user_b );
144 }
145
146 # Queue Cc has right, Users are ticket Ccs
147 {
148     cleanup();
149     RT::Test->set_rights(
150         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
151         { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
152     );
153     my @tickets = create_tickets_set();
154     have_no_rights($user_a, $user_b);
155
156     my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
157     ok($status, "user A is now Cc on a ticket in queue A");
158
159     ($status, $msg) = $tickets[2]->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
160     ok($status, "user B is now Cc on a ticket in queue B");
161
162     foreach my $q (
163         '',
164         "Queue = $qa_id OR Queue = $qb_id",
165         "Queue = $qb_id OR Queue = $qa_id",
166     ) {
167         my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
168         $q? $tickets->FromSQL($q) : $tickets->UnLimit;
169         my $found = 0;
170         while ( my $t = $tickets->Next ) {
171             $found++;
172             is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
173             is( $t->id, $tickets[1]->id, )
174         }
175         is($found, 1, "user sees tickets");
176     }
177     have_no_rights( $user_b );
178 }
179
180 # Users has direct right on queue
181 {
182     cleanup();
183     RT::Test->set_rights(
184         { Principal => 'Everyone', Right => [qw(SeeQueue)] },
185         { Principal => $user_a, Object => $queue_a, Right => [qw(ShowTicket)] },
186     );
187     my @tickets = create_tickets_set();
188
189     foreach my $q (
190         '',
191         "Queue = $qa_id OR Queue = $qb_id",
192         "Queue = $qb_id OR Queue = $qa_id",
193     ) {
194         my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
195         $q? $tickets->FromSQL($q) : $tickets->UnLimit;
196         my $found = 0;
197         while ( my $t = $tickets->Next ) {
198             $found++;
199             is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
200         }
201         is($found, 2, "user sees tickets");
202     }
203     have_no_rights( $user_b );
204 }
205
206
207 }
208
209 sub have_no_rights {
210     local $Test::Builder::Level = $Test::Builder::Level + 1;
211     foreach my $u ( @_ ) {
212         foreach my $q (
213             '',
214             "Queue = $qa_id OR Queue = $qb_id",
215             "Queue = $qb_id OR Queue = $qa_id",
216         ) {
217             my $tickets = RT::Tickets->new( RT::CurrentUser->new( $u ) );
218             $q? $tickets->FromSQL($q) : $tickets->UnLimit;
219             ok(!$tickets->First, "no tickets");
220         }
221     }
222 }
223
224 sub create_tickets_set{
225     local $Test::Builder::Level = $Test::Builder::Level + 1;
226     my @res;
227     foreach my $q ($queue_a, $queue_b) {
228         foreach my $n (1 .. 2) {
229             my $ticket = RT::Ticket->new( RT->SystemUser );
230             my ($tid) = $ticket->Create(
231                 Queue => $q->id, Subject => $q->Name .' - '. $n
232             );
233             ok( $tid, "created ticket #$tid");
234             push @res, $ticket;
235         }
236     }
237     return @res;
238 }
239
240 sub cleanup {
241     RT::Test->delete_tickets( "Queue = $qa_id OR Queue = $qb_id" );
242     RT::Test->delete_queue_watchers( $queue_a, $queue_b );
243 }; 
244