import rt 3.8.7
[freeside.git] / rt / t / ticket / sort-by-user.t
1 #!/usr/bin/perl
2
3 use RT::Test tests => 32;
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 Owner, Creator and LastUpdatedBy
14 # we sort by user name
15 #########################################################
16
17 diag "Create a queue to test with." if $ENV{TEST_VERBOSE};
18 my $queue_name = "OwnerSortQueue$$";
19 my $queue;
20 {
21     $queue = RT::Queue->new( $RT::SystemUser );
22     my ($ret, $msg) = $queue->Create(
23         Name => $queue_name,
24         Description => 'queue for custom field sort testing'
25     );
26     ok($ret, "$queue test queue creation. $msg");
27 }
28
29 my @uids;
30 my @users;
31 # create them in reverse order to avoid false positives
32 foreach my $u (qw(Z A)) {
33     my $name = $u ."-user-to-test-ordering-$$";
34     my $user = RT::User->new( $RT::SystemUser );
35     my ($uid) = $user->Create(
36         Name => $name,
37         Privileged => 1,
38     );
39     ok $uid, "created user #$uid";
40
41     my ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue );
42     ok $status, "granted right";
43     ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'CreateTicket', Object => $queue );
44     ok $status, "granted right";
45
46     push @users, $user;
47     push @uids, $user->id;
48 }
49
50 my ($total, @data, @tickets, @test) = (0, ());
51
52 sub add_tix_from_data {
53     my @res = ();
54     @data = sort { rand(100) <=> rand(100) } @data;
55     while (@data) {
56         my $t = RT::Ticket->new($RT::SystemUser);
57         my %args = %{ shift(@data) };
58
59         my ( $id, undef, $msg ) = $t->Create( %args, Queue => $queue->id );
60         if ( $args{'Owner'} ) {
61             is $t->Owner, $args{'Owner'}, "owner is correct";
62         }
63         if ( $args{'Creator'} ) {
64             is $t->Creator, $args{'Creator'}, "creator is correct";
65         }
66         # hackish, but simpler
67         if ( $args{'LastUpdatedBy'} ) {
68             $t->__Set( Field => 'LastUpdatedBy', Value => $args{'LastUpdatedBy'} );
69         }
70         ok( $id, "ticket created" ) or diag("error: $msg");
71         push @res, $t;
72         $total++;
73     }
74     return @res;
75 }
76
77 sub run_tests {
78     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
79     foreach my $test ( @test ) {
80         my $query = join " AND ", map "( $_ )", grep defined && length,
81             $query_prefix, $test->{'Query'};
82
83         foreach my $order (qw(ASC DESC)) {
84             my $error = 0;
85             my $tix = RT::Tickets->new( $RT::SystemUser );
86             $tix->FromSQL( $query );
87             $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
88
89             ok($tix->Count, "found ticket(s)")
90                 or $error = 1;
91
92             my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
93             while ( my $t = $tix->Next ) {
94                 my $tmp;
95                 if ( $order eq 'ASC' ) {
96                     $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
97                 } else {
98                     $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
99                 }
100                 if ( $tmp > 0 ) {
101                     $order_ok = 0; last;
102                 }
103                 $last = $t->Subject;
104             }
105
106             ok( $order_ok, "$order order of tickets is good" )
107                 or $error = 1;
108
109             if ( $error ) {
110                 diag "Wrong SQL query:". $tix->BuildSelectQuery;
111                 $tix->GotoFirstItem;
112                 while ( my $t = $tix->Next ) {
113                     diag sprintf "%02d - %s", $t->id, $t->Subject;
114                 }
115             }
116         }
117     }
118 }
119
120 @data = (
121     { Subject => 'Nobody' },
122     { Subject => 'Z', Owner => $uids[0] },
123     { Subject => 'A', Owner => $uids[1] },
124 );
125 @tickets = add_tix_from_data();
126 @test = (
127     { Order => "Owner" },
128 );
129 run_tests();
130
131 @data = (
132     { Subject => 'RT' },
133     { Subject => 'Z', Creator => $uids[0] },
134     { Subject => 'A', Creator => $uids[1] },
135 );
136 @tickets = add_tix_from_data();
137 @test = (
138     { Order => "Creator" },
139 );
140 run_tests();
141
142 @data = (
143     { Subject => 'RT' },
144     { Subject => 'Z', LastUpdatedBy => $uids[0] },
145     { Subject => 'A', LastUpdatedBy => $uids[1] },
146 );
147 @tickets = add_tix_from_data();
148 @test = (
149     { Order => "LastUpdatedBy" },
150 );
151 run_tests();
152