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