This commit was generated by cvs2svn to compensate for changes in r8690,
[freeside.git] / rt / t / savedsearch.t
1 use strict;
2 use warnings;
3 BEGIN { $ENV{'LANG'} = 'C' }
4 use RT;
5 use RT::User;
6 use RT::Group;
7 use RT::Ticket;
8 use RT::Queue;
9
10 use RT::Test tests => 27;
11 use_ok('RT::SavedSearch');
12 use_ok('RT::SavedSearches');
13
14 use Test::Warn;
15
16 # Set up some infrastructure.  These calls are tested elsewhere.
17
18 my $searchuser = RT::User->new($RT::SystemUser);
19 my ($ret, $msg) = $searchuser->Create(Name => 'searchuser'.$$,
20                     Privileged => 1,
21                     EmailAddress => "searchuser\@p$$.example.com",
22                     RealName => 'Search user');
23 ok($ret, "created searchuser: $msg");
24 $searchuser->PrincipalObj->GrantRight(Right => 'LoadSavedSearch');
25 $searchuser->PrincipalObj->GrantRight(Right => 'CreateSavedSearch');
26 $searchuser->PrincipalObj->GrantRight(Right => 'ModifySelf');
27
28 # This is the group whose searches searchuser should be able to see.
29 my $ingroup = RT::Group->new($RT::SystemUser);
30 $ingroup->CreateUserDefinedGroup(Name => 'searchgroup1'.$$);
31 $ingroup->AddMember($searchuser->Id);
32 $searchuser->PrincipalObj->GrantRight(Right => 'EditSavedSearches',
33                                       Object => $ingroup);
34 $searchuser->PrincipalObj->GrantRight(Right => 'ShowSavedSearches',
35                                       Object => $ingroup);
36
37 # This is the group whose searches searchuser should not be able to see.
38 my $outgroup = RT::Group->new($RT::SystemUser);
39 $outgroup->CreateUserDefinedGroup(Name => 'searchgroup2'.$$);
40 $outgroup->AddMember($RT::SystemUser->Id);
41
42 my $queue = RT::Queue->new($RT::SystemUser);
43 $queue->Create(Name => 'SearchQueue'.$$);
44 $searchuser->PrincipalObj->GrantRight(Right => 'SeeQueue', Object => $queue);
45 $searchuser->PrincipalObj->GrantRight(Right => 'ShowTicket', Object => $queue);
46 $searchuser->PrincipalObj->GrantRight(Right => 'OwnTicket', Object => $queue);
47
48
49 my $ticket = RT::Ticket->new($RT::SystemUser);
50 $ticket->Create(Queue => $queue->Id,
51                 Requestor => [ $searchuser->Name ],
52                 Owner => $searchuser,
53                 Subject => 'saved search test');
54
55
56 # Now start the search madness.
57 my $curruser = RT::CurrentUser->new($searchuser);
58 my $format = '\'   <b><a href="/Ticket/Display.html?id=__id__">__id__</a></b>/TITLE:#\',
59 \'<b><a href="/Ticket/Display.html?id=__id__">__Subject__</a></b>/TITLE:Subject\',
60 \'__Status__\',
61 \'__QueueName__\',
62 \'__OwnerName__\',
63 \'__Priority__\',
64 \'__NEWLINE__\',
65 \'\',
66 \'<small>__Requestors__</small>\',
67 \'<small>__CreatedRelative__</small>\',
68 \'<small>__ToldRelative__</small>\',
69 \'<small>__LastUpdatedRelative__</small>\',
70 \'<small>__TimeLeft__</small>\'';
71
72 my $mysearch = RT::SavedSearch->new($curruser);
73 ($ret, $msg) = $mysearch->Save(Privacy => 'RT::User-' . $searchuser->Id,
74                                Type => 'Ticket',
75                                Name => 'owned by me',
76                                SearchParams => {'Format' => $format,
77                                                 'Query' => "Owner = '" 
78                                                     . $searchuser->Name 
79                                                     . "'"});
80 ok($ret, "mysearch was created");
81
82
83 my $groupsearch = RT::SavedSearch->new($curruser);
84 ($ret, $msg) = $groupsearch->Save(Privacy => 'RT::Group-' . $ingroup->Id,
85                                   Type => 'Ticket',
86                                   Name => 'search queue',
87                                   SearchParams => {'Format' => $format,
88                                                    'Query' => "Queue = '"
89                                                        . $queue->Name . "'"});
90 ok($ret, "groupsearch was created");
91
92 my $othersearch = RT::SavedSearch->new($curruser);
93 ($ret, $msg) = $othersearch->Save(Privacy => 'RT::Group-' . $outgroup->Id,
94                                   Type => 'Ticket',
95                                   Name => 'searchuser requested',
96                                   SearchParams => {'Format' => $format,
97                                                    'Query' => 
98                                                        "Requestor.Name LIKE 'search'"});
99 ok(!$ret, "othersearch NOT created");
100 like($msg, qr/Failed to load object for/, "...for the right reason");
101
102 $othersearch = RT::SavedSearch->new($RT::SystemUser);
103 ($ret, $msg) = $othersearch->Save(Privacy => 'RT::Group-' . $outgroup->Id,
104                                   Type => 'Ticket',
105                                   Name => 'searchuser requested',
106                                   SearchParams => {'Format' => $format,
107                                                    'Query' => 
108                                                        "Requestor.Name LIKE 'search'"});
109 ok($ret, "othersearch created by systemuser");
110
111 # Now try to load some searches.
112
113 # This should work.
114 my $loadedsearch1 = RT::SavedSearch->new($curruser);
115 $loadedsearch1->Load('RT::User-'.$curruser->Id, $mysearch->Id);
116 is($loadedsearch1->Id, $mysearch->Id, "Loaded mysearch");
117 like($loadedsearch1->GetParameter('Query'), qr/Owner/, 
118      "Retrieved query of mysearch");
119 # Check through the other accessor methods.
120 is($loadedsearch1->Privacy, 'RT::User-' . $curruser->Id,
121    "Privacy of mysearch correct");
122 is($loadedsearch1->Name, 'owned by me', "Name of mysearch correct");
123 is($loadedsearch1->Type, 'Ticket', "Type of mysearch correct");
124
125 # See if it can be used to search for tickets.
126 my $tickets = RT::Tickets->new($curruser);
127 $tickets->FromSQL($loadedsearch1->GetParameter('Query'));
128 is($tickets->Count, 1, "Found a ticket");
129
130 # This should fail -- wrong object.
131 # my $loadedsearch2 = RT::SavedSearch->new($curruser);
132 # $loadedsearch2->Load('RT::User-'.$curruser->Id, $groupsearch->Id);
133 # isnt($loadedsearch2->Id, $othersearch->Id, "Didn't load groupsearch as mine");
134 # ...but this should succeed.
135 my $loadedsearch3 = RT::SavedSearch->new($curruser);
136 $loadedsearch3->Load('RT::Group-'.$ingroup->Id, $groupsearch->Id);
137 is($loadedsearch3->Id, $groupsearch->Id, "Loaded groupsearch");
138 like($loadedsearch3->GetParameter('Query'), qr/Queue/,
139      "Retrieved query of groupsearch");
140 # Can it get tickets?
141 $tickets = RT::Tickets->new($curruser);
142 $tickets->FromSQL($loadedsearch3->GetParameter('Query'));
143 is($tickets->Count, 1, "Found a ticket");
144
145 # This should fail -- no permission.
146 my $loadedsearch4 = RT::SavedSearch->new($curruser);
147
148 warning_like {
149     $loadedsearch4->Load($othersearch->Privacy, $othersearch->Id);
150 } qr/Could not load object RT::Group-\d+ when loading search/;
151
152 isnt($loadedsearch4->Id, $othersearch->Id, "Did not load othersearch");
153
154 # Try to update an existing search.
155 $loadedsearch1->Update( SearchParams => {'Format' => $format,
156                         'Query' => "Queue = '" . $queue->Name . "'" } );
157 like($loadedsearch1->GetParameter('Query'), qr/Queue/,
158      "Updated mysearch parameter");
159 is($loadedsearch1->Type, 'Ticket', "mysearch is still for tickets");
160 is($loadedsearch1->Privacy, 'RT::User-'.$curruser->Id,
161    "mysearch still belongs to searchuser");
162 like($mysearch->GetParameter('Query'), qr/Queue/, "other mysearch object updated");
163
164
165 ## Right ho.  Test the pseudo-collection object.
166
167 my $genericsearch = RT::SavedSearch->new($curruser);
168 $genericsearch->Save(Name => 'generic search',
169                      Type => 'all',
170                      SearchParams => {'Query' => "Queue = 'General'"});
171
172 my $ticketsearches = RT::SavedSearches->new($curruser);
173 $ticketsearches->LimitToPrivacy('RT::User-'.$curruser->Id, 'Ticket');
174 is($ticketsearches->Count, 1, "Found searchuser's ticket searches");
175
176 my $allsearches = RT::SavedSearches->new($curruser);
177 $allsearches->LimitToPrivacy('RT::User-'.$curruser->Id);
178 is($allsearches->Count, 2, "Found all searchuser's searches");
179
180 # Delete a search.
181 ($ret, $msg) = $genericsearch->Delete;
182 ok($ret, "Deleted genericsearch");
183 $allsearches->LimitToPrivacy('RT::User-'.$curruser->Id);
184 is($allsearches->Count, 1, "Found all searchuser's searches after deletion");
185