fix ticketing system error on bootstrap of new install
[freeside.git] / rt / t / ticket / sort-by-user.t
1
2 use RT::Test nodata => 1, tests => 52;
3
4 use strict;
5 use warnings;
6
7 use RT::Tickets;
8 use RT::Queue;
9 use RT::CustomField;
10
11 #########################################################
12 # Test sorting by Owner, Creator and LastUpdatedBy
13 # we sort by user name
14 #########################################################
15
16 diag "Create a queue to test with.";
17 my $queue_name = "OwnerSortQueue$$";
18 my $queue;
19 {
20     $queue = RT::Queue->new( RT->SystemUser );
21     my ($ret, $msg) = $queue->Create(
22         Name => $queue_name,
23         Description => 'queue for custom field sort testing'
24     );
25     ok($ret, "$queue test queue creation. $msg");
26 }
27
28 my @uids;
29 my @users;
30 # create them in reverse order to avoid false positives
31 foreach my $u (qw(Z A)) {
32     my $name = $u ."-user-to-test-ordering-$$";
33     my $user = RT::User->new( RT->SystemUser );
34     my ($uid) = $user->Create(
35         Name => $name,
36         Privileged => 1,
37     );
38     ok $uid, "created user #$uid";
39
40     my ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue );
41     ok $status, "granted right";
42     ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'CreateTicket', Object => $queue );
43     ok $status, "granted right";
44
45     push @users, $user;
46     push @uids, $user->id;
47 }
48
49 my (@data, @tickets, @test) = (0, ());
50
51
52 sub run_tests {
53     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
54     foreach my $test ( @test ) {
55         my $query = join " AND ", map "( $_ )", grep defined && length,
56             $query_prefix, $test->{'Query'};
57
58         foreach my $order (qw(ASC DESC)) {
59             my $error = 0;
60             my $tix = RT::Tickets->new( RT->SystemUser );
61             $tix->FromSQL( $query );
62             $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
63
64             ok($tix->Count, "found ticket(s)")
65                 or $error = 1;
66
67             my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
68             while ( my $t = $tix->Next ) {
69                 my $tmp;
70                 if ( $order eq 'ASC' ) {
71                     $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
72                 } else {
73                     $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
74                 }
75                 if ( $tmp > 0 ) {
76                     $order_ok = 0; last;
77                 }
78                 $last = $t->Subject;
79             }
80
81             ok( $order_ok, "$order order of tickets is good" )
82                 or $error = 1;
83
84             if ( $error ) {
85                 diag "Wrong SQL query:". $tix->BuildSelectQuery;
86                 $tix->GotoFirstItem;
87                 while ( my $t = $tix->Next ) {
88                     diag sprintf "%02d - %s", $t->id, $t->Subject;
89                 }
90             }
91         }
92     }
93 }
94
95 @data = (
96     { Subject => 'Nobody' },
97     { Subject => 'Z', Owner => $uids[0] },
98     { Subject => 'A', Owner => $uids[1] },
99 );
100
101 @tickets = RT::Test->create_tickets( { Queue => $queue->id }, @data );
102
103 @test = (
104     { Order => "Owner" },
105 );
106 run_tests();
107
108 @data = (
109     { Subject => 'RT' },
110     { Subject => 'Z', Creator => $uids[0] },
111     { Subject => 'A', Creator => $uids[1] },
112 );
113 @tickets = RT::Test->create_tickets( { Queue => $queue->id }, @data );
114 @test = (
115     { Order => "Creator" },
116 );
117 run_tests();
118
119 @data = (
120     { Subject => 'RT' },
121     { Subject => 'Z', LastUpdatedBy => $uids[0] },
122     { Subject => 'A', LastUpdatedBy => $uids[1] },
123 );
124 @tickets = RT::Test->create_tickets( { Queue => $queue->id }, @data );
125 @test = (
126     { Order => "LastUpdatedBy" },
127 );
128 run_tests();
129
130 @tickets = ();