/* * Copyright 2006 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.server.utests; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import ome.model.IObject; import ome.model.annotations.TagAnnotation; import ome.model.core.Image; import ome.services.SearchBean; import ome.services.fulltext.FullTextAnalyzer; import ome.services.search.SearchAction; import ome.services.search.SearchValues; import ome.services.util.Executor; import ome.system.Principal; import ome.system.ServiceFactory; import org.apache.lucene.analysis.Analyzer; import org.hibernate.Session; import org.jmock.MockObjectTestCase; import org.testng.annotations.Test; public class SearchBeanTest extends MockObjectTestCase { protected Class<? extends Analyzer> analyzer = FullTextAnalyzer.class; protected Executor executor = new Executor.Impl(null, null, null, null) { @Override public Object execute(Principal p, Work work) { return work.doWork(null, null); } }; protected SearchBean bean; @Test public void testDefaults() { bean = new SearchBean(executor, analyzer); assertDefaults(); } void assertDefaults() { assertTrue(bean.activeQueries() == 0); assertTrue(bean.getBatchSize() == bean.DEFAULT_BATCH_SIZE); assertTrue(bean.isCaseSensitive() == bean.DEFAULT_CASE_SENSITIVTY); assertTrue(bean.isMergedBatches() == bean.DEFAULT_MERGED_BATCHES); assertTrue(bean.isReturnUnloaded() == bean.DEFAULT_RETURN_UNLOADED); assertTrue(bean.isUseProjections() == bean.DEFAULT_USE_PROJECTIONS); } @Test public void testBasicUsage() { bean = new SearchBean(executor, analyzer); bean.onlyType(Image.class); bean.onlyAnnotatedWith(TagAnnotation.class); bean.byFullText("Here's my query"); } @Test public void testHasNextWithResults() { bean = new SearchBean(executor, analyzer); assertFalse(bean.hasNext()); List<IObject> list = new ArrayList<IObject>(); list.add(new Image()); bean.addResult(list); assertTrue(bean.hasNext()); } @Test public void testHasNextWithAction() { bean = new SearchBean(executor, analyzer); assertFalse(bean.hasNext()); addActionWithResultOfSize_n(1); assertTrue(bean.hasNext()); } @Test public void testActiveQueries() { bean = new SearchBean(executor, analyzer); addActionWithResultOfSize_n(1); assertTrue(bean.activeQueries() == 1); assertNotNull(bean.next()); assertFalse(bean.hasNext()); assertTrue(bean.activeQueries() == 0); } @Test public void testBatchSizeRollOver() { bean = new SearchBean(executor, analyzer); addActionWithResultOfSize_n(4); bean.setBatchSize(3); assertEquals(3, bean.getBatchSize()); assertEquals(3, bean.results().size()); assertEquals(1, bean.results().size()); } @Test public void testMergedBatches() { bean = new SearchBean(executor, analyzer); addActionWithResultOfSize_n(3); addActionWithResultOfSize_n(1); bean.setBatchSize(5); assertEquals(4, bean.results().size()); } @Test public void testUnloaded() { bean = new SearchBean(executor, analyzer); addActionWithResultOfSize_n(1); bean.setReturnUnloaded(true); IObject i = bean.next(); assertFalse(i.isLoaded()); } @Test public void testResetDefaults() { bean = new SearchBean(executor, analyzer); bean.setBatchSize(4); bean.setCaseSentivice(false); bean.setMergedBatches(true); bean.setReturnUnloaded(true); // Disallowed bean.setUseProjections(true); bean.resetDefaults(); assertDefaults(); } @Test public void testClearingQueries() { bean = new SearchBean(executor, analyzer); bean.onlyType(Image.class); bean.byFullText("a"); assertTrue(bean.activeQueries() == 1); bean.clearQueries(); assertTrue(bean.activeQueries() == 0); // Now add results directly and see if they // get cleared assertFalse(bean.hasNext()); bean.addResult(Arrays.<IObject> asList(new Image())); assertTrue(bean.hasNext()); bean.byHqlQuery("a", null); assertTrue(bean.hasNext()); assertTrue(bean.activeQueries() == 1); bean.clearQueries(); assertTrue(bean.activeQueries() == 0); assertTrue(bean.hasNext()); // Still here. } @Test public void testCanSearchForObjectsWhichArentAnnotated() { bean = new SearchBean(executor, analyzer); bean.onlyAnnotatedWith((java.lang.Class[]) null); } // ============================================== private void addActionWithResultOfSize_n(final int n) { bean.addAction(new SearchAction(new SearchValues()) { public Object doWork(Session session, ServiceFactory sf) { List<IObject> rv = new ArrayList<IObject>(); for (int i = 0; i < n; i++) { rv.add(new Image()); } return rv; } }); } }