3 BEGIN { $ENV{'LANG'} = 'C' }
10 use RT::Test tests => 27;
11 use_ok('RT::SavedSearch');
12 use_ok('RT::SavedSearches');
16 # Set up some infrastructure. These calls are tested elsewhere.
18 my $searchuser = RT::User->new($RT::SystemUser);
19 my ($ret, $msg) = $searchuser->Create(Name => 'searchuser'.$$,
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');
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',
34 $searchuser->PrincipalObj->GrantRight(Right => 'ShowSavedSearches',
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);
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);
49 my $ticket = RT::Ticket->new($RT::SystemUser);
50 $ticket->Create(Queue => $queue->Id,
51 Requestor => [ $searchuser->Name ],
53 Subject => 'saved search test');
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\',
66 \'<small>__Requestors__</small>\',
67 \'<small>__CreatedRelative__</small>\',
68 \'<small>__ToldRelative__</small>\',
69 \'<small>__LastUpdatedRelative__</small>\',
70 \'<small>__TimeLeft__</small>\'';
72 my $mysearch = RT::SavedSearch->new($curruser);
73 ($ret, $msg) = $mysearch->Save(Privacy => 'RT::User-' . $searchuser->Id,
75 Name => 'owned by me',
76 SearchParams => {'Format' => $format,
77 'Query' => "Owner = '"
80 ok($ret, "mysearch was created");
83 my $groupsearch = RT::SavedSearch->new($curruser);
84 ($ret, $msg) = $groupsearch->Save(Privacy => 'RT::Group-' . $ingroup->Id,
86 Name => 'search queue',
87 SearchParams => {'Format' => $format,
88 'Query' => "Queue = '"
89 . $queue->Name . "'"});
90 ok($ret, "groupsearch was created");
92 my $othersearch = RT::SavedSearch->new($curruser);
93 ($ret, $msg) = $othersearch->Save(Privacy => 'RT::Group-' . $outgroup->Id,
95 Name => 'searchuser requested',
96 SearchParams => {'Format' => $format,
98 "Requestor.Name LIKE 'search'"});
99 ok(!$ret, "othersearch NOT created");
100 like($msg, qr/Failed to load object for/, "...for the right reason");
102 $othersearch = RT::SavedSearch->new($RT::SystemUser);
103 ($ret, $msg) = $othersearch->Save(Privacy => 'RT::Group-' . $outgroup->Id,
105 Name => 'searchuser requested',
106 SearchParams => {'Format' => $format,
108 "Requestor.Name LIKE 'search'"});
109 ok($ret, "othersearch created by systemuser");
111 # Now try to load some searches.
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");
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");
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");
145 # This should fail -- no permission.
146 my $loadedsearch4 = RT::SavedSearch->new($curruser);
149 $loadedsearch4->Load($othersearch->Privacy, $othersearch->Id);
150 } qr/Could not load object RT::Group-\d+ when loading search/;
152 isnt($loadedsearch4->Id, $othersearch->Id, "Did not load othersearch");
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");
165 ## Right ho. Test the pseudo-collection object.
167 my $genericsearch = RT::SavedSearch->new($curruser);
168 $genericsearch->Save(Name => 'generic search',
170 SearchParams => {'Query' => "Queue = 'General'"});
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");
176 my $allsearches = RT::SavedSearches->new($curruser);
177 $allsearches->LimitToPrivacy('RT::User-'.$curruser->Id);
178 is($allsearches->Count, 2, "Found all searchuser's searches");
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");