import rt 3.8.10
[freeside.git] / rt / lib / t / regression / 23cfsort-freeform-multiple.t
1 #!/usr/bin/perl
2
3 use Test::More tests => 24;
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 # Test Sorting by custom fields.
16
17 diag "Create a queue to test with.";
18 my $queue_name = "CFSortQueue-$$";
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_name - test queue creation. $msg");
27 }
28
29 diag "create a CF\n";
30 my $cf_name = "Order$$";
31 my $cf;
32 {
33     $cf = RT::CustomField->new( $RT::SystemUser );
34     my ($ret, $msg) = $cf->Create(
35         Name  => $cf_name,
36         Queue => $queue->id,
37         Type  => 'FreeformMultiple',
38     );
39     ok($ret, "Custom Field Order created");
40 }
41
42 my ($total, @data, @tickets, @test) = (0, ());
43
44 sub add_tix_from_data {
45     my @res = ();
46     @data = sort { rand(100) <=> rand(100) } @data;
47     while (@data) {
48         my $t = RT::Ticket->new($RT::SystemUser);
49         my %args = %{ shift(@data) };
50         my @values = ();
51         if ( exists $args{'CF'} && ref $args{'CF'} ) {
52             @values = @{ delete $args{'CF'} };
53         } elsif ( exists $args{'CF'} ) {
54             @values = (delete $args{'CF'});
55         }
56         $args{ 'CustomField-'. $cf->id } = \@values
57             if @values;
58         my $subject = join(",", sort @values) || '-';
59         my ( $id, undef $msg ) = $t->Create(
60             %args,
61             Queue => $queue->id,
62             Subject => $subject,
63         );
64         ok( $id, "ticket created" ) or diag("error: $msg");
65         push @res, $t;
66         $total++;
67     }
68     return @res;
69 }
70
71 sub run_tests {
72     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
73     foreach my $test ( @test ) {
74         my $query = join " AND ", map "( $_ )", grep defined && length,
75             $query_prefix, $test->{'Query'};
76
77         foreach my $order (qw(ASC DESC)) {
78             my $error = 0;
79             my $tix = RT::Tickets->new( $RT::SystemUser );
80             $tix->FromSQL( $query );
81             $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order );
82
83             ok($tix->Count, "found ticket(s)")
84                 or $error = 1;
85
86             my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz');
87             while ( my $t = $tix->Next ) {
88                 my $tmp;
89                 if ( $order eq 'ASC' ) {
90                     $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]);
91                 } else {
92                     $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]);
93                 }
94                 if ( $tmp > 0 ) {
95                     $order_ok = 0; last;
96                 }
97                 $last = $t->Subject;
98             }
99
100             ok( $order_ok, "$order order of tickets is good" )
101                 or $error = 1;
102
103             if ( $error ) {
104                 diag "Wrong SQL query:". $tix->BuildSelectQuery;
105                 $tix->GotoFirstItem;
106                 while ( my $t = $tix->Next ) {
107                     diag sprintf "%02d - %s", $t->id, $t->Subject;
108                 }
109             }
110         }
111     }
112 }
113
114 @data = (
115     { },
116     { CF => ['b', 'd'] },
117     { CF => ['a', 'c'] },
118 );
119 @tickets = add_tix_from_data();
120 @test = (
121     { Order => "CF.{$cf_name}" },
122     { Order => "CF.$queue_name.{$cf_name}" },
123 );
124 run_tests();
125
126 @data = (
127     { CF => ['m', 'a'] },
128     { CF => ['m'] },
129     { CF => ['m', 'o'] },
130 );
131 @tickets = add_tix_from_data();
132 @test = (
133     { Order => "CF.{$cf_name}", Query => "CF.{$cf_name} = 'm'" },
134     { Order => "CF.$queue_name.{$cf_name}", Query => "CF.{$cf_name} = 'm'" },
135 );
136 run_tests();
137