3 use RT::Test tests => 264;
9 my $queue_a = RT::Test->load_or_create_queue( Name => 'A' );
10 ok $queue_a && $queue_a->id, 'loaded or created queue_a';
11 my $qa_id = $queue_a->id;
13 my $queue_b = RT::Test->load_or_create_queue( Name => 'B' );
14 ok $queue_b && $queue_b->id, 'loaded or created queue_b';
15 my $qb_id = $queue_b->id;
17 my $user_a = RT::Test->load_or_create_user(
18 Name => 'user_a', Password => 'password',
20 ok $user_a && $user_a->id, 'loaded or created user';
22 my $user_b = RT::Test->load_or_create_user(
23 Name => 'user_b', Password => 'password',
25 ok $user_b && $user_b->id, 'loaded or created user';
27 foreach my $option (0 .. 1 ) { RT->Config->Set( 'UseSQLForACLChecks' => $option );
29 diag "Testing with UseSQLForACLChecks => $option";
31 # Global Cc has right, a User is nobody
35 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
36 { Principal => 'Cc', Right => [qw(ShowTicket)] },
39 have_no_rights($user_a, $user_b);
42 # Global Cc has right, a User is Queue Cc
46 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
47 { Principal => 'Cc', Right => [qw(ShowTicket)] },
50 have_no_rights($user_a, $user_b);
52 my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
53 ok($status, "user A is now queue A watcher");
57 "Queue = $qa_id OR Queue = $qb_id",
58 "Queue = $qb_id OR Queue = $qa_id",
60 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
61 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
63 while ( my $t = $tickets->Next ) {
65 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
67 is($found, 2, "user sees tickets");
69 have_no_rights( $user_b );
72 # global Cc has right, a User is ticket Cc
76 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
77 { Principal => 'Cc', Right => [qw(ShowTicket)] },
79 my @tickets = create_tickets_set();
80 have_no_rights($user_a, $user_b);
82 my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
83 ok($status, "user A is now queue A watcher");
87 "Queue = $qa_id OR Queue = $qb_id",
88 "Queue = $qb_id OR Queue = $qa_id",
90 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
91 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
93 while ( my $t = $tickets->Next ) {
95 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
96 is( $t->id, $tickets[1]->id, "correct ticket");
98 is($found, 1, "user sees tickets");
100 have_no_rights($user_b);
103 # Queue Cc has right, a User is nobody
106 RT::Test->set_rights(
107 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
108 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
110 create_tickets_set();
111 have_no_rights($user_a, $user_b);
114 # Queue Cc has right, Users are Queue Ccs
117 RT::Test->set_rights(
118 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
119 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
121 create_tickets_set();
122 have_no_rights($user_a, $user_b);
124 my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
125 ok($status, "user A is now queue A watcher");
127 ($status, $msg) = $queue_b->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
128 ok($status, "user B is now queue B watcher");
132 "Queue = $qa_id OR Queue = $qb_id",
133 "Queue = $qb_id OR Queue = $qa_id",
135 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
136 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
138 while ( my $t = $tickets->Next ) {
140 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
142 is($found, 2, "user sees tickets");
144 have_no_rights( $user_b );
147 # Queue Cc has right, Users are ticket Ccs
150 RT::Test->set_rights(
151 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
152 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
154 my @tickets = create_tickets_set();
155 have_no_rights($user_a, $user_b);
157 my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
158 ok($status, "user A is now Cc on a ticket in queue A");
160 ($status, $msg) = $tickets[2]->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
161 ok($status, "user B is now Cc on a ticket in queue B");
165 "Queue = $qa_id OR Queue = $qb_id",
166 "Queue = $qb_id OR Queue = $qa_id",
168 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
169 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
171 while ( my $t = $tickets->Next ) {
173 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
174 is( $t->id, $tickets[1]->id, )
176 is($found, 1, "user sees tickets");
178 have_no_rights( $user_b );
181 # Users has direct right on queue
184 RT::Test->set_rights(
185 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
186 { Principal => $user_a, Object => $queue_a, Right => [qw(ShowTicket)] },
188 my @tickets = create_tickets_set();
192 "Queue = $qa_id OR Queue = $qb_id",
193 "Queue = $qb_id OR Queue = $qa_id",
195 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
196 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
198 while ( my $t = $tickets->Next ) {
200 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
202 is($found, 2, "user sees tickets");
204 have_no_rights( $user_b );
211 $SIG{'INT'} = $SIG{'TERM'} = sub { print STDERR Carp::longmess('boo'); exit 1 };
212 local $Test::Builder::Level = $Test::Builder::Level + 1;
213 foreach my $u ( @_ ) {
216 "Queue = $qa_id OR Queue = $qb_id",
217 "Queue = $qb_id OR Queue = $qa_id",
219 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $u ) );
220 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
221 ok(!$tickets->First, "no tickets");
226 sub create_tickets_set{
227 local $Test::Builder::Level = $Test::Builder::Level + 1;
229 foreach my $q ($queue_a, $queue_b) {
230 foreach my $n (1 .. 2) {
231 my $ticket = RT::Ticket->new( $RT::SystemUser );
232 my ($tid) = $ticket->Create(
233 Queue => $q->id, Subject => $q->Name .' - '. $n
235 ok( $tid, "created ticket #$tid");
242 sub cleanup { delete_tickets(); delete_watchers() };
245 my $tickets = RT::Tickets->new( $RT::SystemUser );
246 $tickets->FromSQL( "Queue = $qa_id OR Queue = $qb_id" );
247 while ( my $ticket = $tickets->Next ) {
252 sub delete_watchers {
253 foreach my $q ($queue_a, $queue_b) {
254 foreach my $u ($user_a, $user_b) {
255 foreach my $t (qw(Cc AdminCc) ) {
256 $q->DeleteWatcher( Type => $t, PrincipalId => $u->id )
257 if $q->IsWatcher( Type => $t, PrincipalId => $u->id );