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