package com.manning.hsia.dvdstore.test;
import java.lang.reflect.Proxy;
import java.math.BigDecimal;
import java.util.List;
import org.hibernate.FetchMode;
import org.hibernate.Transaction;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.testng.annotations.Test;
import com.manning.hsia.dvdstore.action.DistributorAction;
import com.manning.hsia.dvdstore.action.DistributorActionImpl;
import com.manning.hsia.dvdstore.action.ItemRetrievalAction;
import com.manning.hsia.dvdstore.action.ItemRetrievalActionImpl;
import com.manning.hsia.dvdstore.model.Distributor;
import com.manning.hsia.dvdstore.model.Item;
import com.manning.hsia.dvdstore.util.SessionInvocationHandler;
import com.manning.hsia.dvdstore.util.TestCase;
public class ItemRetrievalActionTest extends TestCase {
@Test(groups="ch08")
public void testIdentity() {
ItemRetrievalAction action = getItemRetrievalAction();
List<Item> results = action.searchItemWithinDistributor("season", getDistributor() );
assert 9 == results.size() : "Found " + results.size();
}
@Test(groups="ch08")
public void testSecurity() {
ItemRetrievalAction action = getItemRetrievalAction();
searchFor(action, "toy");
searchFor(action, "season");
}
private void searchFor(ItemRetrievalAction action, String searchString) {
List<Item> resultsWhenChild = action.searchItems(searchString, true );
List<Item> resultsWhenAdult = action.searchItems(searchString, false );
assert resultsWhenChild.size() > resultsWhenAdult.size() :
"Found child " + resultsWhenChild.size() + " : adult " + resultsWhenAdult.size();
System.out.println( searchString + " child " + resultsWhenChild.size() + " adult " + resultsWhenAdult.size() );
assert resultsWhenChild.size() > 0;
assert resultsWhenAdult.size() > 0;
}
@Test(groups="ch08")
public void testRangeFilter() {
ItemRetrievalAction action = getItemRetrievalAction();
List<Item> results = action.searchItemsLowPrice("funny");
assert 17 == results.size() : "Found " + results.size();
final BigDecimal bigDecimal = new BigDecimal(15);
for (Item item : results) {
assert item.getPrice().compareTo( bigDecimal ) <= 0;
}
}
@Test(groups="ch08")
public void testSearchWithinSearch() {
ItemRetrievalAction action = getItemRetrievalAction();
List<Item> results = action.searchItems("season");
assert 28 == results.size() : "Found " + results.size();
results = action.searchWithinSearch("friends");
int subsearch = results.size();
assert 9 == subsearch : "Found " + results.size();
assert subsearch < action.searchItems("friends").size();
}
@Test(groups="ch08")
public void testSearchWithinStock() {
ItemRetrievalAction action = getItemRetrievalAction();
List<Item> results = action.searchWithinStock("lady");
assert 8 == results.size() : "Found " + results.size();
for (Item item : results) {
assert !"630522577X".equals( item.getEan() );
}
}
public Distributor getDistributor() {
DistributorAction distAction = getDistributorAction();
return distAction.getDistributors().get(0);
}
private DistributorAction getDistributorAction() {
DistributorAction action = new DistributorActionImpl();
return (DistributorAction) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[] { DistributorAction.class },
new SessionInvocationHandler(action, factory) );
}
private ItemRetrievalAction getItemRetrievalAction() {
ItemRetrievalAction action = new ItemRetrievalActionImpl();
return (ItemRetrievalAction) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[] { ItemRetrievalAction.class },
new SessionInvocationHandler(action, factory) );
}
@Override
public void postSetUp() throws Exception {
FullTextSession session = Search.getFullTextSession( factory.openSession() );
Transaction tx = null;
try {
tx = session.beginTransaction();
//manual indexing solution OK for small amounts of data
List results = session.createCriteria( Item.class )
.setFetchMode("categories", FetchMode.JOIN)
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
.list();
for (Object entity : results) {
session.index( entity ); //index each element
}
//commit the index changes
tx.commit();
}
finally {
session.close();
}
}
}