import rt 3.8.7
[freeside.git] / rt / t / ticket / search_by_links.t
1 #!/usr/bin/perl -w
2
3 use strict;
4 use warnings;
5
6 use RT::Test tests => 80;
7 use RT::Ticket;
8
9 my $q = RT::Test->load_or_create_queue( Name => 'Regression' );
10 ok $q && $q->id, 'loaded or created queue';
11
12 my ($total, @data, @tickets, %test) = (0, ());
13
14 sub add_tix_from_data {
15     my @res = ();
16     while (@data) {
17         my $t = RT::Ticket->new($RT::SystemUser);
18         my %args = %{ shift(@data) };
19         $args{$_} = $res[ $args{$_} ]->id foreach grep $args{$_}, keys %RT::Ticket::LINKTYPEMAP;
20         my ( $id, undef $msg ) = $t->Create(
21             Queue => $q->id,
22             %args,
23         );
24         ok( $id, "ticket created" ) or diag("error: $msg");
25         push @res, $t;
26         $total++;
27     }
28     return @res;
29 }
30
31 sub run_tests {
32     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
33     foreach my $key ( sort keys %test ) {
34         my $tix = RT::Tickets->new($RT::SystemUser);
35         $tix->FromSQL( "( $query_prefix ) AND ( $key )" );
36
37         my $error = 0;
38
39         my $count = 0;
40         $count++ foreach grep $_, values %{ $test{$key} };
41         is($tix->Count, $count, "found correct number of ticket(s) by '$key'") or $error = 1;
42
43         my $good_tickets = 1;
44         while ( my $ticket = $tix->Next ) {
45             next if $test{$key}->{ $ticket->Subject };
46             diag $ticket->Subject ." ticket has been found when it's not expected";
47             $good_tickets = 0;
48         }
49         ok( $good_tickets, "all tickets are good with '$key'" ) or $error = 1;
50
51         diag "Wrong SQL query for '$key':". $tix->BuildSelectQuery if $error;
52     }
53 }
54
55 # simple set with "no links", "parent and child"
56 @data = (
57     { Subject => '-', },
58     { Subject => 'p', },
59     { Subject => 'c', MemberOf => -1 },
60 );
61 @tickets = add_tix_from_data();
62 %test = (
63     'Linked     IS NOT NULL'  => { '-' => 0, c => 1, p => 1 },
64     'Linked     IS     NULL'  => { '-' => 1, c => 0, p => 0 },
65     'LinkedTo   IS NOT NULL'  => { '-' => 0, c => 1, p => 0 },
66     'LinkedTo   IS     NULL'  => { '-' => 1, c => 0, p => 1 },
67     'LinkedFrom IS NOT NULL'  => { '-' => 0, c => 0, p => 1 },
68     'LinkedFrom IS     NULL'  => { '-' => 1, c => 1, p => 0 },
69
70     'HasMember  IS NOT NULL'  => { '-' => 0, c => 0, p => 1 },
71     'HasMember  IS     NULL'  => { '-' => 1, c => 1, p => 0 },
72     'MemberOf   IS NOT NULL'  => { '-' => 0, c => 1, p => 0 },
73     'MemberOf   IS     NULL'  => { '-' => 1, c => 0, p => 1 },
74
75     'RefersTo   IS NOT NULL'  => { '-' => 0, c => 0, p => 0 },
76     'RefersTo   IS     NULL'  => { '-' => 1, c => 1, p => 1 },
77
78     'Linked      = '. $tickets[0]->id  => { '-' => 0, c => 0, p => 0 },
79     'Linked     != '. $tickets[0]->id  => { '-' => 1, c => 1, p => 1 },
80
81     'MemberOf    = '. $tickets[1]->id  => { '-' => 0, c => 1, p => 0 },
82     'MemberOf   != '. $tickets[1]->id  => { '-' => 1, c => 0, p => 1 },
83 );
84 {
85     my $tix = RT::Tickets->new($RT::SystemUser);
86     $tix->FromSQL("Queue = '". $q->id ."'");
87     is($tix->Count, $total, "found $total tickets");
88 }
89 run_tests();
90
91 # another set with tests of combinations searches
92 @data = (
93     { Subject => '-', },
94     { Subject => 'p', },
95     { Subject => 'rp',  RefersTo => -1 },
96     { Subject => 'c',   MemberOf => -2 },
97     { Subject => 'rc1', RefersTo => -1 },
98     { Subject => 'rc2', RefersTo => -2 },
99 );
100 @tickets = add_tix_from_data();
101 my $pid = $tickets[1]->id;
102 %test = (
103     'RefersTo IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
104     'RefersTo IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
105
106     'RefersTo IS NOT NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
107     'RefersTo IS NOT NULL AND MemberOf IS     NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
108     'RefersTo IS     NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
109     'RefersTo IS     NULL AND MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
110
111     'RefersTo IS NOT NULL OR  MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
112     'RefersTo IS NOT NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
113     'RefersTo IS     NULL OR  MemberOf IS NOT NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
114     'RefersTo IS     NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
115
116     "RefersTo  = $pid AND MemberOf  = $pid" => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
117     "RefersTo  = $pid AND MemberOf != $pid" => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
118     "RefersTo != $pid AND MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
119     "RefersTo != $pid AND MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
120
121     "RefersTo  = $pid OR  MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
122     "RefersTo  = $pid OR  MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
123     "RefersTo != $pid OR  MemberOf  = $pid" => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
124     "RefersTo != $pid OR  MemberOf != $pid" => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
125 );
126 {
127     my $tix = RT::Tickets->new($RT::SystemUser);
128     $tix->FromSQL("Queue = '". $q->id ."'");
129     is($tix->Count, $total, "found $total tickets");
130 }
131 run_tests();
132