package com.manning.hsia.dvdstore.test;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.search.Query;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.SearchFactory;
import org.testng.annotations.Test;
import com.manning.hsia.dvdstore.action.SearchingAction;
import com.manning.hsia.dvdstore.action.SearchingActionImpl;
import com.manning.hsia.dvdstore.model.Item;
import com.manning.hsia.dvdstore.util.SessionHolder;
import static org.easymock.EasyMock.*; //static imports make EasyMock easier
/**
* Example 9.17
*/
public class HibernateSearchUnitTest {
@Test(groups="hibernatesearch")
public void testSearch() throws Exception {
SearchingAction action = new SearchingActionImpl(); //create tested service
FullTextQuery query = createMock( FullTextQuery.class ); //create mock for each object used
FullTextSession session = createMock( FullTextSession.class );
SearchFactory factory = createMock( SearchFactory.class );
expect( session.getSearchFactory() ) //define expected calls
.andReturn( factory );
expect( factory.getAnalyzer( Item.class ) )
.andReturn( new StandardAnalyzer() ); //and return results
expect( session.createFullTextQuery(
isA( Query.class ),
eq( Item.class ) ) //potentially restrict parameters
).andReturn( query );
expect( query.setProjection( "title" ) ).andReturn( query ); //should call projection and return self
List<Object[]> results = new ArrayList<Object[]>(); //build query results
results.add( new Object[] {"The incredibles"} );
expect( query.list() ).andReturn( results ); //associates it to query execution
SessionHolder.setFullTextSession( session ); //pass mock objects to the service
replay( factory ); //prepare mocks for listening
replay( query );
replay( session );
List<String> titles = action.getTitleFromMatchingItems( "title:incredibles" ); //service executed using mocks
assert 1 == titles.size() : "should have two matches, not " + titles.size(); //check results based on mocks
assert "The incredibles".equals( titles.get(0) ) : "The incredibles";
}
}