import rt 3.8.7
[freeside.git] / rt / t / ticket / sort-by-queue.t
1 #!/usr/bin/perl
2
3 use RT::Test tests => 8;
4
5 use strict;
6 use warnings;
7
8 use RT::Tickets;
9 use RT::Queue;
10 use RT::CustomField;
11
12 #########################################################
13 # Test sorting by Queue, we sort by its name
14 #########################################################
15
16
17 diag "Create queues to test with." if $ENV{TEST_VERBOSE};
18 my @qids;
19 my @queues;
20 # create them in reverse order to avoid false positives
21 foreach my $name ( qw(sort-by-queue-Z sort-by-queue-A) ) {
22     my $queue = RT::Queue->new( $RT::SystemUser );
23     my ($ret, $msg) = $queue->Create(
24         Name => $name ."-$$",
25         Description => 'queue to test sorting by queue'
26     );
27     ok($ret, "test queue creation. $msg");
28     push @queues, $queue;
29     push @qids, $queue->id;
30 }
31
32 my ($total, @data, @tickets, @test) = (0, ());
33
34 sub add_tix_from_data {
35     my @res = ();
36     @data = sort { rand(100) <=> rand(100) } @data;
37     while (@data) {
38         my $t = RT::Ticket->new($RT::SystemUser);
39         my %args = %{ shift(@data) };
40         my ( $id, undef, $msg ) = $t->Create( %args );
41         ok( $id, "ticket created" ) or diag("error: $msg");
42         push @res, $t;
43         $total++;
44     }
45     return @res;
46 }
47
48 sub run_tests {
49     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
50     foreach my $test ( @test ) {
51         my $query = join " AND ", map "( $_ )", grep defined && length,
52             $query_prefix, $test->{'Query'};
53
54         foreach my $order (qw(ASC DESC)) {
55             my $error = 0;
56             my $tix = RT::Tickets->new( $RT::SystemUser );
57             $tix->FromSQL( $query );
58             $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
59
60             ok($tix->Count, "found ticket(s)")
61                 or $error = 1;
62
63             my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
64             while ( my $t = $tix->Next ) {
65                 my $tmp;
66                 if ( $order eq 'ASC' ) {
67                     $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
68                 } else {
69                     $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
70                 }
71                 if ( $tmp > 0 ) {
72                     $order_ok = 0; last;
73                 }
74                 $last = $t->Subject;
75             }
76
77             ok( $order_ok, "$order order of tickets is good" )
78                 or $error = 1;
79
80             if ( $error ) {
81                 diag "Wrong SQL query:". $tix->BuildSelectQuery;
82                 $tix->GotoFirstItem;
83                 while ( my $t = $tix->Next ) {
84                     diag sprintf "%02d - %s", $t->id, $t->Subject;
85                 }
86             }
87         }
88     }
89 }
90
91 @data = (
92     { Queue => $qids[0], Subject => 'z' },
93     { Queue => $qids[1], Subject => 'a' },
94 );
95 @tickets = add_tix_from_data();
96 @test = (
97     { Order => "Queue" },
98 );
99 run_tests();
100