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