5 use RT::Test nodata => 1, tests => undef;
7 my $queue = RT::Test->load_or_create_queue( Name => "sorting" );
8 ok $queue && $queue->id, "Created queue";
9 my $queue_name = $queue->Name;
11 # CFs for testing, later we create another one
13 my $cf_name = "ordering";
16 $cf = RT::CustomField->new( RT->SystemUser );
17 my ($ret, $msg) = $cf->Create(
20 Type => 'FreeformSingle',
22 ok($ret, "Custom Field created");
28 { Subject => 'aa', 'CustomField-' . $cf->id => 'aa' },
29 { Subject => 'bb', 'CustomField-' . $cf->id => 'bb' },
30 { Subject => 'cc', 'CustomField-' . $cf->id => 'cc' },
32 { Count => 4, Order => "CF.{$cf_name}" },
33 { Count => 4, Order => "CF.$queue_name.{$cf_name}" },
34 { Query => "CF.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.{$cf_name}" },
35 { Query => "CF.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.$queue_name.{$cf_name}" },
36 { Query => "CF.{$cf_name} != 'cc'", Count => 3, Order => "CF.{$cf_name}" },
37 { Query => "CF.{$cf_name} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
43 my $other_name = "othercf";
44 diag "create another CF";
46 $other_cf = RT::CustomField->new( RT->SystemUser );
47 my ($ret, $msg) = $other_cf->Create(
50 Type => 'FreeformSingle',
52 ok($ret, "Other Custom Field created");
55 # Test that order is not affected by other CFs
59 { Subject => 'aa', "CustomField-" . $cf->id => 'aa', "CustomField-" . $other_cf->id => 'za' },
60 { Subject => 'bb', "CustomField-" . $cf->id => 'bb', "CustomField-" . $other_cf->id => 'ya' },
61 { Subject => 'cc', "CustomField-" . $cf->id => 'cc', "CustomField-" . $other_cf->id => 'xa' },
63 { Count => 4, Order => "CF.{$cf_name}" },
64 { Count => 4, Order => "CF.$queue_name.{$cf_name}" },
65 { Query => "CF.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.{$cf_name}" },
66 { Query => "CF.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.$queue_name.{$cf_name}" },
67 { Query => "CF.{$cf_name} != 'cc'", Count => 3, Order => "CF.{$cf_name}" },
68 { Query => "CF.{$cf_name} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
69 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.{$cf_name}" },
70 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
73 # And then add a CF with a duplicate name, on a different queue
75 my $other_queue = RT::Test->load_or_create_queue( Name => "other_queue" );
76 ok $other_queue && $other_queue->id, "Created queue";
78 my $dup = RT::CustomField->new( RT->SystemUser );
79 my ($ret, $msg) = $dup->Create(
81 Queue => $other_queue->id,
82 Type => 'FreeformSingle',
84 ok($ret, "Custom Field created");
91 { Subject => 'aa', "CustomField-" . $cf->id => 'aa', "CustomField-" . $other_cf->id => 'za' },
92 { Subject => 'bb', "CustomField-" . $cf->id => 'bb', "CustomField-" . $other_cf->id => 'ya' },
93 { Subject => 'cc', "CustomField-" . $cf->id => 'cc', "CustomField-" . $other_cf->id => 'xa' },
95 { Count => 4, Order => "CF.{$cf_name}" },
96 { Count => 4, Order => "CF.$queue_name.{$cf_name}" },
97 { Query => "CF.{$cf_id} LIKE 'a'", Count => 1, Order => "CF.{$cf_name}" },
98 { Query => "CF.{$cf_id} LIKE 'a'", Count => 1, Order => "CF.$queue_name.{$cf_name}" },
99 { Query => "CF.{$cf_id} != 'cc'", Count => 3, Order => "CF.{$cf_name}" },
100 { Query => "CF.{$cf_id} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
101 { Query => "CF.$queue_name.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.{$cf_name}" },
102 { Query => "CF.$queue_name.{$cf_name} LIKE 'a'", Count => 1, Order => "CF.$queue_name.{$cf_name}" },
103 { Query => "CF.$queue_name.{$cf_name} != 'cc'", Count => 3, Order => "CF.{$cf_name}" },
104 { Query => "CF.$queue_name.{$cf_name} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
105 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.{$cf_name}" },
106 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.$queue_name.{$cf_name}" },
108 { Query => "CF.{$cf_id} != 'cc'", Count => 3, Order => "CF.{$cf_id}" },
109 { Query => "CF.{$cf_id} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_id}" },
110 { Query => "CF.$queue_name.{$cf_name} != 'cc'", Count => 3, Order => "CF.{$cf_id}" },
111 { Query => "CF.$queue_name.{$cf_name} != 'cc'", Count => 3, Order => "CF.$queue_name.{$cf_id}" },
112 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.{$cf_id}" },
113 { Query => "CF.{$other_name} != 'za'", Count => 3, Order => "CF.$queue_name.{$cf_id}" },
118 my @tickets = RT::Test->create_tickets( { Queue => $queue->id, RandomOrder => 1 }, @{ $tickets });
119 my $base_query = join(" OR ", map {"id = ".$_->id} @tickets) || "id > 0";
122 for my $test ( @tests ) {
123 $test->{'Query'} ||= "id > 0";
124 my $query = "( $base_query ) AND " . $test->{'Query'};
125 for my $order (qw(ASC DESC)) {
126 subtest $test->{'Query'} . " ORDER BY ".$test->{'Order'}. " $order" => sub {
128 my $tix = RT::Tickets->new( RT->SystemUser );
129 $tix->FromSQL( $query );
130 $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
132 is($tix->Count, $test->{'Count'}, "found right number of tickets (".$test->{Count}.")")
135 my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
137 my $last_id = $tix->Last->id;
138 while ( my $t = $tix->Next ) {
140 next if $t->id == $last_id and $t->Subject eq "-"; # Nulls are allowed to come last, in Pg
142 if ( $order eq 'ASC' ) {
143 $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
145 $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
154 ok( $order_ok, "$order order of tickets is good" )
158 diag "Wrong SQL query:". $tix->BuildSelectQuery;
160 while ( my $t = $tix->Next ) {
161 diag sprintf "%02d - %s", $t->id, $t->Subject;