d25d3002e15a542c1d9110f83802664827538883
[freeside.git] / rt / t / ticket / search_by_links.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test nodata => 1, tests => 98;
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 # another set with tests of combinations searches
75 @tickets = RT::Test->create_tickets(
76     { Queue => $q->id },
77     { Subject => '-', },
78     { Subject => 'p', },
79     { Subject => 'rp',  RefersTo => -1 },
80     { Subject => 'c',   MemberOf => -2 },
81     { Subject => 'rc1', RefersTo => -1 },
82     { Subject => 'rc2', RefersTo => -2 },
83 );
84 $total += @tickets;
85 my $pid = $tickets[1]->id;
86 %test = (
87     'RefersTo IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
88     'RefersTo IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
89
90     'RefersTo IS NOT NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
91     'RefersTo IS NOT NULL AND MemberOf IS     NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
92     'RefersTo IS     NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
93     'RefersTo IS     NULL AND MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
94
95     'RefersTo IS NOT NULL OR  MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
96     'RefersTo IS NOT NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
97     'RefersTo IS     NULL OR  MemberOf IS NOT NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
98     'RefersTo IS     NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
99
100     "RefersTo  = $pid AND MemberOf  = $pid" => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
101     "RefersTo  = $pid AND MemberOf != $pid" => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
102     "RefersTo != $pid AND MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
103     "RefersTo != $pid AND MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
104
105     "RefersTo  = $pid OR  MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
106     "RefersTo  = $pid OR  MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
107     "RefersTo != $pid OR  MemberOf  = $pid" => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
108     "RefersTo != $pid OR  MemberOf != $pid" => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
109 );
110 {
111     my $tix = RT::Tickets->new(RT->SystemUser);
112     $tix->FromSQL("Queue = '". $q->id ."'");
113     is($tix->Count, $total, "found $total tickets");
114 }
115 run_tests();
116
117 @tickets = ();
118