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