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