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