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