import rt 3.8.10
[freeside.git] / rt / lib / t / regression / 23cfsort-freeform-single.t
1 #!/usr/bin/perl
2
3 use Test::More tests => 57;
4 use RT;
5 RT::LoadConfig();
6 RT::Init();
7
8 use strict;
9 use warnings;
10
11 use RT::Tickets;
12 use RT::Queue;
13 use RT::CustomField;
14
15 # Test Sorting by FreeformSingle custom field.
16
17 diag "Create a queue to test with.";
18 my $queue_name = "CFSortQueue$$";
19 my $queue;
20 {
21     $queue = RT::Queue->new( $RT::SystemUser );
22     my ($ret, $msg) = $queue->Create(
23         Name => $queue,
24         Description => 'queue for custom field sort testing'
25     );
26     ok($ret, "$queue test queue creation. $msg");
27 }
28
29 # CFs for testing, later we create another one
30 my %CF;
31 my $cf_name;
32
33 diag "create a CF\n";
34 {
35     $cf_name = $CF{'CF'}{'name'} = "Order$$";
36     $CF{'CF'}{'obj'} = RT::CustomField->new( $RT::SystemUser );
37     my ($ret, $msg) = $CF{'CF'}{'obj'}->Create(
38         Name  => $CF{'CF'}{'name'},
39         Queue => $queue->id,
40         Type  => 'FreeformSingle',
41     );
42     ok($ret, "Custom Field $CF{'CF'}{'name'} created");
43 }
44
45 my ($total, @data, @tickets, @test) = (0, ());
46
47 sub add_tix_from_data {
48     my @res = ();
49     @data = sort { rand(100) <=> rand(100) } @data;
50     while (@data) {
51         my $t = RT::Ticket->new($RT::SystemUser);
52         my %args = %{ shift(@data) };
53
54         my $subject = '-';
55         foreach my $e ( grep exists $CF{$_} && defined $CF{$_}, keys %args ) {
56             my @values = ();
57             if ( ref $args{ $e } ) {
58                 @values = @{ delete $args{ $e } };
59             } else {
60                 @values = (delete $args{ $e });
61             }
62             $args{ 'CustomField-'. $CF{ $e }{'obj'}->id } = \@values
63                 if @values;
64             $subject = join(",", sort @values) || '-'
65                 if $e eq 'CF';
66         }
67
68         my ( $id, undef $msg ) = $t->Create(
69             %args,
70             Queue => $queue->id,
71             Subject => $subject,
72         );
73         ok( $id, "ticket created" ) or diag("error: $msg");
74         push @res, $t;
75         $total++;
76     }
77     return @res;
78 }
79
80 sub run_tests {
81     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
82     foreach my $test ( @test ) {
83         my $query = join " AND ", map "( $_ )", grep defined && length,
84             $query_prefix, $test->{'Query'};
85
86         foreach my $order (qw(ASC DESC)) {
87             my $error = 0;
88             my $tix = RT::Tickets->new( $RT::SystemUser );
89             $tix->FromSQL( $query );
90             $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
91
92             ok($tix->Count, "found ticket(s)")
93                 or $error = 1;
94
95             my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
96             while ( my $t = $tix->Next ) {
97                 my $tmp;
98                 if ( $order eq 'ASC' ) {
99                     $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
100                 } else {
101                     $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
102                 }
103                 if ( $tmp > 0 ) {
104                     $order_ok = 0; last;
105                 }
106                 $last = $t->Subject;
107             }
108
109             ok( $order_ok, "$order order of tickets is good" )
110                 or $error = 1;
111
112             if ( $error ) {
113                 diag "Wrong SQL query:". $tix->BuildSelectQuery;
114                 $tix->GotoFirstItem;
115                 while ( my $t = $tix->Next ) {
116                     diag sprintf "%02d - %s", $t->id, $t->Subject;
117                 }
118             }
119         }
120     }
121 }
122
123 @data = (
124     { },
125     { CF => 'a' },
126     { CF => 'b' },
127 );
128 @tickets = add_tix_from_data();
129 @test = (
130     { Order => "CF.{$cf_name}" },
131     { Order => "CF.$queue_name.{$cf_name}" },
132 );
133 run_tests();
134
135 @data = (
136     { },
137     { CF => 'aa' },
138     { CF => 'ab' },
139 );
140 @tickets = add_tix_from_data();
141 @test = (
142     { Query => "CF.{$cf_name} LIKE 'a'", Order => "CF.{$cf_name}" },
143     { Query => "CF.{$cf_name} LIKE 'a'", Order => "CF.$queue_name.{$cf_name}" },
144 );
145 run_tests();
146
147 @data = (
148     { Subject => '-', },
149     { Subject => 'a', CF => 'a' },
150     { Subject => 'b', CF => 'b' },
151     { Subject => 'c', CF => 'c' },
152 );
153 @tickets = add_tix_from_data();
154 @test = (
155     { Query => "CF.{$cf_name} != 'c'", Order => "CF.{$cf_name}" },
156     { Query => "CF.{$cf_name} != 'c'", Order => "CF.$queue_name.{$cf_name}" },
157 );
158 run_tests();
159
160
161
162 diag "create another CF\n";
163 {
164     $CF{'AnotherCF'}{'name'} = "OrderAnother$$";
165     $CF{'AnotherCF'}{'obj'} = RT::CustomField->new( $RT::SystemUser );
166     my ($ret, $msg) = $CF{'AnotherCF'}{'obj'}->Create(
167         Name  => $CF{'AnotherCF'}{'name'},
168         Queue => $queue->id,
169         Type  => 'FreeformSingle',
170     );
171     ok($ret, "Custom Field $CF{'AnotherCF'}{'name'} created");
172 }
173
174 # test that order is not affect by other fields (had such problem)
175 @data = (
176     { Subject => '-', },
177     { Subject => 'a', CF => 'a', AnotherCF => 'za' },
178     { Subject => 'b', CF => 'b', AnotherCF => 'ya' },
179     { Subject => 'c', CF => 'c', AnotherCF => 'xa' },
180 );
181 @tickets = add_tix_from_data();
182 @test = (
183     { Order => "CF.{$cf_name}" },
184     { Order => "CF.$queue_name.{$cf_name}" },
185     { Query => "CF.{$cf_name} != 'c'", Order => "CF.{$cf_name}" },
186     { Query => "CF.{$cf_name} != 'c'", Order => "CF.$queue_name.{$cf_name}" },
187 );
188 run_tests();
189
190
191