RT 4.2.11, ticket#13852
[freeside.git] / rt / t / ticket / cfsort-freeform-single.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test nodata => 1, tests => undef;
6
7 my $queue = RT::Test->load_or_create_queue( Name => "sorting" );
8 ok $queue && $queue->id, "Created queue";
9 my $queue_name = $queue->Name;
10
11 # CFs for testing, later we create another one
12 my $cf;
13 my $cf_name = "ordering";
14 diag "create a CF";
15 {
16     $cf = RT::CustomField->new( RT->SystemUser );
17     my ($ret, $msg) = $cf->Create(
18         Name  => $cf_name,
19         Queue => $queue->id,
20         Type  => 'FreeformSingle',
21     );
22     ok($ret, "Custom Field created");
23 }
24
25 run_tests(
26     [
27         { Subject => '-' },
28         { Subject => 'aa', 'CustomField-' . $cf->id => 'aa' },
29         { Subject => 'bb', 'CustomField-' . $cf->id => 'bb' },
30         { Subject => 'cc', 'CustomField-' . $cf->id => 'cc' },
31     ],
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}" },
38 );
39
40
41
42 my $other_cf;
43 my $other_name = "othercf";
44 diag "create another CF";
45 {
46     $other_cf = RT::CustomField->new( RT->SystemUser );
47     my ($ret, $msg) = $other_cf->Create(
48         Name  => $other_name,
49         Queue => $queue->id,
50         Type  => 'FreeformSingle',
51     );
52     ok($ret, "Other Custom Field created");
53 }
54
55 # Test that order is not affected by other CFs
56 run_tests(
57     [
58         { Subject => '-', },
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' },
62     ],
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}" },
71 );
72
73 # And then add a CF with a duplicate name, on a different queue
74 {
75     my $other_queue = RT::Test->load_or_create_queue( Name => "other_queue" );
76     ok $other_queue && $other_queue->id, "Created queue";
77
78     my $dup = RT::CustomField->new( RT->SystemUser );
79     my ($ret, $msg) = $dup->Create(
80         Name  => $cf_name,
81         Queue => $other_queue->id,
82         Type  => 'FreeformSingle',
83     );
84     ok($ret, "Custom Field created");
85 }
86
87 my $cf_id = $cf->id;
88 run_tests(
89     [
90         { Subject => '-', },
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' },
94     ],
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}" },
107
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}"   },
114 );
115
116 sub run_tests {
117     my $tickets = shift;
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";
120
121     my @tests = @_;
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 {
127                 my $error = 0;
128                 my $tix = RT::Tickets->new( RT->SystemUser );
129                 $tix->FromSQL( $query );
130                 $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
131
132                 is($tix->Count, $test->{'Count'}, "found right number of tickets (".$test->{Count}.")")
133                     or $error = 1;
134
135                 my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
136                 if ($tix->Count) {
137                     my $last_id = $tix->Last->id;
138                     while ( my $t = $tix->Next ) {
139                         my $tmp;
140                         next if $t->id == $last_id and $t->Subject eq "-"; # Nulls are allowed to come last, in Pg
141
142                         if ( $order eq 'ASC' ) {
143                             $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
144                         } else {
145                             $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
146                         }
147                         if ( $tmp > 0 ) {
148                             $order_ok = 0; last;
149                         }
150                         $last = $t->Subject;
151                     }
152                 }
153
154                 ok( $order_ok, "$order order of tickets is good" )
155                     or $error = 1;
156
157                 if ( $error ) {
158                     diag "Wrong SQL query:". $tix->BuildSelectQuery;
159                     $tix->GotoFirstItem;
160                     while ( my $t = $tix->Next ) {
161                         diag sprintf "%02d - %s", $t->id, $t->Subject;
162                     }
163                 }
164             };
165         }
166     }
167 }
168
169 done_testing;