starting to work...
[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 nodata => 1, tests => 98;
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, @tickets, %test) = (0, ());
13
14 sub run_tests {
15     my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets;
16     foreach my $key ( sort keys %test ) {
17         my $tix = RT::Tickets->new(RT->SystemUser);
18         $tix->FromSQL( "( $query_prefix ) AND ( $key )" );
19
20         my $error = 0;
21
22         my $count = 0;
23         $count++ foreach grep $_, values %{ $test{$key} };
24         is($tix->Count, $count, "found correct number of ticket(s) by '$key'") or $error = 1;
25
26         my $good_tickets = 1;
27         while ( my $ticket = $tix->Next ) {
28             next if $test{$key}->{ $ticket->Subject };
29             diag $ticket->Subject ." ticket has been found when it's not expected";
30             $good_tickets = 0;
31         }
32         ok( $good_tickets, "all tickets are good with '$key'" ) or $error = 1;
33
34         diag "Wrong SQL query for '$key':". $tix->BuildSelectQuery if $error;
35     }
36 }
37
38 # simple set with "no links", "parent and child"
39 @tickets = RT::Test->create_tickets(
40     { Queue => $q->id },
41     { Subject => '-', },
42     { Subject => 'p', },
43     { Subject => 'c', MemberOf => -1 },
44 );
45 $total += @tickets;
46 %test = (
47     'Linked     IS NOT NULL'  => { '-' => 0, c => 1, p => 1 },
48     'Linked     IS     NULL'  => { '-' => 1, c => 0, p => 0 },
49     'LinkedTo   IS NOT NULL'  => { '-' => 0, c => 1, p => 0 },
50     'LinkedTo   IS     NULL'  => { '-' => 1, c => 0, p => 1 },
51     'LinkedFrom IS NOT NULL'  => { '-' => 0, c => 0, p => 1 },
52     'LinkedFrom IS     NULL'  => { '-' => 1, c => 1, p => 0 },
53
54     'HasMember  IS NOT NULL'  => { '-' => 0, c => 0, p => 1 },
55     'HasMember  IS     NULL'  => { '-' => 1, c => 1, p => 0 },
56     'MemberOf   IS NOT NULL'  => { '-' => 0, c => 1, p => 0 },
57     'MemberOf   IS     NULL'  => { '-' => 1, c => 0, p => 1 },
58
59     'RefersTo   IS NOT NULL'  => { '-' => 0, c => 0, p => 0 },
60     'RefersTo   IS     NULL'  => { '-' => 1, c => 1, p => 1 },
61
62     'Linked      = '. $tickets[0]->id  => { '-' => 0, c => 0, p => 0 },
63     'Linked     != '. $tickets[0]->id  => { '-' => 1, c => 1, p => 1 },
64
65     'MemberOf    = '. $tickets[1]->id  => { '-' => 0, c => 1, p => 0 },
66     'MemberOf   != '. $tickets[1]->id  => { '-' => 1, c => 0, p => 1 },
67 );
68 {
69     my $tix = RT::Tickets->new(RT->SystemUser);
70     $tix->FromSQL("Queue = '". $q->id ."'");
71     is($tix->Count, $total, "found $total tickets");
72 }
73 run_tests();
74
75 # another set with tests of combinations searches
76 @tickets = RT::Test->create_tickets(
77     { Queue => $q->id },
78     { Subject => '-', },
79     { Subject => 'p', },
80     { Subject => 'rp',  RefersTo => -1 },
81     { Subject => 'c',   MemberOf => -2 },
82     { Subject => 'rc1', RefersTo => -1 },
83     { Subject => 'rc2', RefersTo => -2 },
84 );
85 $total += @tickets;
86 my $pid = $tickets[1]->id;
87 %test = (
88     'RefersTo IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
89     'RefersTo IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
90
91     'RefersTo IS NOT NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
92     'RefersTo IS NOT NULL AND MemberOf IS     NULL'  => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
93     'RefersTo IS     NULL AND MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
94     'RefersTo IS     NULL AND MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
95
96     'RefersTo IS NOT NULL OR  MemberOf IS NOT NULL'  => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 1, rc2 => 1 },
97     'RefersTo IS NOT NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
98     'RefersTo IS     NULL OR  MemberOf IS NOT NULL'  => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 0, rc2 => 0 },
99     'RefersTo IS     NULL OR  MemberOf IS     NULL'  => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
100
101     "RefersTo  = $pid AND MemberOf  = $pid" => { '-' => 0, c => 0, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
102     "RefersTo  = $pid AND MemberOf != $pid" => { '-' => 0, c => 0, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
103     "RefersTo != $pid AND MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 0, rc1 => 0, rc2 => 0 },
104     "RefersTo != $pid AND MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
105
106     "RefersTo  = $pid OR  MemberOf  = $pid" => { '-' => 0, c => 1, p => 0, rp => 1, rc1 => 0, rc2 => 0 },
107     "RefersTo  = $pid OR  MemberOf != $pid" => { '-' => 1, c => 0, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
108     "RefersTo != $pid OR  MemberOf  = $pid" => { '-' => 1, c => 1, p => 1, rp => 0, rc1 => 1, rc2 => 1 },
109     "RefersTo != $pid OR  MemberOf != $pid" => { '-' => 1, c => 1, p => 1, rp => 1, rc1 => 1, rc2 => 1 },
110 );
111 {
112     my $tix = RT::Tickets->new(RT->SystemUser);
113     $tix->FromSQL("Queue = '". $q->id ."'");
114     is($tix->Count, $total, "found $total tickets");
115 }
116 run_tests();
117
118 @tickets = ();
119