2 use RT::Test nodata => 1, tests => 264;
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;
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;
16 my $user_a = RT::Test->load_or_create_user(
17 Name => 'user_a', Password => 'password',
19 ok $user_a && $user_a->id, 'loaded or created user';
21 my $user_b = RT::Test->load_or_create_user(
22 Name => 'user_b', Password => 'password',
24 ok $user_b && $user_b->id, 'loaded or created user';
26 foreach my $option (0 .. 1 ) { RT->Config->Set( 'UseSQLForACLChecks' => $option );
28 diag "Testing with UseSQLForACLChecks => $option";
30 # Global Cc has right, a User is nobody
34 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
35 { Principal => 'Cc', Right => [qw(ShowTicket)] },
38 have_no_rights($user_a, $user_b);
41 # Global Cc has right, a User is Queue Cc
45 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
46 { Principal => 'Cc', Right => [qw(ShowTicket)] },
49 have_no_rights($user_a, $user_b);
51 my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
52 ok($status, "user A is now queue A watcher");
56 "Queue = $qa_id OR Queue = $qb_id",
57 "Queue = $qb_id OR Queue = $qa_id",
59 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
60 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
62 while ( my $t = $tickets->Next ) {
64 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
66 is($found, 2, "user sees tickets");
68 have_no_rights( $user_b );
71 # global Cc has right, a User is ticket Cc
75 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
76 { Principal => 'Cc', Right => [qw(ShowTicket)] },
78 my @tickets = create_tickets_set();
79 have_no_rights($user_a, $user_b);
81 my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
82 ok($status, "user A is now queue A watcher");
86 "Queue = $qa_id OR Queue = $qb_id",
87 "Queue = $qb_id OR Queue = $qa_id",
89 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
90 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
92 while ( my $t = $tickets->Next ) {
94 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
95 is( $t->id, $tickets[1]->id, "correct ticket");
97 is($found, 1, "user sees tickets");
99 have_no_rights($user_b);
102 # Queue Cc has right, a User is nobody
105 RT::Test->set_rights(
106 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
107 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
109 create_tickets_set();
110 have_no_rights($user_a, $user_b);
113 # Queue Cc has right, Users are Queue Ccs
116 RT::Test->set_rights(
117 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
118 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
120 create_tickets_set();
121 have_no_rights($user_a, $user_b);
123 my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
124 ok($status, "user A is now queue A watcher");
126 ($status, $msg) = $queue_b->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
127 ok($status, "user B is now queue B watcher");
131 "Queue = $qa_id OR Queue = $qb_id",
132 "Queue = $qb_id OR Queue = $qa_id",
134 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
135 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
137 while ( my $t = $tickets->Next ) {
139 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
141 is($found, 2, "user sees tickets");
143 have_no_rights( $user_b );
146 # Queue Cc has right, Users are ticket Ccs
149 RT::Test->set_rights(
150 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
151 { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
153 my @tickets = create_tickets_set();
154 have_no_rights($user_a, $user_b);
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");
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");
164 "Queue = $qa_id OR Queue = $qb_id",
165 "Queue = $qb_id OR Queue = $qa_id",
167 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
168 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
170 while ( my $t = $tickets->Next ) {
172 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
173 is( $t->id, $tickets[1]->id, )
175 is($found, 1, "user sees tickets");
177 have_no_rights( $user_b );
180 # Users has direct right on queue
183 RT::Test->set_rights(
184 { Principal => 'Everyone', Right => [qw(SeeQueue)] },
185 { Principal => $user_a, Object => $queue_a, Right => [qw(ShowTicket)] },
187 my @tickets = create_tickets_set();
191 "Queue = $qa_id OR Queue = $qb_id",
192 "Queue = $qb_id OR Queue = $qa_id",
194 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
195 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
197 while ( my $t = $tickets->Next ) {
199 is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
201 is($found, 2, "user sees tickets");
203 have_no_rights( $user_b );
210 local $Test::Builder::Level = $Test::Builder::Level + 1;
211 foreach my $u ( @_ ) {
214 "Queue = $qa_id OR Queue = $qb_id",
215 "Queue = $qb_id OR Queue = $qa_id",
217 my $tickets = RT::Tickets->new( RT::CurrentUser->new( $u ) );
218 $q? $tickets->FromSQL($q) : $tickets->UnLimit;
219 ok(!$tickets->First, "no tickets");
224 sub create_tickets_set{
225 local $Test::Builder::Level = $Test::Builder::Level + 1;
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
233 ok( $tid, "created ticket #$tid");
241 RT::Test->delete_tickets( "Queue = $qa_id OR Queue = $qb_id" );
242 RT::Test->delete_queue_watchers( $queue_a, $queue_b );