6 use RT::Test nodata => 1, tests => 2108;
9 my $q = RT::Test->load_or_create_queue( Name => 'Regression' );
10 ok $q && $q->id, 'loaded or created queue';
13 my ($total, @tickets, @test, @conditions) = (0, ());
18 ['x@foo.com'], ['y@bar.com'], ['z@bar.com'],
19 ['x@foo.com', 'y@bar.com'],
20 ['y@bar.com', 'z@bar.com'],
21 ['x@foo.com', 'z@bar.com'],
22 ['x@foo.com', 'y@bar.com', 'z@bar.com'],
25 foreach my $r (@list) {
26 foreach my $c (@list) {
27 my $subject = 'r:'. (join( '', map substr($_, 0, 1), @$r ) || '-') .';';
28 $subject .= 'c:'. (join( '', map substr($_, 0, 1), @$c ) || '-') .';';
37 return RT::Test->create_tickets( { Queue => $q->id }, @data );
41 while ( my ($query, $checks) = splice @test, 0, 2 ) {
42 run_test( $query, %$checks );
47 my ($query, %checks) = @_;
49 my $tix = RT::Tickets->new(RT->SystemUser);
50 $tix->FromSQL($query);
54 $count++ foreach grep $_, values %checks;
55 is($tix->Count, $count, "found correct number of ticket(s) by '$query'") or $error = 1;
57 my $good_tickets = ($tix->Count == $count);
58 while ( my $ticket = $tix->Next ) {
59 next if $checks{ $ticket->Subject };
60 diag $ticket->Subject ." ticket has been found when it's not expected";
63 ok( $good_tickets, "all tickets are good with '$query'" ) or $error = 1;
65 diag "Wrong SQL query for '$query':". $tix->BuildSelectQuery if $error;
70 my @atmp = @conditions;
71 while ( my ($query, $cb) = splice @atmp, 0, 2 ) {
73 foreach my $ticket ( @tickets ) {
74 my $s = $ticket->Subject;
75 $checks{ $s } = $cb->($s);
77 run_test($query, %checks);
81 '? AND ?' => sub { $_[0] and $_[1] },
82 '? OR ?' => sub { $_[0] or $_[1] },
84 while ( my ($template, $t_cb) = splice @queries, 0, 2 ) {
85 my @atmp = @conditions;
86 while ( my ($a, $a_cb) = splice @atmp, 0, 2 ) {
87 my @btmp = @conditions;
88 while ( my ($b, $b_cb) = splice @btmp, 0, 2 ) {
92 foreach my $ticket ( @tickets ) {
93 my $s = $ticket->Subject;
94 $checks{ $s } = $t_cb->( scalar $a_cb->($s), scalar $b_cb->($s) );
97 my $query = $template;
98 foreach my $tmp ($a, $b) {
102 run_test( $query, %checks );
107 # '? AND ? AND ?' => sub { $_[0] and $_[1] and $_[2] },
108 # '(? OR ?) AND ?' => sub { return (($_[0] or $_[1]) and $_[2]) },
109 # '? OR (? AND ?)' => sub { $_[0] or ($_[1] and $_[2]) },
110 # '(? AND ?) OR ?' => sub { ($_[0] and $_[1]) or $_[2] },
111 # '? AND (? OR ?)' => sub { $_[0] and ($_[1] or $_[2]) },
112 # '? OR ? OR ?' => sub { $_[0] or $_[1] or $_[2] },
114 # while ( my ($template, $t_cb) = splice @queries, 0, 2 ) {
115 # my @atmp = @conditions;
116 # while ( my ($a, $a_cb) = splice @atmp, 0, 2 ) {
117 # my @btmp = @conditions;
118 # while ( my ($b, $b_cb) = splice @btmp, 0, 2 ) {
120 # my @ctmp = @conditions;
121 # while ( my ($c, $c_cb) = splice @ctmp, 0, 2 ) {
126 # foreach my $ticket ( @tickets ) {
127 # my $s = $ticket->Subject;
128 # $checks{ $s } = $t_cb->( scalar $a_cb->($s), scalar $b_cb->($s), scalar $c_cb->($s) );
131 # my $query = $template;
132 # foreach my $tmp ($a, $b, $c) {
133 # $query =~ s/\?/$tmp/;
136 # run_test( $query, %checks );
143 'Cc = "not@exist"' => sub { 0 },
144 'Cc != "not@exist"' => sub { 1 },
145 'Cc IS NULL' => sub { $_[0] =~ /c:-;/ },
146 'Cc IS NOT NULL' => sub { $_[0] !~ /c:-;/ },
147 'Cc = "x@foo.com"' => sub { $_[0] =~ /c:[^;]*x/ },
148 'Cc != "x@foo.com"' => sub { $_[0] !~ /c:[^;]*x/ },
149 'Cc LIKE "@bar.com"' => sub { $_[0] =~ /c:[^;]*(?:y|z)/ },
151 # 'Cc NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
153 'Requestor = "not@exist"' => sub { 0 },
154 'Requestor != "not@exist"' => sub { 1 },
155 'Requestor IS NULL' => sub { $_[0] =~ /r:-;/ },
156 'Requestor IS NOT NULL' => sub { $_[0] !~ /r:-;/ },
157 'Requestor = "x@foo.com"' => sub { $_[0] =~ /r:[^;]*x/ },
158 'Requestor != "x@foo.com"' => sub { $_[0] !~ /r:[^;]*x/ },
159 'Requestor LIKE "@bar.com"' => sub { $_[0] =~ /r:[^;]*(?:y|z)/ },
161 # 'Requestor NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
163 'Watcher = "not@exist"' => sub { 0 },
164 'Watcher != "not@exist"' => sub { 1 },
166 # 'Watcher IS NULL' => sub { $_[0] eq 'r:-;c:-;' },
167 # 'Watcher IS NOT NULL' => sub { $_[0] ne 'r:-;c:-;' },
168 'Watcher = "x@foo.com"' => sub { $_[0] =~ /x/ },
169 # 'Watcher != "x@foo.com"' => sub { $_[0] !~ /x/ },
170 'Watcher LIKE "@bar.com"' => sub { $_[0] =~ /(?:y|z)/ },
172 # 'Watcher NOT LIKE "@bar.com"' => sub { $_[0] !~ /y|z/ },
174 'Subject LIKE "ne"' => sub { 0 },
175 'Subject NOT LIKE "ne"' => sub { 1 },
176 'Subject = "r:x;c:y;"' => sub { $_[0] eq 'r:x;c:y;' },
177 'Subject LIKE "x"' => sub { $_[0] =~ /x/ },
180 @tickets = generate_tix();
181 $total += scalar @tickets;
183 my $tix = RT::Tickets->new(RT->SystemUser);
184 $tix->FromSQL("Queue = '$queue'");
185 is($tix->Count, $total, "found $total tickets");
189 # owner is special watcher because reference is duplicated in two places,
190 # owner was an ENUM field now it's WATCHERFIELD, but should support old
191 # style ENUM searches for backward compatibility
192 my $nobody = RT::Nobody();
194 my $tix = RT::Tickets->new(RT->SystemUser);
195 $tix->FromSQL("Queue = '$queue' AND Owner = '". $nobody->id ."'");
196 ok($tix->Count, "found ticket(s)");
199 my $tix = RT::Tickets->new(RT->SystemUser);
200 $tix->FromSQL("Queue = '$queue' AND Owner = '". $nobody->Name ."'");
201 ok($tix->Count, "found ticket(s)");
204 my $tix = RT::Tickets->new(RT->SystemUser);
205 $tix->FromSQL("Queue = '$queue' AND Owner != '". $nobody->id ."'");
206 is($tix->Count, 0, "found ticket(s)");
209 my $tix = RT::Tickets->new(RT->SystemUser);
210 $tix->FromSQL("Queue = '$queue' AND Owner != '". $nobody->Name ."'");
211 is($tix->Count, 0, "found ticket(s)");
215 my $tix = RT::Tickets->new(RT->SystemUser);
216 $tix->FromSQL("Queue = '$queue' AND Owner.Name LIKE 'nob'");
217 ok($tix->Count, "found ticket(s)");
221 # create ticket and force type to not a 'ticket' value
222 # bug #6898@rt3.fsck.com
223 # and http://marc.theaimsgroup.com/?l=rt-devel&m=112662934627236&w=2
224 my($t) = RT::Test->create_tickets( { Queue => $q->id }, { Subject => 'not a ticket' } );
225 $t->_Set( Field => 'Type',
226 Value => 'not a ticket',
228 RecordTransaction => 0,
231 my $tix = RT::Tickets->new(RT->SystemUser);
232 $tix->FromSQL("Queue = '$queue' AND Owner = 'Nobody'");
233 is($tix->Count, $total, "found ticket(s)");
237 my $everyone = RT::Group->new( RT->SystemUser );
238 $everyone->LoadSystemInternalGroup('Everyone');
239 ok($everyone->id, "loaded 'everyone' group");
240 my($id, $msg) = $everyone->PrincipalObj->GrantRight( Right => 'OwnTicket',
243 ok($id, "granted OwnTicket right to Everyone on '$queue'") or diag("error: $msg");
245 my $u = RT::User->new( RT->SystemUser );
246 $u->LoadOrCreateByEmail('alpha@e.com');
247 ok($u->id, "loaded user");
248 my($t) = RT::Test->create_tickets(
249 { Queue => $q->id }, { Subject => '4', Owner => $u->id },
251 my $u_alpha_id = $u->id;
253 $u = RT::User->new( RT->SystemUser );
254 $u->LoadOrCreateByEmail('bravo@e.com');
255 ok($u->id, "loaded user");
256 ($t) = RT::Test->create_tickets(
257 { Queue => $q->id }, { Subject => '5', Owner => $u->id },
259 my $u_bravo_id = $u->id;
261 my $tix = RT::Tickets->new(RT->SystemUser);
262 $tix->FromSQL("Queue = '$queue' AND
263 ( Owner = '$u_alpha_id' OR
264 Owner = '$u_bravo_id' )"
266 is($tix->Count, 2, "found ticket(s)");