5 use RT::Test nodata => 1, tests => 2108;
8 my $q = RT::Test->load_or_create_queue( Name => 'Regression' );
9 ok $q && $q->id, 'loaded or created queue';
12 my ($total, @tickets, @test, @conditions) = (0, ());
17 ['x@foo.com'], ['y@bar.com'], ['z@bar.com'],
18 ['x@foo.com', 'y@bar.com'],
19 ['y@bar.com', 'z@bar.com'],
20 ['x@foo.com', 'z@bar.com'],
21 ['x@foo.com', 'y@bar.com', 'z@bar.com'],
24 foreach my $r (@list) {
25 foreach my $c (@list) {
26 my $subject = 'r:'. (join( '', map substr($_, 0, 1), @$r ) || '-') .';';
27 $subject .= 'c:'. (join( '', map substr($_, 0, 1), @$c ) || '-') .';';
36 return RT::Test->create_tickets( { Queue => $q->id }, @data );
40 while ( my ($query, $checks) = splice @test, 0, 2 ) {
41 run_test( $query, %$checks );
46 my ($query, %checks) = @_;
48 my $tix = RT::Tickets->new(RT->SystemUser);
49 $tix->FromSQL($query);
53 $count++ foreach grep $_, values %checks;
54 is($tix->Count, $count, "found correct number of ticket(s) by '$query'") or $error = 1;
56 my $good_tickets = ($tix->Count == $count);
57 while ( my $ticket = $tix->Next ) {
58 next if $checks{ $ticket->Subject };
59 diag $ticket->Subject ." ticket has been found when it's not expected";
62 ok( $good_tickets, "all tickets are good with '$query'" ) or $error = 1;
64 diag "Wrong SQL query for '$query':". $tix->BuildSelectQuery if $error;
69 my @atmp = @conditions;
70 while ( my ($query, $cb) = splice @atmp, 0, 2 ) {
72 foreach my $ticket ( @tickets ) {
73 my $s = $ticket->Subject;
74 $checks{ $s } = $cb->($s);
76 run_test($query, %checks);
80 '? AND ?' => sub { $_[0] and $_[1] },
81 '? OR ?' => sub { $_[0] or $_[1] },
83 while ( my ($template, $t_cb) = splice @queries, 0, 2 ) {
84 my @atmp = @conditions;
85 while ( my ($a, $a_cb) = splice @atmp, 0, 2 ) {
86 my @btmp = @conditions;
87 while ( my ($b, $b_cb) = splice @btmp, 0, 2 ) {
91 foreach my $ticket ( @tickets ) {
92 my $s = $ticket->Subject;
93 $checks{ $s } = $t_cb->( scalar $a_cb->($s), scalar $b_cb->($s) );
96 my $query = $template;
97 foreach my $tmp ($a, $b) {
101 run_test( $query, %checks );
106 # '? AND ? AND ?' => sub { $_[0] and $_[1] and $_[2] },
107 # '(? OR ?) AND ?' => sub { return (($_[0] or $_[1]) and $_[2]) },
108 # '? OR (? AND ?)' => sub { $_[0] or ($_[1] and $_[2]) },
109 # '(? AND ?) OR ?' => sub { ($_[0] and $_[1]) or $_[2] },
110 # '? AND (? OR ?)' => sub { $_[0] and ($_[1] or $_[2]) },
111 # '? OR ? OR ?' => sub { $_[0] or $_[1] or $_[2] },
113 # while ( my ($template, $t_cb) = splice @queries, 0, 2 ) {
114 # my @atmp = @conditions;
115 # while ( my ($a, $a_cb) = splice @atmp, 0, 2 ) {
116 # my @btmp = @conditions;
117 # while ( my ($b, $b_cb) = splice @btmp, 0, 2 ) {
119 # my @ctmp = @conditions;
120 # while ( my ($c, $c_cb) = splice @ctmp, 0, 2 ) {
125 # foreach my $ticket ( @tickets ) {
126 # my $s = $ticket->Subject;
127 # $checks{ $s } = $t_cb->( scalar $a_cb->($s), scalar $b_cb->($s), scalar $c_cb->($s) );
130 # my $query = $template;
131 # foreach my $tmp ($a, $b, $c) {
132 # $query =~ s/\?/$tmp/;
135 # run_test( $query, %checks );
142 'Cc = "not@exist"' => sub { 0 },
143 'Cc != "not@exist"' => sub { 1 },
144 'Cc IS NULL' => sub { $_[0] =~ /c:-;/ },
145 'Cc IS NOT NULL' => sub { $_[0] !~ /c:-;/ },
146 'Cc = "x@foo.com"' => sub { $_[0] =~ /c:[^;]*x/ },
147 'Cc != "x@foo.com"' => sub { $_[0] !~ /c:[^;]*x/ },
148 'Cc LIKE "@bar.com"' => sub { $_[0] =~ /c:[^;]*(?:y|z)/ },
150 # 'Cc NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
152 'Requestor = "not@exist"' => sub { 0 },
153 'Requestor != "not@exist"' => sub { 1 },
154 'Requestor IS NULL' => sub { $_[0] =~ /r:-;/ },
155 'Requestor IS NOT NULL' => sub { $_[0] !~ /r:-;/ },
156 'Requestor = "x@foo.com"' => sub { $_[0] =~ /r:[^;]*x/ },
157 'Requestor != "x@foo.com"' => sub { $_[0] !~ /r:[^;]*x/ },
158 'Requestor LIKE "@bar.com"' => sub { $_[0] =~ /r:[^;]*(?:y|z)/ },
160 # 'Requestor NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
162 'Watcher = "not@exist"' => sub { 0 },
163 'Watcher != "not@exist"' => sub { 1 },
165 # 'Watcher IS NULL' => sub { $_[0] eq 'r:-;c:-;' },
166 # 'Watcher IS NOT NULL' => sub { $_[0] ne 'r:-;c:-;' },
167 'Watcher = "x@foo.com"' => sub { $_[0] =~ /x/ },
168 # 'Watcher != "x@foo.com"' => sub { $_[0] !~ /x/ },
169 'Watcher LIKE "@bar.com"' => sub { $_[0] =~ /(?:y|z)/ },
171 # 'Watcher NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
173 'Subject LIKE "ne"' => sub { 0 },
174 'Subject NOT LIKE "ne"' => sub { 1 },
175 'Subject = "r:x;c:y;"' => sub { $_[0] eq 'r:x;c:y;' },
176 'Subject LIKE "x"' => sub { $_[0] =~ /x/ },
179 @tickets = generate_tix();
180 $total += scalar @tickets;
182 my $tix = RT::Tickets->new(RT->SystemUser);
183 $tix->FromSQL("Queue = '$queue'");
184 is($tix->Count, $total, "found $total tickets");
188 # owner is special watcher because reference is duplicated in two places,
189 # owner was an ENUM field now it's WATCHERFIELD, but should support old
190 # style ENUM searches for backward compatibility
191 my $nobody = RT::Nobody();
193 my $tix = RT::Tickets->new(RT->SystemUser);
194 $tix->FromSQL("Queue = '$queue' AND Owner = '". $nobody->id ."'");
195 ok($tix->Count, "found ticket(s)");
198 my $tix = RT::Tickets->new(RT->SystemUser);
199 $tix->FromSQL("Queue = '$queue' AND Owner = '". $nobody->Name ."'");
200 ok($tix->Count, "found ticket(s)");
203 my $tix = RT::Tickets->new(RT->SystemUser);
204 $tix->FromSQL("Queue = '$queue' AND Owner != '". $nobody->id ."'");
205 is($tix->Count, 0, "found ticket(s)");
208 my $tix = RT::Tickets->new(RT->SystemUser);
209 $tix->FromSQL("Queue = '$queue' AND Owner != '". $nobody->Name ."'");
210 is($tix->Count, 0, "found ticket(s)");
214 my $tix = RT::Tickets->new(RT->SystemUser);
215 $tix->FromSQL("Queue = '$queue' AND Owner.Name LIKE 'nob'");
216 ok($tix->Count, "found ticket(s)");
220 # create ticket and force type to not a 'ticket' value
221 # bug #6898@rt3.fsck.com
222 # and http://marc.theaimsgroup.com/?l=rt-devel&m=112662934627236&w=2
223 my($t) = RT::Test->create_tickets( { Queue => $q->id }, { Subject => 'not a ticket' } );
224 $t->_Set( Field => 'Type',
225 Value => 'not a ticket',
227 RecordTransaction => 0,
230 my $tix = RT::Tickets->new(RT->SystemUser);
231 $tix->FromSQL("Queue = '$queue' AND Owner = 'Nobody'");
232 is($tix->Count, $total, "found ticket(s)");
236 my $everyone = RT::Group->new( RT->SystemUser );
237 $everyone->LoadSystemInternalGroup('Everyone');
238 ok($everyone->id, "loaded 'everyone' group");
239 my($id, $msg) = $everyone->PrincipalObj->GrantRight( Right => 'OwnTicket',
242 ok($id, "granted OwnTicket right to Everyone on '$queue'") or diag("error: $msg");
244 my $u = RT::User->new( RT->SystemUser );
245 $u->LoadOrCreateByEmail('alpha@e.com');
246 ok($u->id, "loaded user");
247 my($t) = RT::Test->create_tickets(
248 { Queue => $q->id }, { Subject => '4', Owner => $u->id },
250 my $u_alpha_id = $u->id;
252 $u = RT::User->new( RT->SystemUser );
253 $u->LoadOrCreateByEmail('bravo@e.com');
254 ok($u->id, "loaded user");
255 ($t) = RT::Test->create_tickets(
256 { Queue => $q->id }, { Subject => '5', Owner => $u->id },
258 my $u_bravo_id = $u->id;
260 my $tix = RT::Tickets->new(RT->SystemUser);
261 $tix->FromSQL("Queue = '$queue' AND
262 ( Owner = '$u_alpha_id' OR
263 Owner = '$u_bravo_id' )"
265 is($tix->Count, 2, "found ticket(s)");