]> source.dussan.org Git - archiva.git/blob
87dff73e1d7f0c40357201b536bdf53b16aa813c
[archiva.git] /
1 package org.apache.maven.archiva.web.action;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.apache.archiva.indexer.search.RepositorySearch;
26 import org.apache.archiva.indexer.search.SearchFields;
27 import org.apache.archiva.indexer.search.SearchResultHit;
28 import org.apache.archiva.indexer.search.SearchResultLimits;
29 import org.apache.archiva.indexer.search.SearchResults;
30 import org.apache.archiva.indexer.util.SearchUtil;
31 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
32 import org.apache.maven.archiva.database.ArchivaDAO;
33 import org.apache.maven.archiva.database.ArtifactDAO;
34 import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
35 import org.apache.maven.archiva.database.constraints.UniqueVersionConstraint;
36 import org.apache.maven.archiva.model.ArchivaArtifact;
37 import org.apache.maven.archiva.security.UserRepositories;
38 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
39 import org.easymock.MockControl;
40
41 import com.opensymphony.xwork2.Action;
42
43 /**
44  * 
45  */
46 public class SearchActionTest
47     extends PlexusInSpringTestCase 
48 {
49     private SearchAction action;
50     
51     private MockControl archivaConfigControl;
52     
53     private ArchivaConfiguration archivaConfig;
54     
55     private MockControl daoControl;
56     
57     private ArchivaDAO dao;
58     
59     private MockControl userReposControl;
60     
61     private UserRepositories userRepos;
62     
63     private MockControl searchControl;
64     
65     private RepositorySearch search;
66     
67     private MockControl artifactDaoControl;
68     
69     private ArtifactDAO artifactDao;
70     
71     @Override
72     protected void setUp() 
73         throws Exception
74     {
75         super.setUp();
76         
77         action = new SearchAction();
78         
79         archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class );        
80         archivaConfig = ( ArchivaConfiguration ) archivaConfigControl.getMock();
81         
82         daoControl = MockControl.createControl( ArchivaDAO.class );
83         daoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );        
84         dao = ( ArchivaDAO ) daoControl.getMock();
85         
86         userReposControl = MockControl.createControl( UserRepositories.class );        
87         userRepos = ( UserRepositories ) userReposControl.getMock();
88         
89         searchControl = MockControl.createControl( RepositorySearch.class );
90         searchControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
91         search = ( RepositorySearch ) searchControl.getMock();
92         
93         artifactDaoControl = MockControl.createControl( ArtifactDAO.class );
94         artifactDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
95         artifactDao = ( ArtifactDAO ) artifactDaoControl.getMock();
96                 
97         action.setArchivaConfiguration( archivaConfig );
98         action.setUserRepositories( userRepos );
99         action.setDao( dao );
100         action.setNexusSearch( search );
101     }
102     
103     @Override
104     protected void tearDown()
105         throws Exception
106     {
107         super.tearDown();
108     }
109     
110     // quick search...
111     
112     public void testQuickSearch()
113         throws Exception
114     {           
115         action.setQ( "archiva" );
116         action.setCurrentPage( 0 );
117         action.setSearchResultsOnly( false );
118         action.setCompleteQueryString( "" );
119         
120         List<String> selectedRepos = new ArrayList<String>();
121         selectedRepos.add( "internal" );
122         selectedRepos.add( "snapshots" );
123         
124         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
125         limits.setPageSize( 30 );
126         
127         SearchResultHit hit = new SearchResultHit();
128         hit.setGroupId( "org.apache.archiva" );
129         hit.setArtifactId( "archiva-configuration" );
130         hit.setUrl( "url" );
131         hit.addVersion( "1.0" );
132         hit.addVersion( "1.1" );        
133         
134         SearchResults results = new SearchResults();
135         results.setLimits( limits );
136         results.setTotalHits( 1 );
137         results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-configuration" ), hit );
138         
139         List<String> versions = new ArrayList<String>();
140         versions.add( "1.0" );
141         versions.add( "1.1" );
142         
143         userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( "user" ), selectedRepos, 2 );
144         
145         searchControl.expectAndReturn( search.search( "user", selectedRepos, "archiva", limits, null ), results );
146                 
147         daoControl.expectAndReturn( dao.query( new UniqueVersionConstraint( selectedRepos, hit.getGroupId(), hit.getArtifactId() ) ), versions );
148                 
149         userReposControl.replay();
150         searchControl.replay();
151         daoControl.replay();
152         
153         action.setPrincipal( "user" );
154         String result = action.quickSearch();
155         
156         assertEquals( Action.SUCCESS, result );      
157         assertEquals( 1, action.getTotalPages() );
158         assertEquals( 1, action.getResults().getTotalHits() );
159         
160         userReposControl.verify();
161         searchControl.verify();
162         daoControl.verify();
163     }
164
165     public void testSearchWithinSearchResults()
166         throws Exception
167     {
168         action.setQ( "archiva" );
169         action.setCurrentPage( 0 );
170         action.setSearchResultsOnly( true );
171         action.setCompleteQueryString( "org;apache" );
172         
173         List<String> parsed = new ArrayList<String>();
174         parsed.add( "org" );
175         parsed.add( "apache" );
176         
177         List<String> selectedRepos = new ArrayList<String>();
178         selectedRepos.add( "internal" );
179         selectedRepos.add( "snapshots" );
180         
181         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
182         limits.setPageSize( 30 );
183         
184         SearchResultHit hit = new SearchResultHit();
185         hit.setGroupId( "org.apache.archiva" );
186         hit.setArtifactId( "archiva-configuration" );
187         hit.setUrl( "url" );
188         hit.addVersion( "1.0" );
189         hit.addVersion( "1.1" );        
190         
191         SearchResults results = new SearchResults();
192         results.setLimits( limits );
193         results.setTotalHits( 1 );
194         results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-configuration" ), hit );
195         
196         List<String> versions = new ArrayList<String>();
197         versions.add( "1.0" );
198         versions.add( "1.1" );
199         
200         userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( "user" ), selectedRepos, 2 );
201         
202         searchControl.expectAndReturn( search.search( "user", selectedRepos, "archiva", limits, parsed ), results );
203                 
204         daoControl.expectAndReturn( dao.query( new UniqueVersionConstraint( selectedRepos, hit.getGroupId(), hit.getArtifactId() ) ), versions );
205                 
206         userReposControl.replay();
207         searchControl.replay();
208         daoControl.replay();
209         
210         action.setPrincipal( "user" );
211         String result = action.quickSearch();
212         
213         assertEquals( Action.SUCCESS, result );
214         assertEquals( "org;apache;archiva", action.getCompleteQueryString() );
215         assertEquals( 1, action.getTotalPages() );
216         assertEquals( 1, action.getResults().getTotalHits() );
217         
218         userReposControl.verify();
219         searchControl.verify();
220         daoControl.verify();
221     }        
222     
223     public void testQuickSearchUserHasNoAccessToAnyRepository()
224         throws Exception
225     {
226         action.setQ( "archiva" );
227         action.setCurrentPage( 0 );
228         
229         List<String> selectedRepos = new ArrayList<String>();
230         
231         userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( "user" ), selectedRepos );
232         
233         userReposControl.replay();
234         
235         action.setPrincipal( "user" );
236         String result = action.quickSearch();
237         
238         assertEquals( GlobalResults.ACCESS_TO_NO_REPOS, result );        
239         
240         userReposControl.verify();        
241     }
242     
243     public void testQuickSearchNoSearchHits()
244         throws Exception
245     {
246         action.setQ( "archiva" );
247         action.setCurrentPage( 0 );
248         action.setSearchResultsOnly( false );
249         action.setCompleteQueryString( "" );
250         
251         List<String> selectedRepos = new ArrayList<String>();
252         selectedRepos.add( "internal" );
253         selectedRepos.add( "snapshots" );
254         
255         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
256         limits.setPageSize( 30 );
257                 
258         SearchResults results = new SearchResults();
259         
260         userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( "user" ), selectedRepos );
261         
262         searchControl.expectAndReturn( search.search( "user", selectedRepos, "archiva", limits, null ), results );
263         
264         userReposControl.replay();
265         searchControl.replay();
266         
267         action.setPrincipal( "user" );
268         String result = action.quickSearch();
269         
270         assertEquals( Action.INPUT, result );        
271         
272         userReposControl.verify();
273         searchControl.verify();
274     }
275         
276     // advanced/filtered search...
277     
278     public void testAdvancedSearchOneRepository()
279         throws Exception
280     {
281         List<String> managedRepos = new ArrayList<String>();
282         managedRepos.add( "internal" );
283         managedRepos.add( "snapshots" );
284         
285         action.setRepositoryId( "internal" );
286         action.setManagedRepositoryList( managedRepos );
287         action.setCurrentPage( 0 );
288         action.setRowCount( 30 );
289         action.setGroupId( "org" );
290         
291         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
292         limits.setPageSize( 30 );
293         
294         SearchResultHit hit = new SearchResultHit();
295         hit.setGroupId( "org.apache.archiva" );
296         hit.setArtifactId( "archiva-configuration" );
297         hit.setUrl( "url" );
298         hit.addVersion( "1.0" );
299         hit.addVersion( "1.1" );        
300         
301         SearchResults results = new SearchResults();
302         results.setLimits( limits );
303         results.setTotalHits( 1 );
304         results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-configuration" ), hit );
305         
306         List<String> selectedRepos = new ArrayList<String>();
307         selectedRepos.add( "internal" );
308         selectedRepos.add( "snapshots" );
309         
310         SearchFields searchFields = new SearchFields( "org", null, null, null, null, selectedRepos );
311         
312         searchControl.expectAndReturn( search.search( "user", searchFields, limits ), results );
313         
314         searchControl.replay();
315         
316         String result = action.filteredSearch();
317         
318         assertEquals( Action.SUCCESS, result );
319         assertEquals( 1, action.getTotalPages() );
320         assertEquals( 1, action.getResults().getTotalHits() );
321         
322         searchControl.verify();
323     }
324     
325     public void testAdvancedSearchAllRepositories()
326         throws Exception
327     {   
328         List<String> managedRepos = new ArrayList<String>();
329         managedRepos.add( "internal" );
330         managedRepos.add( "snapshots" );
331         
332         action.setRepositoryId( "all" );
333         action.setManagedRepositoryList( managedRepos );
334         action.setCurrentPage( 0 );
335         action.setRowCount( 30 );
336         action.setGroupId( "org" );
337         
338         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
339         limits.setPageSize( 30 );
340         
341         SearchResultHit hit = new SearchResultHit();
342         hit.setGroupId( "org.apache.archiva" );
343         hit.setArtifactId( "archiva-configuration" );
344         hit.setUrl( "url" );
345         hit.addVersion( "1.0" );
346         hit.addVersion( "1.1" );        
347         
348         SearchResults results = new SearchResults();
349         results.setLimits( limits );
350         results.setTotalHits( 1 );
351         results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-configuration" ), hit );
352         
353         List<String> selectedRepos = new ArrayList<String>();
354         selectedRepos.add( "internal" );
355         
356         SearchFields searchFields = new SearchFields( "org", null, null, null, null, selectedRepos );
357         
358         userReposControl.expectAndReturn( userRepos.getObservableRepositoryIds( "user" ), selectedRepos );
359         
360         searchControl.expectAndReturn( search.search( "user", searchFields, limits ), results );
361         
362         searchControl.replay();
363         userReposControl.replay();
364
365         action.setPrincipal( "user" );
366         String result = action.filteredSearch();
367         
368         assertEquals( Action.SUCCESS, result );
369         assertEquals( 1, action.getTotalPages() );
370         assertEquals( 1, action.getResults().getTotalHits() );
371         
372         searchControl.verify();
373         userReposControl.verify();
374     }
375         
376     public void testAdvancedSearchNoSearchHits()
377         throws Exception
378     {
379         List<String> managedRepos = new ArrayList<String>();
380         managedRepos.add( "internal" );
381         managedRepos.add( "snapshots" );
382         
383         action.setRepositoryId( "internal" );
384         action.setManagedRepositoryList( managedRepos );
385         action.setCurrentPage( 0 );
386         action.setRowCount( 30 );
387         action.setGroupId( "org" );
388         
389         SearchResultLimits limits = new SearchResultLimits( action.getCurrentPage() );
390         limits.setPageSize( 30 );
391                 
392         SearchResults results = new SearchResults();
393         
394         List<String> selectedRepos = new ArrayList<String>();
395         selectedRepos.add( "internal" );
396         selectedRepos.add( "snapshots" );
397         
398         SearchFields searchFields = new SearchFields( "org", null, null, null, null, selectedRepos );
399         
400         searchControl.expectAndReturn( search.search( "user", searchFields, limits ), results );
401         
402         searchControl.replay();
403         
404         String result = action.filteredSearch();
405         
406         assertEquals( Action.INPUT, result );
407         assertFalse( action.getActionErrors().isEmpty() );
408         assertEquals( "No results found",( String ) action.getActionErrors().iterator().next() );
409         
410         searchControl.verify();
411     }
412     
413     public void testAdvancedSearchUserHasNoAccessToAnyRepository()
414         throws Exception
415     {
416         List<String> managedRepos = new ArrayList<String>();
417         
418         action.setGroupId( "org.apache.archiva" );
419         action.setManagedRepositoryList( managedRepos );
420         
421         String result = action.filteredSearch();
422         
423         assertEquals( GlobalResults.ACCESS_TO_NO_REPOS, result );
424     }
425     
426     public void testAdvancedSearchNoSpecifiedCriteria()
427         throws Exception
428     {
429         List<String> managedRepos = new ArrayList<String>();
430         
431         action.setManagedRepositoryList( managedRepos );
432         
433         String result = action.filteredSearch();
434         
435         assertEquals( Action.INPUT, result );
436         assertFalse( action.getActionErrors().isEmpty() );
437         assertEquals( "Advanced Search - At least one search criteria must be provided.",
438                       (String) action.getActionErrors().iterator().next() );
439     }
440     
441     // find artifact..
442     
443     public void testFindArtifactWithOneHit()
444         throws Exception
445     {
446         action.setQ( "afbcdeaadbcffceabbba1" );
447         
448         List<ArchivaArtifact> dbResults = new ArrayList<ArchivaArtifact>();
449         dbResults.add( new ArchivaArtifact( "org.apache.archiva", "archiva-configuration", "1.0",
450                                            null, "jar", "test-repo" ) );
451         
452         daoControl.expectAndReturn( dao.getArtifactDAO(), artifactDao );
453         
454         artifactDaoControl.expectAndReturn( artifactDao.queryArtifacts( new ArtifactsByChecksumConstraint( action.getQ() ) ), dbResults );
455         
456         daoControl.replay();
457         artifactDaoControl.replay();
458         
459         String result = action.findArtifact();
460         assertEquals( "artifact", result );
461         assertFalse( action.getDatabaseResults().isEmpty() );
462         assertEquals( 1, action.getDatabaseResults().size() );
463         
464         daoControl.verify();
465         artifactDaoControl.verify();
466     }
467         
468     public void testFindArtifactWithMultipleHits()
469         throws Exception
470     {
471         action.setQ( "afbcdeaadbcffceabbba1" );
472         
473         List<ArchivaArtifact> dbResults = new ArrayList<ArchivaArtifact>();
474         dbResults.add( new ArchivaArtifact( "org.apache.archiva", "archiva-configuration", "1.0",
475                                            null, "jar", "test-repo" ) );
476         dbResults.add( new ArchivaArtifact( "org.apache.archiva", "archiva-indexer", "1.0",
477                                             null, "jar", "test-repo" ) );
478         
479         daoControl.expectAndReturn( dao.getArtifactDAO(), artifactDao );
480         
481         artifactDaoControl.expectAndReturn( artifactDao.queryArtifacts( new ArtifactsByChecksumConstraint( action.getQ() ) ), dbResults );
482         
483         daoControl.replay();
484         artifactDaoControl.replay();
485         
486         String result = action.findArtifact();
487         assertEquals( "results", result );
488         assertFalse( action.getDatabaseResults().isEmpty() );
489         assertEquals( 2, action.getDatabaseResults().size() );
490         
491         daoControl.verify();
492         artifactDaoControl.verify();
493     }
494     
495     public void testFindArtifactNoChecksumSpecified()
496         throws Exception
497     {
498         String result = action.findArtifact();
499         
500         assertEquals( Action.INPUT, result );
501         assertFalse( action.getActionErrors().isEmpty() );
502         assertEquals( "Unable to search for a blank checksum", ( String ) action.getActionErrors().iterator().next() );
503     }
504     
505     public void testFindArtifactNoResults()
506         throws Exception
507     {
508         action.setQ( "afbcdeaadbcffceabbba1" );
509         
510         List<ArchivaArtifact> dbResults = new ArrayList<ArchivaArtifact>();
511         
512         daoControl.expectAndReturn( dao.getArtifactDAO(), artifactDao );
513         
514         artifactDaoControl.expectAndReturn( artifactDao.queryArtifacts( new ArtifactsByChecksumConstraint( action.getQ() ) ), dbResults );
515         
516         daoControl.replay();
517         artifactDaoControl.replay();
518         
519         String result = action.findArtifact();
520         assertEquals( Action.INPUT, result );
521         assertFalse( action.getActionErrors().isEmpty() );
522         assertEquals( "No results found", ( String )action.getActionErrors().iterator().next() );
523         
524         daoControl.verify();
525         artifactDaoControl.verify();
526     }
527 }