import rt 3.8.10
[freeside.git] / rt / lib / t / regression / 20-sort-by-user.t
1 #!/usr/bin/perl
2
3 use Test::More tests => 32;
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 Owner, Creator and LastUpdatedBy
17 # we sort by user name
18 #########################################################
19
20 diag "Create a queue to test with.";
21 my $queue_name = "OwnerSortQueue$$";
22 my $queue;
23 {
24     $queue = RT::Queue->new( $RT::SystemUser );
25     my ($ret, $msg) = $queue->Create(
26         Name => $queue,
27         Description => 'queue for custom field sort testing'
28     );
29     ok($ret, "$queue test queue creation. $msg");
30 }
31
32 my @uids;
33 my @users;
34 # create them in reverse order to avoid false positives
35 foreach my $u (qw(Z A)) {
36     my $name = $u ."-user-to-test-ordering-$$";
37     my $user = RT::User->new( $RT::SystemUser );
38     my ($uid) = $user->Create(
39         Name => $name,
40         Privileged => 1,
41     );
42     ok $uid, "created user #$uid";
43
44     my ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue );
45     ok $status, "granted right";
46     ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'CreateTicket', Object => $queue );
47     ok $status, "granted right";
48
49     push @users, $user;
50     push @uids, $user->id;
51 }
52
53 my ($total, @data, @tickets, @test) = (0, ());
54
55 sub add_tix_from_data {
56     my @res = ();
57     @data = sort { rand(100) <=> rand(100) } @data;
58     while (@data) {
59         my $t = RT::Ticket->new($RT::SystemUser);
60         my %args = %{ shift(@data) };
61
62         my ( $id, undef, $msg ) = $t->Create( %args, Queue => $queue->id );
63         if ( $args{'Owner'} ) {
64             is $t->Owner, $args{'Owner'}, "owner is correct";
65         }
66         if ( $args{'Creator'} ) {
67             is $t->Creator, $args{'Creator'}, "creator is correct";
68         }
69         # hackish, but simpler
70         if ( $args{'LastUpdatedBy'} ) {
71             $t->__Set( Field => 'LastUpdatedBy', Value => $args{'LastUpdatedBy'} );
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     { Subject => 'Nobody' },
125     { Subject => 'Z', Owner => $uids[0] },
126     { Subject => 'A', Owner => $uids[1] },
127 );
128 @tickets = add_tix_from_data();
129 @test = (
130     { Order => "Owner" },
131 );
132 run_tests();
133
134 @data = (
135     { Subject => 'RT' },
136     { Subject => 'Z', Creator => $uids[0] },
137     { Subject => 'A', Creator => $uids[1] },
138 );
139 @tickets = add_tix_from_data();
140 @test = (
141     { Order => "Creator" },
142 );
143 run_tests();
144
145 @data = (
146     { Subject => 'RT' },
147     { Subject => 'Z', LastUpdatedBy => $uids[0] },
148     { Subject => 'A', LastUpdatedBy => $uids[1] },
149 );
150 @tickets = add_tix_from_data();
151 @test = (
152     { Order => "LastUpdatedBy" },
153 );
154 run_tests();
155